Sunteți pe pagina 1din 20

Tehnica Backtracking

Conf.dr. Luminiţa Duţă


Când se utilizează?
 Folosim această tehnică de programare
atunci când nu dispunem de o altă metodă de
rezolvare a unei probleme, iar soluţiile
problemei pot fi scrise sub forma unui şir
rezultat din produsul cartezian al n mulţimi:
x1,x2,…,xn unde
x1€ A1
x2 € A2
……………..
xn € An
De ce Backtracking?
 Pentru că nu putem rezolva altfel problema
 Pentru că problema are mai multe soluţii care
sunt foarte greu de determinat
 Pentru că avem nevoie de TOATE soluţiile
problemei
 Pentru că ştim să programăm
 Pentru că nu ne grăbeşte nimeni
Probleme ce se rezolvă prin BKT
 Problema reginelor
 Problema labirintului
 Problema hărţilor
 Problema fotografiei
 Problema decupajului
 Problema comis-voiajorului
 Problema plăţii în bancnote
Problema reginelor
 Fiind dată o tablă de şah de
dimensiune NxN se cer toate
posibilităţile de aranjare a N regine,
astfel încât acestea să nu se atace
reciproc
Pentru 8 regine
 Pe o tablă de şah de 64 de pătrate sunt
4.426.165.368 moduri posibile de a aşeza 8
regine !!
 Dacă ţinem însă cont că reginele nu se pot
aşeza pe aceeaşi linie sau coloană, mai
rămân de verificat “doar” 40.320 (8!)
posibilităţi de aşezare, astfel încât reginele să
nu se atace reciproc.
Soluţie
 Problema are mai multe soluţii!
 Iată una dintre ele:
Notaţii utilizate în scrierea BKT
 k – nivelul curent al stivei
 n – nr de nivele ale stivei (nr de regine)
 st – vectorul stivă
 as - variabila logica “exista succesor”
 back( ) – funcţia backtracking
 init( ) – funcţia de iniţializare a stivei
 succesor( ) – fct. de validare a succesorului
 valid( ) – fct de validare a conditiilor problemei
 solutie( ) – fct de validare a solutiei
 tipar( ) – fct pt afişarea soluţiei găsite
Şablonul tehnicii BKT
void back()
{int as;
k=1;
init();
while (k>0)
{
do { } while ((as==succesor()) && !valid());
if (as)
if (solutie()) tipar();
else {k++; init(); }
else k--;
}
}
Rezolvarea problemei reginelor
(funcţiile init şi succesor)
void init ( )
{ st[k]=0; }

int succesor ( )
{ if (st[k]<n)
{st[k]++;
return 1;
}
else return 0;
}
Rezolvare (funcţia de validare)
int valid( )
{ for(int i=1; i<k; i++)
if ( (st[k]==st[i]) || (abs(st[k]-st[i])==abs(k-i)) )
return 0;
return 1;
}
Rezolvare (funcţia solutie şi tipar)
int solutie ( )
{return k==n;}

void tipar( )
{for (int i=1; i<=n; i++) cout<<st[i];
cout<<endl;
}
Rezolvare (funcţia BKT)
void back()
{int as;k=1;
init();
while(k>0)
{
do { } while ((as=succesor()) && !valid());
if (as)
if (solutie()) tipar();
else {k++; init(); }
else k- -;
}
}
Rezolvare (progr principal)

void main( )
{ cout<<"n="; cin>>n;
back( );
}
Problema colorării hărţilor
 Fiind dată o hartă cu n ţări, se cer
toate soluţiile de colorare a hărţii
utilizând cel mult 4 culori, astfel încât
două ţări cu frontiera comună să fie
colorate diferit.
Problema comis-voiajorului
 Un comis – voiajor trebuie să viziteze un
număr n de oraşe. Iniţial, acesta se află
într-unul dintre ele, notat cu 1.
 Comis – voiajorul doreşte să nu treacă de
două ori prin acelaşi oraş, iar la întoarcere
să revină în oraşul 1. Cunoscând legăturile
existente între oraşe, se cere să se
tipărească toate drumurile posibile pe care
le poate efectua comis – voiajorul.
Problema labirintului
 Se dă un labirint sub formă de matrice cu
m linii şi n coloane. Fiecare element al
matricei egal cu 0 reprezintă o cameră a
labirintului. Elementele egale cu 1
reprzintă obstacole. Într-una din camere,
de coordonate x şi y, se află un om. Se
cere să se găsească toate ieşirile din
labirint.
Problema fotografiei
 O fotografie alb – negru este prezentată
sub forma unei matrice binare. Ea
înfăţisează unul sau mai multe obiecte.
Porţiunile corespunzătoare obiectului în
matrice au valoarea 1.
 Se cere să se determine dacă fotografia
reprezintă unul sau mai multe obiecte.
Câte obiecte sunt în fiecare din cele două imagini?

1 1 0 0
0 0 0 1 
A= 
1 1 1 1 0 1 1 0
  0 0 0 1 
1 1 1 1 A= 
0 1 1 1
 
1 0 0 0
Concluzii
 Tehnica backtracking este folosită în
problemele de optimizare.
 Programarea prin tehnica backtracking se
utilizează în programarea roboţilor autonomi,
viziune artificială, prelucrarea imaginilor,
controlul inteligent al traficului, realizarea
reţelelor de calculatoare, tehnici de brokeraj,
etc.

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