Sunteți pe pagina 1din 7

METODE DE PROGRAMARE BACKTRACKING

Numele acestei metode este sugestiv i se traduce prin cutate cu revenire, generarea unei soluii fcndu-se pe baza urmelor precedente( n eng. Backn seamn napoi, iartrack =urm) DESCRIEREA METODEI MetodaBacktracking se utilizeaz pentru rezolvarea unor probleme n care: Se obin mai multe soluii Soluia este format din unul sau mai multe elemente, fiind reprezentat printr -un tablou X=(x1, x2,....,xn) unde x1 A1, x2 A2, ... , xn An Mulimile A1,A2, ... , An sunt finite avnd c1, c2, ,cnelemente Elementeletabloului X ndeplinescanumitecondiiiimpuse de enunulfiecreiprobleme

MetodaBacktracking are la baz o strategie prin care se genereaz doar soluiile care ndeplinesc condiiile specifice problemei, denumite condiii interne. Soluiile posibile care respect condiiile interne se numesc soluii rezultat. Ex.. MECANISMUL METODEIBacktracking Soluiile problemei sunt generate ntr-un tablou X Pas1 : Se alege primul element al soluiei, elementul x1 A1 Pas2 : Ct timp nu au fost parcurse toate elementele mulimii A1(nu au fost gsite toate soluiile) execut: Pas3 : Pentru fiecare element al soluiei execut: Pas4 : se presupune c s-au gsit primele k elemente ale soluiei x1 A1, x2 A2, ... , xk Ak i se caut prima valoarecandidatla construireasoluiei xk+1 Ak+1, cutare ce const n atribuirea lui xk+1 , pernd, elementelemulimii Ak+1, pnce se gseteprimul element care ndeplinetecondiiacontinuare. Pas5 :dacexist un element ainmulimeaAk+1astfelnctxk+1=aisaparinsoluieiproblemei, atunci se atribuieelementuluixk+1valoareaaii se trece la Pasul7, altfel se trece la Pasul6

Pas6 :Deoarece s-a parcurstoateelementelemulimiiAk+1i nu s-a gsitnici un element aicare sndeplineasccodiia de continuare, se revine la elementulxki se consider generate primele k-1 elemente ale soluieix1, x2,....,xk-1 ipentruxk se reiacutarea cu urmtorul element din mulimeaAk, adicoperaiile de la Pasul4 Pas7 :Se verificdac s-a gsitsoluiaproblemei, dac da atunci se afieaz, altfel se trece la cutareaurmtorului element al soluiei, relundu-se operaiile de la Pasul4 REPREZENTAREA ALGORITMULUI N PSEUDOCOD 1. ALGORITMUL BACKTRACKING INTERATIV Algoritmgenerare k 1 x[k] valoareiniial ct timp (k>0) execut sem 0 //variabila sem are rolul de a semnala situaia n care xk respect condiiileinterne ct timp (n mulimea Mk mai sunt valori candidat pentru xk) i (sem=0)execut x[k] x[k]+1 dac (x*k+ are o valoaresolid) atunci sem 1 //valoarearespectcondiiile interne sfritdac sfritcttimp dac (sem=1) atunci dac (k= nr elementecerut) atunci s-a construit o soluiei se tiprelte altfel k k+1 x[k] valoareiniial sfritdac

altfel k k-1

sfritdac sfritcttimp stopalgoritm. 2. ALGORITMUL BACKTRACKING RECURSIV Algoritmgenerare(k) pentrui valoarea initial, valoarea maxima admisibil din mulimeaAkde valoriexecut x[k] i dac(x[k]are o valoarevalid) atunci//valoarearespectcondiiile interne dac(k=nr de elementecerut) atunci s-a construit o soluiei se tiprete altfel generare(k+1) sfritdac sfritpentru stopalgoritm.

ImplementareametodeiBacktracking Date i structuri de date int s[100]; // s=vectorulsolutiei int n, k, ev, as;// n=dimensiuneasolutiei=nr de elemente al solutiei // k=indiceleelementului care se adauga la solutie // as= pentru a stidacapentru elemental xk al solutieimaiexistaunsuccessor; as are valoarea 1 dacamaiexista un successor sivaloarea 0 in cazcontrar // ev=pentru a stidacasuccesorulgasitrespectaconditia de continuare (dacaeste element al solutiei are valoarea 1, altfel are valoarea 0) Subprograme

1. Subprogramulinit() se initializeazaelementele care trebuiesa se adauge la solutie . Initializarea se va face cu o valoare care nu apartinemultimiiAk , caapoi in primul pas al algoritmulsa se atribuie prima valoare din multimeaAk Ex: void int() {s[k]=0;} 2. Subprogramulsuccessor() verificadacamaiexista in multimeaAk un element pentrunivelul k al solutiei( un successor) int successor() {if (s[k]<n) {s[k]++; return 1;} else return 0;} 3. Subprogramulvalid()- verificadacavaloareaatribuitaelementuluixk al solutieiverificaconditia de continuare. int valid() {for (inti=1;i<k;i++) if(s[i]==s[k]) // se verificadacanumarul din pozita k nu maiexista in celelalte k-1 pozitiianterioare= conditia de continuare return 0; return 1; } 4. Subprogramulsolutie() verificadaca s-au obtinuttoateelementelesolutiei intsolutie() {return k==n;} 5. Subprogramultipar() afiseazaelementelesolutiei voidtipar() {for(inti=1;i<=n;i++) cout<<s*i+<< ; cout<<endl;} Subprogram fix: a) Implementareainterativa a subprogrsmului fix voidbt() {k=1; //initializamindiceleprimului element al solutiei cu 1 init();//se initializeazaprimul element al solutiei while(k>0) //cat timpmaiexistaelemente in A1pentruprimulnivel al solutiei {as=1; ev=0; while(as && !ev) //cat timp are successor si nu s-a gasit elemental k al solutiei {as=successor(); // se cautasuccesor if(as) //daca are successor atunci

ev=valid();} if(as) // daca are successor if(solutie()) // daca s-au obtinuttoateelementelesolutiei tipar(); else {k++; //altfel se trece la urmatorulnivel al solutiei; init();} else k--; } } int main(),.. bt(); ..Ex: Calculul permutarilor de n elemente #include<iostream.h>

int n, k, ev, as, s[100]; void init(){ s[k]=0;} int succesor(){ if (s[k]<n) {s[k]=s[k]+1; return 1;} else return 0;} int valid(){ for(int i=1;i<k;i++) if(s[k]==s[i]) return 0; return 1;} int solutie(){return k==n;}

void tipar(){

for(int i=1;i<=n;i++) cout<<s[i]<<" "; cout<<endl;} void bt(){ k=1; init(); while(k>0) {as=1;ev=0; while(as && !ev) { as=succesor(); if(as) ev=valid(); } if(as) if(solutie()) tipar(); else {k++; init();} else k--; } } int main(){ cout<<"n="; cin>>n;

bt(); return 0; }

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