Sunteți pe pagina 1din 3

Tehnica backtracking

Backtracking s-ar putea traduce drum napoi, cale ntoars sau revenire ceea ce sugereaz faptul c orice vector soluie este construit progresiv, ncepnd cu prima component i mergnd spre ultima, cu eventuale reveniri asupra valorilor atribuite anterior (revenire care presupune un pas sau chiar mai muli pai napoi). Pentru rezolvarea problemelor utiliznd aceast metod vom folosi noiunea de stiv.
Stiva este acea form de organizare a datelor (structur de date) cu proprietatea c operaiile de introducere i extragere a datelor se fac la un singur capt, respectiv n vrful ei.

Aceast metod se folosete n rezolvarea problemelor care ndeplinesc simultan urmtoarele condiii: soluia poate fi pus sub forma unui vector; X=x1 x2 xn, cu x1 A1 , x2 A2 ,, xn An ; Mulimile A1, A2,, An sunt mulimi finite, elementele lor fiind ntr-o relaie de ordine bine stabilit, de obicei reprezentnd termenii unei progresii aritmetice; mulimile Ai pot fi distincte sau nu; Cer gsirea unei soluii x1, x2,, xn care optimizeaz o funcie criteriu P(x1,x2,,xn); Nu se dispune de o alt metod mai rapid de rezolvare. Acest ultim condiie este necesar a fi respectat, cunoscut fiind timpul mare de execuie al algoritmilor ce se bazeaz pe aceast metod.

Metoda poate fi implementat iterativ i recursiv. n continuare prezentm varianta iterativ. Tehnica Backtracking are la baz urmtorul principiu: Se construiete soluia pas cu pas: x1, x2,, xn; Dac se constat c, pentru o valoare aleas, nu avem cum s ajungem la soluie, se renun la acea valoare i se reia cutarea din punctul n care am rmas; Pentru fiecare problem dat se pun n eviden nite condiii interne pe care trebuie s le ndeplineasc componentele x1, x2, , xn; n-uplele x1, x2,, xn care satisfac condiiile interne se numesc soluii posibile. Dac s-au determinat componentele x1, x2, , xk-1 ale unei soluii pariale, un element xk Ak nu este ataat imediat soluiei, ci se verific mai nti dac el satisface anumite condiii de continuitate. Dac ele nu sunt satisfcute, atunci xk nu este adugat soluiei, ncercnd alt element xk Ak , dac exist. Dac Ak s-a epuizat, atunci se revine la elementul xk-1 pentru care se caut alt valoare din Ak-1, dac exist;

Soluiile posibile care satisfac condiiile de continuare se numesc soluii rezultat; Construirea unei soluii se face pe mai muli pai, rezultnd c elementele vectorului X primesc valori pe rnd: lui xk i atribuim o valoare din Ak numai dup ce x1,,xk-1 au primit valori. Dup ce xk a primit o valoare, se verific condiiile de continuitate referitoare la x1,,xk i numai dac acestea au dat rspuns afirmativ se trece la atribuirea unei valori pentru xk+1 din Ak+1.

Nendeplinirea condiiilor de continuitate exprim faptul c oricum s-ar alege xk+1,,xn nu se va ajunge la o soluie rezultat. Condiiile de continuitate sunt absolut necesare. n cazul nendeplinirii condiiilor de continuitatre pentru xk, se face o nou alegere pentru xk din Ak (dac mai exist elemente n Ak). Dac aceasta a fost epuizat, se micoreaz k cu o unitate (se coboar n siv) deci urmeaz s alegem o nou valoare pentru xk-1 din spaiul Ak-1. Micorarea lui k d numele metodei i semnific faptul c atunci cnd nu putem avansa, vom urmri napoi secvena curent din soluie;

Intereseaz s se determine soluiile rezultat fie pentru a le lista, fie pentru a le alege pe acelea care optimizeaz funcia criteriu P dat. Metoda backtracking const n urmtoarele: 1. se alege primul element x1 A1 ; 2. presupunnd generate elementele x1,,xk ale mulimilor A1, A2,, Ak , se alege (dac exist) xk+1 , primul element disponibil din mulimea Ak+1 , aprnd 2 situaii: a. nu s-a gsit un astfel de element, caz n care se reia cutarea considernd generate elementele x1,,xk-1 , lund urmtorul element al mulimii Ak , rmas netestat b. a fost gsit, caz n care se testeaz dac acesta ndeplinete condiiile de continiutate, aprnd 2 posibiti: b1. le ndeplinete, caz n care se testeaz dac s-a ajuns la soluie i apar din nou 2 situaii: b11. s-a ajuns la soluie, se tiprete soluia i se reia algoritmul considernd generate elementele x1,,xk (se caut n continuare un element al mulimii Ak+1 rmas netestat) b12. nu s-a ajuns la soluie, caz n care se reia algortimul considernd generate elementele x1,,xk+1 i se caut un element xk+2 A k + 2 ; b2. nu le ndeplinete, caz n care se reia algoritmul considernd generate elementele x1,,xk, iar elementul xk+1 se caut ntre elementele mulimii Ak+1 rmase netestate. 3. algoritmul se ncheie cnd au fost luate n considerare toate elementele mulimii A1. Pentru rezolvarea problemelor cu metoda backtracking se utilizeaz o stiv n care la fiecare nivel k se afl un element xk din mulimea Ak i urmtoarele funcii: - funcia void Init(); - la urcarea n stiv, pe nivelul la care s-a ajuns pe pune o valoare care nu se afl n mulimea considerat, dar de la care, la pasul urmtor, se ajunge la primul element din acea mulime 2

- funcia int Am_Succesot(); - pe un anumit nivel gsirea elementului urmtor celui considerat, element netestat; funcia returneaz 1, dac exist succesor acesta fiind pus n stiv i 0 n caz contrar - funcia int Valid(); - verific dac elementul ales ndeplinete sau nu condiiile de continuitate ale problemei, ea returneaz 1 dac le ndeplinete i 0 n caz contrar. - funcia int Solutie(); - testeaz dac s-a ajuns sau nu la soluia final, returnnd 1, respectiv 0. - funcia void Tipar(); - tiprete soluia. Cu aceste notaii rutina backtracking este urmtoarea: void back() { int As; k=1; Init(); while (k>0) { do { } while ((As=Am_Succesor()) && !Valid()); if (As) if (Solutie()) Tipar(); else { k++; Init(); } else k--; } }

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