Sunteți pe pagina 1din 1

Backtracking este denumirea unui algoritm de căutare a tuturor soluțiilor unei probleme de calcul, ce utilizează generarea incrementală a soluțiilor potențiale (soluții candidat) și abandonarea soluțiilor potențiale parțiale de îndată ce este clar că acestea nu au șanse să devină soluții valide.

Algoritmul se poate aplica doar pentru problemele ce admit conceptul de „candidat parțial de soluție”. Pentru problemele în care se poate aplica acest algoritm, rezolvarea este mult mai rapidă folosind această metodă decât căutarea prin metoda forței brute prin toți candidații.

Un exemplu „clasic” de problemă rezolvabilă prin backtracking este găsirea tuturor variantelor de dispunere a opt regine pe o tablă de șah astfel încât să nu se atace una pe cealaltă. Orice soluție parțială în care două regine se atacă una pe cealaltă poate fi eliminată deoarece nu reprezintă o posibilă variantă validă. Alte exemple în care backtracking-ul își demonstrează eficiența sunt cuvintele încrucișate, sudoku și alte probleme asemănătoare de satisfacere a constrângerilor.

Algoritmul generează un set de candidați parțiali care, în principiu, pot fi completați în diverse moduri pentru a defini soluțiile posibile la problema dată. Completarea se face incremental. Ne putem imagina candidații parțiali ca fiind ramurile (nodurile) unui arbore cu soluții potențiale. Frunzele acestui arbore sunt candidații parțiali ce nu mai pot fi extinși (completați). Algoritmul traversează recursiv acest arbore, pornind de la rădăcină, și pentru fiecare nod (ramură) se verifică dacă acesta poate fi completată (extinsă) pentru a obține o soluție validă. Dacă acest lucru nu este posibil, întreaga ramură cu toate subramurile sale este eliminată. Altfel, algoritmul verifică dacă ramura este o soluție validă și dacă da este raportată ca atare utilizatorului, iar dacă nu, vor fi enumerate recursiv toate subramurile (extensiile) acesteia.

Pentru a aplica backtracking-ul, trebuie să furnizăm datele P pentru cazul particular al problemei de rezolvat și șase subrutine parametrizate:

root(P): întoarce candidatul parțial din rădăcina arborelui de căutare reject(P, c): întoarce adevărat doar în situația în care candidatul parțial c nu merită a fi completat accept(P, c): întoarce adevărat dacă c este o soluție a lui P și fals în caz contrar first(P, c): generează primul candidat parțial (extensie) derivat din c next(P, s): generează următorul candidat parțial după extensia s output(P, c): folosește soluția c pentru P, ca fiind o soluție validă

Cu aceste șase subrutine, algoritmul backtracking se reduce la apelul funcției recursive backtrack(root(P)) care arată astfel:

procedure backtrack(c) if reject(P, c) then return; if accept(P c) then output(P, c); s first(P, c); while s ≠ Null backtrack(s); s <- next(P, s); repeat;