Sunteți pe pagina 1din 9

Backtracking

18 MARTIE 2014

Backtracking
Backtracking este o metod de parcurgere sistematic a spaiului soluiilor posibile al unei probleme. Este o metod general de programare, i poate fi adapt pentru orice problem pentru care dorim s obinem toate soluiile posibile, sau s selectm o soluie optim, din mulimea soluiilor posibile. Backtracking este ns i cea mai costisitoare metod din punct de vedere al timpului de execuie.

Etapele
1.Fiecare pas k pornete de la o soluie parial v=( v1,v2,v3,...,vk-1) determinat pn n acel moment i ncercm s extindem aceast soluie adugnd un nou element la sfritul vectorului. 2. Cutm n mulimea Sk , un nou element. 3. Dac exist un element neselectat nc, verificm dac acest element ndeplinete condiiile impuse de problem, numite condiii de continuare. 4. Dac sunt respectate condiiile de continuare, adugm elementul soluiei pariale. 5. Verificm dac am obinut o soluie complet * dac am obinut o soluie complet o afim i se reia algoritmul de la pasul 1. *dac nu am obinut o soluie, k <----- k+1 si se reia algoritmul de la pasul 1. 6. Dac nu sunt respectate condiiile de continuare se reia algoritmul de la pasul 2. 7. Dac nu mai exist nici un element neverificat n mulimea Sk nseamn c nu mai avem nici o posibilitate din acest moment, s construim soluia final aa c trebuie s modificm alegerile fcute n prealabil, astfel k <----- k-1 i se reia problema de la pasul 1.

SUBPROGRAMUL BACKTRACKING void BT(int k) //k-poziia din vector care se completeaz {int i; for (i=1; i<=nr_elemente_Sk; i++) //parcurge elementele mulimii Sk { v[k]=i; //selecteaz un element din mulime if (validare(k)) //valideaz condiiile de continuare ale problemei { if (solutie(k)) //verific dac s-a obinut o soluie afisare(k); //afieaz soluia else BT(k+1); //reapeleaz functia pentru poziia k+1 } } //dac nu mai exist nici un element neselectat n mulimea Sk, } //se nchide nivelul de stiv i astfel se revine pe poziia k-1 a //vectorului //execuia funciei se ncheie, dup ce s-au nchis toate nivelurile stivei, nseamn c n vectorul v nu mai poate fi selectat nici un elemente din multimile Sk

PERMUTA RI

int main() {cout<<"n= ";cin>>n; //se citeste n BT(1); return 0; //apelam functia BT pentru completarea pozitiei }

1din vectorul v

PERMUTA RI void BT(int k)


{int i; //i-elementul selectat din multimea Sk, trebuie sa fie variabila locala, pentru // a se memora pe stiva for (i=1;i<=n;i++) //parcurgem elementele multimii Sk {v[k]=i; //selectam un element din multimea Sk if (validare(k)) verificam daca elementul ales ndeplineste conditile de continuare {if (solutie(k)) //verificam daca am obtinut o solutie afisare(k); //se afiseaza solutia obtinuta else BT(k+1); //reapelam functia pentru pozitia k+1 din vectorul v
}

} }

PERMUTA RI
int validare(int k) //verificam conditiile de continuare {int i; for (i=1;i<=k-1;i++) //comparam fiecare element din vectorul v cu ultimul element
selectat

if (v[i]==v[k]) return 0;
data

//deoarece ntr-o permutare elementele nu au voie sa se repete, //returnam 0 n cazul n care elementul selectat, a mai fost selectat o //returnam 1 n cazul n care elementul nu mai apare n vector

return 1;
}

PERMUTA RI

int solutie(int k) //verificam daca am obtinut o solutie {if (k==n) //am obtinut o permutare, daca am reusit sa depunem n vector n elemente return 1; return 0; }

PERMUTA RI

void afisare(int k) {int i; for (i=1;i<=k;i++) cout<<v[i]<<" "; cout<<endl;}

//afiseaza continutul vectorului v