Sunteți pe pagina 1din 1

Backtracking este denumirea unui algoritm de cutare a tuturor soluiilor unei probleme de calcul, ce utilizeaz generarea incremental a soluiilor

poteniale (soluii candidat) i abandonarea soluiilor poteniale pariale de ndat ce este clar c acestea nu au anse s devin soluii valide. Algoritmul se poate aplica doar pentru problemele ce admit conceptul de candidat parial de soluie. Pentru problemele n care se poate aplica acest algoritm, rezolvarea este mult mai rapid folosind aceast metod dect cutarea prin metoda forei brute prin toi candidaii. Un exemplu clasic de problem rezolvabil prin backtracking este gsirea tuturor variantelor de dispunere a opt regine pe o tabl de ah astfel nct s nu se atace una pe cealalt. Orice soluie parial 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 eficiena sunt cuvintele ncruciate, sudoku i alte probleme asemntoare de satisfacere a constrngerilor. Algoritmul genereaz un set de candidai pariali care, n principiu, pot fi completai n diverse moduri pentru a defini soluiile posibile la problema dat. Completarea se face incremental. Ne putem imagina candidaii pariali ca fiind ramurile (nodurile) unui arbore cu soluii poteniale. Frunzele acestui arbore sunt candidaii pariali ce nu mai pot fi extini (completai). Algoritmul traverseaz recursiv acest arbore, pornind de la rdcin, i pentru fiecare nod (ramur) se verific dac acesta poate fi completat (extins) pentru a obine o soluie valid. Dac acest lucru nu este posibil, ntreaga ramur cu toate subramurile sale este eliminat. Altfel, algoritmul verific dac ramura este o soluie 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 furnizm datele P pentru cazul particular al problemei de rezolvat i ase subrutine parametrizate: root(P): ntoarce candidatul parial din rdcina arborelui de cutare reject(P, c): ntoarce adevrat doar n situaia n care candidatul parial c nu merit a fi completat accept(P, c): ntoarce adevrat dac c este o soluie a lui P i fals n caz contrar first(P, c): genereaz primul candidat parial (extensie) derivat din c next(P, s): genereaz urmtorul candidat parial dup extensia s output(P, c): folosete soluia c pentru P, ca fiind o soluie valid Cu aceste ase subrutine, algoritmul backtracking se reduce la apelul funciei 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;