Sunteți pe pagina 1din 2

Metoda BACKTRACKING

Este o tehnic de programare aplicabil algoritmilor care ofer mai multe soluii i
are ca rezultat obinerea tuturor soluiilor problemei. Fiecare soluie se memoreaz ntr-o
structura de date de tip stiv implementat cu ajutorul unui vector. Deci fiecare soluie
poate fi pus sub forma unui vector.
ntr-un algoritm backtracking ne intereseaz toate soluiile posibile. Pentru a obine
fiecare soluie final se completeaz stiva nivel cu nivel trecnd astfel prin soluii
pariale. Astfel soluiile finale ct i cele pariale pentru a fi luate n considerare trebuie s
ndeplineasc anumite condiii numite condiii de validare. O soluie care ndeplinete o
astfel de condiie se numete soluie valid.
Toate configuraiile stivei ce reprezint soluii finale sunt alctuite din elementele
aceleiai mulimi bine definite pe care o numim mulimea soluiilor. Fiecare nou soluie
parial se obine prin completarea soluiei pariale precedente cu nc o nivel pe stiv. La
fiecare nivel se pun valori din mulimea soluiilor care nu au fost ncercate pn cnd se
obine o soluie valid. n acest moment se trece la nivelul urmtor n stiv pentru a
completa mai departe soluia relund ncercrile pe noul nivel.
La un moment dat pe un anumit nivel nu mai exist nici o valoare nencercat din
mulimea valorilor problemei. n acest caz se face un pas napoi n stiv la nivelul anterior
i se reia cutarea cu valorile rmase nencercate pe acest nivel anterior.
Respectivul nivel a mai fost vizitat dar l-am abandonat dup ce am pus o valoare care
a generat o soluie valid. Deci este posibil s fi rmas aici valori nencercate. Dac nici pe
acest nivel nu mai avem valori nencercate mai facem un pas napoi n stiv. Mecanismul
revenirilor a determinat denumirea de metoda backtracking.
Plecnd de la nivelul 1 i repetnd algoritmul pn cnd pe toate nivelele au fost
ncercate toate valorile din mulimea valorilor se obin soluii finale care se tipresc.
Vom implementa metoda backtracking iterativ folosind o rutin unic aplicabil
oricrei probleme. Rutina va apela funcii care au ntotdeauna acelai nume i care din
punct de vedere al metodei realizeaz acelai lucru.
Sarcina rezolvatorului este s scrie explicit - pentru fiecare problem funciile
aplicate de rutin:
1. Fiecare nivel al stivei trebuie iniializat cu o valoare aflat naintea tuturor valorilor
posibile din mulimea soluiilor. Aceast afiare se face cu funcia init().
2. Gsirea urmtorului element netestat de pe un nivel k al stivei St se face cu funcia
1, dac exist valoare netestat pentru nivelul k
. Dac exist valoare netestat
0, altfel

succesor ()

(succesor), atunci se va alege o nou valoare (netestat) pentru nivelul k.


3. Odat ales un element testarea condiiilor de validare se face cu funcia
1, dac valoarea de pe nivelul k ndeplinete condiondide validare
0, altfel

valid()

4. Testul dac s-a ajuns sau nu la o soluie final se face cu funcia


1, dac s - a completat ultimul nivel din stiv
0, altfel

soluie ()

5. Soluia se tiprete cu funcia tipar().

Rutina Backtracking ITERATIV


k=1;
//se completeaz stiva ncepnd cu primul nivel
init ();
//se iniializeaz primul nivel al stivei
while (k>0)
{
do{AS= succesor(); }while (AS && valid()==0);
//se caut succesor pe nivelul k atta timp ct exist
succesor care nu este valid
if (AS)
//exist succesor
if solutie() //dac s-a completat stiva
tipar()
//se tiprete soluia
else //stiva nu s-a completat
{
k++; // se trece pe nivelul urmtor
init(); // se iniializeaz noul nivel
}
else k--; // nu exist succesor pentru nivelul k,
deci se coboar un nivel n stiv
}

Probleme propuse
1. Generarea permutrilor
2. Generarea aranjamentelor
3. Generarea combinrilor
4. Generarea tuturor submulimilor
5. Generarea tuturor partiiilor unei mulimi
6. Generarea produsului cartezian al n mulimi
7. Problema celor n dame
8. Problema labirintului
9. Problema colorrii hrilor
10. Problema comis-voiajorului

S-ar putea să vă placă și