Aceasta tehnica se foloseste in rezolvarea problemelor care indeplinesc simultan
urmatoarele conditii: t4t19ti
· solutia lor poate fi pusa sub forma unui vector S=x1,x2,x3…xn
cu x1IA1,x2IA2,.....,xnIAn;
· multimile A1,A2,A3…An sunt multimi finite ,iar elementele lor
se considera ca se afla intr-o relatie de ordine bine stabilita
· nu se dispune de o alta metoda de rezolvare ,mai rapida.
Observatii:
Ø nu pentru toate problemele n este cunoscut de la inceput;
Ø x1,x2,x3…xn pot fi la randul lor vectori;
Ø in multe probleme multimile A1,A2,A3…An coincid;
La intalnirea unei astfel de probleme, daca nu cunoastem aceasta tehnica,suntem
tentati sa generam toate elementele produsului cartezian A1aA2aA3…aAn
si fiecare element sa fie testat daca este solutie.Rezolvand problema in acest
mod,timpul de executie este atat de mare ,incat poate fi considerat infinit,neavand
nici o valoare practica.
De exemplu,daca dorim sa generam toate permutarile unei multimi finite A,nu
are rost sa generam produsul cartezian A1A2A3…An pentru ca apoi,sa testam,pentru
fiecare element al acestuia,daca este sau nu permutare .
Tehnica Backtracking are la baza un principiu extrem de simplu:
· se construieste solutia pas cu pas:x1x2x3…xn;
· daca se constata ca,pentru o valoare aleasa,nu avem cum sa ajungem
la solutie ,se renunta la acea valoare si se reia cautarea din punctul in care
am ramas
Concret:
· se alege primul element x1 ce apartine lui A1
· presupunand generate elementele x1,x2,x3…xk apartinand multimilor
A1 A 2A3…Ak+1 se alege(daca exista) x,primul element disponibil din multimea
Ak+1,apar astfel 2 posibilitati:
1) nu s-a gasit un astfel de element,caz in care se reia cautarea considerand
generate elementele x1,x2,x3…xk+1 iar aceasta se reia de la urmatorul
element al multimii Ak ramas netestat
2) a fost gasit,caz in care se testeaza daca acesta indeplineste anumite coditii
de continuare ,aparand astfel alte doua posibilitati:
2.1) le indeplineste,caz in care se testeaza daca s-a ajuns la solutie si apar
din nou doua posibilitati
2.1.1) s-a ajuns la solutie ,se tipareste solutia si se reia algoritmul considerand
generate elementele x1,x2,…xk(se cauta in continuare un alt element al
multimii Ak+1 ramas netestat)
2.1.2) nu s-a ajuns la solutie ,caz in care se reia algoritmul considerand generate
elementele x1,x2,x3…xk+1 si se cauta un prim element xk+2 I Ak+2
2.2) nu le indeplineste caz in care se reia algoritmul considerand generate
elementele x1x2 x3…xk iar elementul xk+1 se cauta intre elementele multimii
Ak+1 ramase netestate.
Algoritmul se termina atunci cand nu mai exista nici un element x1IA1 netestat.
Observatie: tehnica Backtracking are ca rezultat obtinerea tuturor solutiilor
problemei.In cazul in care se cere o singura solutie se poate forta oprirea
atunci cand a fost gasita.
Pentru usurarea intelegerii metodei,vom prezenta o rutina unica aplicabila
oricarei probleme,rutina care utilizeaza notiunea de stiva.Rutina va apela proceduri
si functii care au totdeauna acelasi nume si parametri si care din punct de
vedere al metodei realizeaza acelasi lucru.Sarcina rezolvitorului este de a
scrie explicit pentru fiecare problema in parte procedurile si functiile apelate
de Backtraking.Evident,o astfel de abordare conduce la programe lungi.Nimeni
nu ne opreste,ca dupa intelegerea metodei sa scriem programe scurte specifice
fiecarei probleme in parte(de exemplu scurtam substantial textul doar daca renuntam
la utilizarea procedurilor si functiilor)
Prezentam in continuare rutina Backtracking:
k:=1;init(1,st);
while k>0 do begin repeat succesor(as,st,k); if as then valid(ev,st,k); until (not as) or (as and ev ); if as then if solutie(k) then tipar else begin k:=k+1; init(k,st); end else k:=k-1; end;
Observatie:
Problemele rezolvate prin aceasta metoda necesita un timp indelungat.Din acest
motiv,este bine sa utilizam metoda numai atunci cand nu avem la dispozitie un
alt algoritm mai eficient.Cu toate ca exista probleme pentru care nu se pot
elabora alti algoritmi mai eficienti,tehnica Backtracking trebuie aplicata numai
in ultima instanta.