Sunteți pe pagina 1din 2

PREZENTAREA METODEI Metoda backtraking este utilizat pentru rezolvarea acelor probleme care au soluia sub form de tablou.

De asemenea problemele rezolvabile cu aceast metod au avantajul c li se obin toate soluiile. Vom nota cu x vectorul soluie i vom presupune c are n componente. Pentru fiecare component x[k] stabilim urmtoarele: - min = cea mai mic valoare pe care o poate lua x[k]; - max = cea mai mare valoare pe care o poate lua x[k]; - pas = creterea de la o valoare a componentei x[k] la urmtoarea valoare n ordine cresctoare; - = min-pas. Iniial toate componentele vectorului soluie se vor iniializa cu . Construcia soluiei se va realiza progresiv ncepnd cu prima component. S presupunem c suntem la pasul k. n acest caz au fost generate componentele , x [ valori ce verific condiiile de continuare ale problemei. Din acest moment exist dou situaii: 1. se poate alege componenta x[k] i intervin urmtoarele cazuri: a) x[1],x[2],,x[k] verific condiiile de continuare, caz n care se trece la generarea urmtoarei componente x[k+1]; b) x[1],x[2],,x[k] nu verific condiiile de continuare i n acest caz se ncearc gsirea unei noi valori. 2. componenta x[k] nu se poate alege, caz n care se face pasul napoi pentru a gsi o alt valoare pentru x[k-1] dar nu nainte ca x[k] . O soluie a problemei a fost obinut atunci cnd k=n+1, iar dup prelucrarea i afiarea ei se trece la generarea unei alte soluii fcnd pasul napoi. Observatii: 1. Nu toate problemele au condiii de continuare, iar pentru cele care au se utilizeaz funcia valid cu parametrul k, care are rolul de a verifica dac valoarea de pe poziia k poate conduce la o eventual soluie. Problemele care au condiii de continuare sunt acelea cu proprietatea c alegerea unei valori pentru o component a vectorului soluie depinde de cele generate anterior. 2. Pentru prelucrarea soluiei se utilizeaz funcia prel_sol care are rolul de a afia soluia problemei dup ce a fost sau nu prelucrat n prealabil, deoarece nu orice soluie generat poate fi soluie a problemei. Algoritmul iterativ
void back() { declaratii locale //initializare componentelor vectorului soluie cu for(k=1;k<=n;k++) x[k]:= ; //generarea solutiei incepe cu prima componenta k=1; //se repeta generarea solutiilor cat timp k este indice //al componentelor vectorului solutie while (k) //se verifica daca s-a obtinut solutie if (k==n+1) { //se prelucreaza solutia prel_sol(); //se trece la generarea unei alte solutii k--; } else //se verifica daca se poate alege x[k] if (x[k]<=max-pas) { //se alege x[k] x[k]=x[k]+pas;

/* se verifica daca componenta x[k] poate conduce la o eventuala solutie*/ if (valid(k)) //se trece la urmatoarea componenta k=k+1; } else { /*se face componenta x[k] vida si pasul inapoi pentru a genera o alta valoare pentru componenta anterioara*/ x[k] ; k=k-1; } }

Algoritmul recursiv Varianta I


Void back(int k) { declaratii locale if (k==n+1) prel_sol() else for(i=min;i<=max;i++) { x[k]=i; if (valid(k)) back(k+1); } }

Varianta II
void back(int k) { declaratii locale if (k==n+1) prel_sol() else for(i=1;i<=nrk ;i++) { x[k]=val[i]; if (valid(k)) back(k+1) ; } }

Varianta III
void back(int k) { declaratii locale if (k==n+1) prel_sol() else { x[k]=0; while (x[k]<=max-pas) { x[k]=x[k]+pas; if (valid(k)) back(k+1); } } }

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