Sunteți pe pagina 1din 9

Backtracking

Ce este backtracking-ul?
Backtracking este numele
unui algoritm general de descoperire a tuturor
soluiilor unei probleme de calcul, algoritm ce
se bazeaz pe construirea incremental de
soluii-candidat, abandonnd fiecare candidat
parial imediat ce devine clar c acesta nu are
anse s devin o soluie valid.
Termenul backtrack a fost inventat de
matematicianul american D. H. Lehmer n anii
1950.

Exemple n viaa real


Imaginai-v c astzi este ziua vostr i avei
invitai. Aranjai o mas frumoas, apoi v gndii
cum s v aezai invitaii la mas. Ai vrea s tii
toate posibilitile de aezare a invitailor la mas,
dar realizai n acelai timp c trebuie s inei
seama i de preferinele lor. Printre invitai exist
anumite simpatii dar i unele antipatii, de care
dorii neaprat s inei seama, pentru ca
petrecerea s fie o bucurie pentru toi.

S ne gndim cum procedai pentru a


identifica toate posibilitile de a plasa invitaii
la mas. ncepei prin a scrie nite cartonae cu
numele invitailor. Alegei un invitat. Pentru al alege pe al doilea, selectai din mulimea
cartonaelor rmase un alt invitat. Dac tii c
cele dou persoane nu se agreeaz, renuntai la
cartonaul lui i alegei altul i aa mai
departe.

Se poate ntmpla ca la un moment dat,


cnd vrei s alegei cartonaul unui invitat s
constatai c nici unul dintre invitaii rmai nu
se potrivete cu ultima persoan slectat pn
acum. Cum procedai? Schimbai ultimul
invitat plasat cu un invitat dintre cei rmai i
ncercai din nou, dac nici aa nu reuiti,
schimbai penultimul invitat cu alcineva i
ncercai din nou i aa mai departe pn cnd
reuii s plasati toi invitaii. nseamn c ai
obinut o soluie.

Pentru a obine toate celelalte


soluii, nu v rmne dect s o luai
de la nceput. Avei cam mult de
muncit, iar dac numrul invitailor
este mare...operaiunea devine foarte
anevoioas. Iat de ce avei nevoie de
un calculator i cunotine de
programare .

Exemplu grafic
Permutri

Problem rezolvat (Permutri)


var st:array[1..25] of integer;
i,n,p:integer;
procedure init;
begin
write('N=');
readln(n);
for i:=1 to 25 do
st[i]:=0;
end;
function valid(p:integer):boolean;
begin
valid:=true;
for i:=1 to p-1 do
if st[i]=st[p] then valid:=false;
end;
procedure tipar(p:integer);
var i:integer;
begin
for i:=1 to p do writeln(st[i],' ');
end;
procedure back(p:integer);
begin p:=1; {plecam de la primul nivel }
st[p]:=0; {initializam nivelul cu 0}
while p>0 do {cat timp stiva nu este vida}
begin
if st[p]<n then {mai exista valori neincercate pe nivelul p}
begin
st[p]:=st[p]+1; {st[p]<-<o noua valoare din multimea valorilor posibile>}
if valid(p) then
if p=n then tipar(p) {solutia este finala}
else begin p:=p+1;{trecem la nivelul urmator}
st[p]:=0; {initializam valoarea de pe nivel cu 0}
end;
end;
else
p:=p-1; {pas inapoi}
end;
end;
begin
init;back(1);
end.

Aplicaii
Backtrackingul este util la rezolvarea unor probleme de
satisfacere a constrngerilor, cum ar fi cuvintele ncruciate,
jocuri de sudoku i alte probleme similare. Ea st la baza unei
serii de limbaje de programare logic, cum ar
fi Icon, Planner i Prolog.
Algoritmul este mai efectiv dect cel al cutrii i
parcurgerii brute deoarece acesta poate nltura multipli
candidai n acelai timp. Cu toate acestea, acest algoritm
rmne a fi cea mai costisitoare metod din punct de vedere al
timpului de execuie. Dar, la momentul actual este cea mai
efectiv metod pe care o avem.