Adesea soluia unei probleme este format din mai multe elemente distincte i poate fi ( ), ale crui elemente satisfac anumite prezentat ca un vector de lungime : condiii.. Fiecare dintre elementele componente ale soluiei ( ) este ales dintr-o mulime , care are elemente ( ), deci soluia aparine spaiului cu dimensiuni ( ). Spaiul este numit spaiul soluiilor pentru problema dat. Numrul de elemente ale acestui spaiu este Evident, nu orice element din spaiul soluiilor constituie o soluie acceptabil. Soluia unei probleme poate fi gsit n dou feluri: prin calcule sau prin cutarea n spaiul soluiilor, cu reinerea acelor elemente care satisfac condiiile problemei. Este preferabil soluionarea prin calcule (datorit consumului mic de resurse), dar nu ntotdeauna e disponibil un astfel de algoritm1. Una din metodele de cutare n spaiul soluiilor este metoda backtracking. Ea implic o verificare a tuturor elementelor din spaiul soluiilor (parcurgerea ntregului spaiu). Backtracking este o metod costisitoare deoarece implic un consum mare de r esurse, care crete exponenial odat cu dimensiunea problemei. Metoda este recomandat atunci cnd nu exist alt posibilitate de rezolvare a problemei date. Pentru a reduce complexitatea metodei, este posibil combinarea cu alte metode. Backtracking este o metod de natur recursiv care poate fi implementat iterativ sau recursiv. Metoda este formalizat astfel: soluia este exprimat sub forma unui vector ( )r. Elementele care compun soluia trebuie s ndeplineasc anumite condiii, numite condiii interne. Elementele din spaiul soluiilor care ndeplinesc aceste condiii se numesc soluii rezultat. Construirea unei soluii se face prin alegerea de valori pentru fiecare element (din mulimea specific lui), pe rnd: elementul primete o valoare din numai dup ce toate elementele anterioare ( ) au primit valori. Dup alegerea unei valori pentru se verific dac soluia parial ( ) ndeplinete condiiile de continuare. ndeplinirea condiiilor de continuare este strict necesar. Numai dac acestea snt ndeplinite se trece la alegerea unei valori din pentru elementul . Valoarea aleas este considerat consumat i nu va fi disponibil dac trebuie aleas alt valoare pentru elementul . Nendeplinirea condiiilor de continuare nseamn c orice valori s-ar alege pentru elementele urmtoare ( cu ), nu se va ajunge la o soluie rezultat. Dac nu snt ndeplinite condiiile de continuare se alege alt valoare pentru din mulimea , o valoare care nu a fost aleas anterior (neconsumat). Dac n mulimea nu mai snt elemente
1
Exemple: a) Rezolvarea ecuaiei de gradul 1 ( unde ) se poate face prin calcule ( ) sau prin verificarea tuturor elementelor din spaiul soluiilor (mulimea ). b) Rezolvarea ecuaiei de gradul 2 ( unde ) se poate face prin calcule sau prin verificare tuturor elementelor din spaiul soluiilor (mulimea ). n ambele exemple este evident preferabil utilizarea formulelor, a doua variant fiind practic imposibil (spaiul soluiilor este infinit).
disponibile, atunci se revine la elementul anterior i se alege pentru el alt valoare (neconsumat) din mulimea . Atunci cnd are loc o revenire la elementul anterior, se consider c nici o valoare din mulimea nu a fost consumat. Aceast revenire a dat numele metodei: revenirea nseamn ntoarcerea (cu unul sau mai muli pai) pe drumul urmat n construirea soluiei, pn la o bifurcaie de unde se poate continua pe alt drum. ndeplinirea condiiilor de continuare de ctre valorile alese pentru elementele ale soluiei nu garanteaz obinerea unei soluii rezultat ale crei prime componente s aib aceste valori. O alegere bun a acestor condiii poate duce la reducerea substanial a volumului de calcul. n cazul ideal, condiiile de continuare nu snt doar necesare ci i suficiente. De obicei condiiile de continuare constituie restricia condiiilor interne la primele elemente vectorului . Atunci cnd este egal cu condiiile de continuare reprezint chiar condiiile interne. Pentru a ine evidena valorilor consumate se noteaz cu mulimea la momentul curent. mulimea valorilor consumate din
Atunci cnd se ncearc alegerea unei valori noi pentru elementul trebuie precizate urmtoarele: valorile deja atribuite pentru elementele (fie acestea ), i mulimile de valori consumate pentru elementele (fie acestea ) pentru elementele nu s-au consumat nc valori, deci mulimile snt vide. Toate aceste date pot fi reprezentate sub forma unui tabel, numit configuraie: ( | )
componentele au primit valorile ; valorile atribuite satisfac condiiile de continuare (se afl n stnga barei verticale); se ncearc atribuirea unei valori pentru componenta . Ea urmeaz a primi o valoare neconsumat (din mulimea ); valorile consumate pentru componentele snt cele din mulimile (valorile snt considerate consumate, deci snt incluse n mulimile respective); pentru componentele pentru nu s-a consumat nici o valoare, deci mulimile snt vide; pn acum au fost construite eventuale soluii de forma ( ), cu i eventuale soluii de forma ( ) cu ( ) i ( ) ( ).
Gsirea unei soluii constituie un proces prin care se ajunge de la o configuraie iniial la una sau mai multe configuraii soluie. Algoritmul continu cu analizarea altor elemente i gsirea altor configuraii soluie, pn cnd se ajunge la configuraia final. configuraie iniial: (| configuraie soluie: ( configuraie final: (| ), |), ).
1) Atribuie i avanseaz. Are loc atunci cnd exist valori neconsumate pentru , iar valoarea aleas are proprietatea c soluia parial ( ) ndeplinete condiiile de continuare. n acest caz se atribuie lui i se adaug la dup care se avanseaz la componenta . Operaia este notat astfel: ( | ) ( * +| )
2) ncercare euat. Se produce atunci cnd mai exist valori neconsumate pentru , iar valoarea aleas face ca ( ) s nu ndeplineasc condiiile de continuare. n acest caz se adaug la dar nu se avanseaz la urmtoarea component. Operaia este notat astfel: ( | ) ( | * + )
3) Revenire. Operaia are loc atunci cnd toate valorile pentru au fost consumate ( ). Se revine la componenta ncercnd atribuirea unei noi valori, neconsumate, pentru ea. Pentru aceast nou valoare a lui se vor ncerca ulterior toate valorile posibile pentru , deci are loc o reconsiderare a valorilor consumate pentru , devenind mulimea vid. Operaia este notat astfel: ( | ) ( | )
4) Revenire dup construirea unei soluii. n acest caz se revine la situaia n care ultima component urmeaz s primeasc alte valori, dac mai exist, pentru construirea altor soluii. Operaia este notat astfel: ( |) ( | )
Deoarece mulimile snt finite, prin consumarea valorilor i reveniri se ajunge dup un numr finit de pai la configuraia final. Obinerea ei marcheaz finalul procesului de cutare a soluiilor, toate elementele spaiului soluiilor fiind analizate. Se poate spune c procesul de cutare se ncheie atunci cnd . n implementare se folosete valoarea indicelui pentru a sesiza obinerea unei configuraii soluie ( ) i pentru a sesiza obinerea configuraiei finale ( ). Cu aceste consideraii, procesul de cutare a soluiilor este uor de implementat deoarece orice modificare de configuraie afecteaz puine elemente: indicele componentei din stnga barei ( ), componenta i mulimea de valori consumate . Algoritmul de cutare prin metoda backtracking poate fi descris astfel, n forma cea mai general: iniializare //construire configuraie iniial ct timp o dac //ct timp configuraia nu e final //configuraie de tip soluie? ) //revenire dup construirea unei soluii
reine soluia
altfel
dac
altfel
Unele din problemele care se rezolv prin metoda backtracking prezint particulariti care uureaz implementarea: elementele mulimilor snt numerice, n progresie aritmetic cu valoarea iniial , raia i valoarea final . De multe ori toate mulimile au aceeai valoare iniial (deseori aceasta este 1) i aceeai raie (deseori aceasta este 1). n aceast situaie a doua linie a configuraiei nu mai trebuie reprezentat explicit deoarece valorile pentru fiecare component se aleg n ordin cresctoare iar valorile consumate snt cele mai mici dect valoarea curent (inclusiv aceasta) a elementului , deci e suficient cunoaterea lui pentru a cunoate i . * +. n multe probleme toate mulimile snt identice cu mulimea Cu aceste consideraii, algoritmul poate fi prezentat n urmtoarea form:
//primul element minus raia, de multe ori 0=1-1 ct timp o //variabila de impas o ct timp i //alegerea unei noi valori pentru //urmtorul termen n progresie posibil( ,vb) //snt ndeplinite condiiile de continuare o dac //impas => revenire o altfel dac dac condiii_finale(x) //configuraie soluie? ( ) o reine_soluia altfel //avans o o n acest algoritm snt utilizate trei proceduri, cu urmtoarele roluri:
posibil verific dac valoarea aleas pentru elementul curent ndeplinete condiiile de continuare. Variabila de impas vb primete valoarea 1 n caz afirmativ, 0 n caz contrar. condiii_finale verific dac soluia complet construit este acceptabil. reine_soluia are rolul de a memora configuraia soluie curent n vederea prelucrrii ulterioare.
Fa de varianta standard, pot s apar variaiuni: exista probleme n care numrul de componente ale soluiei poate fi variabil sau dintre toate soluiile posibile se alegea una singur, care maximizeaz (sau minimizeaz) un criteriu.
Avnd o natur recursiv, metoda backtracking este uor de programat recursiv. O form general a subprogramului recursiv care implementeaz metoda backtracking este urmtoare: void backtracking( int i) { if (i==n+1) retine_solutia(); else for(j=a[i]; j<=s[i]; j+=r[i]) { x[i]=j; if( posibil(i) ) backtracking(i+1); } }
Exemple de problem care se rezolv prin metoda backtracking: 1. 2. 3. 4. 5. 6. 7. Problema celor 8 (n) dame. Problema cavalerilor mesei rotunde. Plata unei sume (cu/fr bancnot unitate). Generarea tuturor permutrilor. Generarea tuturor aranjamentelor. Generarea tuturor combinrilor. Problema colorrii hrilor.
1. Problema celor 8 (n) dame. Se cere s se aeze 8 regine pe o tabl de ah astfel nct s nu existe regine care se atac. S se gseasc toate posibilitile de aezare a damelor. Problema se poate extinde la regine, pe o tabl de dimensiuni .
2. Problema cavalerilor mesei rotunde. n jurul unei mese rotunde snt aezai cavaleri. La un moment dat izbucnesc conflicte ntre vecini. Se cere s se aeze cavalerii la mas astfel nct ntre oricare doi vecini din aezarea iniial s existe 1 sau dou alte persoane.
Fie tipuri de bancnote, cu valorile nominale . Din fiecare tip este disponibil cantitatea . S se determine toate modalitile n care se poate plti o sum folosind aceste bancnote.
5. Generarea aranjamentelor S se genereze toate aranjamentele dintr-o mulime cu elemente, luate cte .
Aplicaie: s se genereze toate posibilitile de creare a unui dra pel cu culori (aezate vertical, de la lance), avnd la dispoziie culori. Condiie suplimentar: n mijloc trebuie s se afle o anumit culoare.
6. Generarea combinrilor S se genereze toate combinrile dintr-o mulime cu elemente, luate cte .
7. Problema colorrii hrilor Se d o hart cu ri. Relaiile de vecintate snt reprezentate ntr-o matrice de adiacen. S se genereze toate posibilitile de colorare hrii cu ajutorul a c culori, innd cont c dou ri vecine nu pot avea aceeai culoare. Care este numrul minim de culori care pot fi folosite?