Sunteți pe pagina 1din 11

BACKTRACKING

Proiect realizat de Oanea Darius-George

Principiu de functionare.Notiuni introductive.


Backtracking
Este o tehnic de programare aplicabil algoritmilor care ofer mai multe soluii i are ca
rezultat obinerea tuturor soluiilor problemei. Fiecare soluie se memoreaz ntr-o structura de
date de tip stiv implementat cu ajutorul unui vector. Deci fiecare soluie poate fi pus sub
forma unui vector.
ntr-un algoritm backtracking ne intereseaz toate soluiile posibile. Pentru a obine
fiecare soluie final se completeaz stiva nivel cu nivel trecnd astfel prin soluii pariale. Astfel
soluiile finale ct i cele pariale pentru a fi luate n considerare trebuie s ndeplineasc
anumite condiii numite condiii de validare. O soluie care ndeplinete o astfel de condiie se
numete soluie valid.
Toate configuraiile stivei ce reprezint soluii finale sunt alctuite din elementele
aceleiai mulimi bine definite pe care o numim mulimea soluiilor. Fiecare nou soluie parial
se obine prin completarea soluiei pariale precedente cu nc o nivel pe stiv. La fiecare nivel
se pun valori din mulimea soluiilor care nu au fost ncercate pn cnd se obine o soluie
valid. n acest moment se trece la nivelul urmtor n stiv pentru a completa mai departe soluia
relund ncercrile pe noul nivel.
La un moment dat pe un anumit nivel nu mai exist nici o valoare nencercat din
mulimea valorilor problemei. n acest caz se face un pas napoi n stiv la nivelul anterior i se
reia cutarea cu valorile rmase nencercate pe acest nivel anterior.
Respectivul nivel a mai fost vizitat dar l-am abandonat dup ce am pus o valoare care a
generat o soluie valid. Deci este posibil s fi rmas aici valori nencercate. Dac nici pe acest
nivel nu mai avem valori nencercate mai facem un pas napoi n stiv. Mecanismul revenirilor a
determinat denumirea de metoda backtracking.
Plecnd de la nivelul 1 i repetnd algoritmul pn cnd pe toate nivelele au fost
ncercate toate valorile din mulimea valorilor se obin soluii finale care se tipresc.
Vom implementa metoda backtracking iterativ folosind o rutin unic aplicabil oricrei
probleme. Rutina va apela funcii care au ntotdeauna acelai nume i care din punct de vedere al
metodei realizeaz acelai lucru.
Sarcina rezolvatorului este s scrie explicit - pentru fiecare problem funciile aplicate
de rutin:
1. Fiecare nivel al stivei trebuie iniializat cu o valoare aflat naintea tuturor valorilor
posibile din mulimea soluiilor. Aceast afiare se face cu funcia init().

2. Gsirea urmtorului element netestat de pe un nivel k al stivei St se face cu funcia:


Dac exist valoare
netestat (succesor), atunci se va alege o nou valoare (netestat) pentru nivelul k.
3. Odat ales un element testarea condiiilor de validare se face cu funcia:

4. Testul dac s-a ajuns sau nu la o soluie final se face cu funcia:

5. Soluia se tiprete cu funcia tipar()


Bactracking n plan
n variant elementar aplicam metoda backtracking pentru rezolvarea problemelor n
care soluia era reprezentat ca vector. Putem generaliza ideea cutrii cu revenire i pentru
probleme n care cutarea se face n plan. Pentru noi planul va fi reprezentat ca un tablou
bidimensional.
Pentru a intui modul de funcionare a metodei backtracking n plan s ne imaginm
explorarea unei peteri. Speologul pornete de la intrarea n peter i trebuie s exploreze n
mod sistematic toate culoarele peterii. Ce nseamn n mod sistematic? n primul rnd i
stabilete o ordine pentru toate direciile posibile de micare (de exemplu, N, NE, E, SE, S, SV,
V, NV) i ntotdeauna cnd se gsete ntr-un punct din care are mai multe culoare de explorat,
alege direciile de deplasare n ordinea prestabilit. n al doilea rnd, speologul va plasa marcaje
pe culoarele pe care le-a explorat, pentru ca nu cumva s se rtceasc i s parcurg de mai
multe ori acelai culoar (ceea ce ar conduce la determinarea eronat a lungimii peterii).
n ce const explorarea? Speologul exploreaz un culoar pn cnd ntlnete o
intersecie sau pn cnd culoarul se nfund. Dac a ajuns la o intersecie, exploreaz succesiv
toate culoarele care pornesc din intersecia respectiv, n ordinea prestabilit a direciilor. Cnd
un culoar se nfund, revine la intersecia precedent i alege un alt culoar, de pe urmtoarea
direcie (dac exist; dac nu exist, revine la intersecia precedent .a.m.d.). S descriem ntr-o
form mai general aceast metod. Vom nota prin NrDirectii o constant care reprezint
numrul de direcii de deplasare, iar dx, respectiv dy sunt doi vectori constani care reprezint
deplasrile relative pe direcia Ox, respectiv pe direcia Oy, urmnd n ordine cele NrDirectii de
deplasare.

Aplicatii Backtracking
1.Se d o tabl de ah format din n linii i m coloane, definind n*m zone, unele dintre ele fiind
libere, altele coninnd obstacole. Pe tabl se afl un cal(situate pe o pozi ie oarecare) care se poate
deplasa pe tabl n L, ca la ah, fr a prsi tabla, fr a trece prin zone care con in obstacole i fr a
trece de dou ori prin aceeai zon.Dac pe tabl se afla un i un rege(situat de asemenea,intr-o pozitie
oarecare) determinai toate modalitatile prin care calul poate ajunge n zona unde se afl regele.

Rezolvare+Explicatii+Exemplu C++:

Declarm variabile pentru mrimea matricei,pozitia


calului,pozitia regelui,pentru miscare.
Citim apoi din fisierul traseucal.in aceste date.
Cu ajutorul functiei de afisare vom afisa(cu ajutorul unei matrici)
pasii pe care trebuie sa ii parcurga calul pentru a ajunge la rege.
mearga

Cu ajutorul functiei traseu pentru inceput vom incepe sa ne


deplasm cu calul in directiile posibile astfel incat sa nu
pe pozitiile pe care a mai fost,s nu ias din tabl i sa nu ajung la
obstacole.
Dup ce face toti paii sunt 2 variante:
1)S ajung la destinatie(la rege).Caz in care se va afia locurile prin
care a mers calul pentru a ajunge la rege in fisierul traseucal.out
2)Problema sa nu aib rezolvare.
Mai jos veti putea observa un exemplu
pentru problema de mai sus avand ca date de
intrare urmatoarele(traseucal.in):

Dupa rularea programului in cazul acestui exemplu vom avea doua solutii:

Observam ca in ambele cazuri(fiind unicele solutii) calul nostru nu a poposit pe niciun


obstacol, a mers in formal literei L si a ajuns dupa un obositor drum la regele mult dorit.
----------------------------------------------------------------------------------------------------------2.Se d o tabl dreptunghiular format din n linii i m coloane, definind n*m zone,
unele dintre ele fiind libere, altele coninnd obstacole. ntr-o zon precizat se afl un oarece
care se poate deplasa pe tabl trecnd din zona curent n zona nvecinat cu aceasta pe linie sau
pe coloan. Scopul sau este s:
a.)s se genereze toate soluiile prin care acesta s ajung la ieirea din labirint(de
asemenea o zon precizat), fr a prsi tabla, fr a trece prin zone care conin obstacole i
fr a trece de dou ori prin aceeai zon.
b.) s culeaga masa cea mai mare de brnz de pe traseu(coordonatele bucilor de
brnza sunt de asemenea cunoscute) prin care acesta s ajung la ieirea din labirint(de asemenea
o zon precizat), fr a prsi tabla, fr a trece prin zone care conin obstacole i fr a trece de
dou ori prin aceeai zon.

Rezolvare+Explicatii+Exemplu C++:

a.)Declarm variabile pentru mrimea matricei,pozitia


soricelului,pozitia iesirii din labirint,pentru miscare.
Citim apoi din fisierul soarece.in aceste date.
Cu ajutorul functiei de afisare vom afisa(cu ajutorul unei matrici) pasii
pe care trebuie sa ii parcurga soarecele pentru a ajunge la iesire.
Cu ajutorul functiei traseu pentru inceput vom incepe sa ne deplasm cu
soarecele in directiile posibile astfel incat sa nu mearga pe pozitiile
pe care a mai fost,s nu ias din tabl i sa nu ajung la obstacole.
Dup ce face toti paii sunt 2 variante:
1)S ajung la destinatie(la iesire).Caz in care se vor afia locurile prin care
a mers soarecele pentru a ajunge la iesire(in fisierul soarece.out)
rezolvare.
niciun drum posibil
Mai jos veti putea observa un
avand ca date de intrare

2)Problema sa nu aib
(Soricelul nostru nu are
prin care sa iasa din labirint)
exemplu pentru problema de mai sus
urmatoarele(soarece.in):

Dupa rularea programului in cazul acestui exemplu vom avea o singura solutie:

Observam ca in acest caz soarecele nostru nu a poposit pe niciun obstacol si a ajuns


dupa un obositor drum la iesirea din labirint.
a.)Declarm variabile pentru mrimea matricei,pozitia soricelului,pozitia si
numarul bucatilor de branza,greutatea branzei(acestea de mai sus
si cu ajutorul structurii de date date_branza),suma
totala a branzei adunata pe traseu,pentru miscare.
Citim apoi din fisierul soarece.in aceste date.
Cu ajutorul functiei validare() ne vom asigura ca traseul afisat este cel cu
cele mai multe grame de branza culese de al nostru soricel.
Cu ajutorul functiei modifica()ne vom asigura ca traseul afisat va fi cel care contine
masa cea mai mare de branza adunata de soricel.
Cu ajutorul functiei traseu pentru inceput vom incepe sa ne deplasm cu
soarecele in directiile posibile astfel incat sa nu mearga pe pozitiile pe care
a mai fost,s nu ias din tabl i sa nu ajung la obstacole.Tot cu ajutorul
acestei functii si cu ajutorul variabilei sum vom incepe sa adunam
branza si sa vedem care prin care traseu am cules cea mai multa branza.

Dupa ce programul se executa in soricel.out se va afisa traseul in care soricelul nostru


aduna cea mai mare cantitate de branza.
Mai jos veti putea observa un exemplu pentru problema de mai sus avand ca
date de intrare urmatoarele(soarece.in):

Dupa rularea programului in cazul acestui exemplu vom avea solutia:

Observam ca in acest caz soarecele nostru a cules 2 bucati de branza(pozitia 2 1;3 1 cu greutatea totala de 4 grame) si
a reusit sa ajunga la iesire fara sa treaca prin aceleasi locuri si fara sa ajunga pe obstacole.