You are on page 1of 9
Metoda backtracking Metoda backtracking poate fi folosita in rezolvarea a diverse probleme. Este 0 metoda lenta, dar de multe ori este singura pe care 0 avem la dispozitie! Introducere Metoda backtracking poate fi aplicata in rezolvarea problemelor care respect urmatoarele condi: + solutia poate fi reprezentat4 printr-un tablou x[]=(x[1], <{2], ---. La], fiecare element x[] apartinand unei multimi cunoscute A,, + fiecare multime a, este finita, iar elementele ei se atid Intr-o relatie de ordine precizata - de multe ori cele m multimi sunt identice; + se cer toate solutile problemei sau se cere o anumita solutie care nu poate fi determinata intr-un alt mod (de regula mai rapid) Aigortmul de tp backtracking construieste vectarul x[] (numit veetor solutia) ast! Fiecare pas k, incepand (de regula) de la pasul 1, se orelucreazd elemental curent x(k al vectorull solute ‘+ x[K] primeste pe rand valor din multimes corespunzdtoare A, + la iecare passe vet daca configuatia curenié a veclrull solu poate duce lao solute nal ~ dacd valoarea li x{k] este corectd in raport cu xf], x{21, .. xfk-1T © dacé valearea nu este corecta, element curentx[k] primeste umétoarea valoare din 4 sau revenim la elementul anterior x{k-1], daca x(k] a prt toate valone cin 4, ~ pas inapot «© daca valoarea li x{k] este corect (avem o solute paral), se vera existena unel soluti fale a protlemet * daca configurata curenta a vectorului solute x reprezinta solute Tinala (de regula 0 atts, + dacd nu am identical o solute fnala wecem fa urmatorul element, x{kt2], si relulm procesul pentru acest element — pas inainte, Pe masura ce se constuiest, vectrul solute x(] reprezintd o solugle pariali a problemei. Cand vectorul solute este complet consti, avem o solute final a probleme’, Exemplu $84 rezolim uimatoarea problem folosind metoda backvacking, ‘cu creionul pe hari’: $2 se affgeze permutarile muti 2, 3} rnumai daca contine fiecare element al mulinil# © [Ne amintim 8 un si de numere reprezinlé o permutare 2 unei multi daca singuré data, Atel spus, n cazul nostru + are exact 3 elemento, «+ fiecare element este cuprins inte 1 $13, + elementele nu se repeta Pentru a rezolva problema vom sctie pe rnd valori din multimea datd si vom verifa la fiecare pas daca valorie sciise duc la permutare corecta Observatit corect, pas inainte ‘rest corect, pas inainte oresit gresit solutie final 4 am terminat valoile posible pentru x{ 3 J, pas inapoi corect, pas inainte rest solute finala 2 ‘gresit am terminat valonile posible pentru x{ 3 J, pas inapoi am terminat valonle posioile pentru x{ 2 }, pas inapot corect, pas inainte corect, pas inainte sgresit sresit solute finals 3 ‘am torminat valorile posibile pentru xi 3 J. pas inapoi arosit corect, pas inainte solute nati 4 aresit gest am terminat valorie positile pentru xi 3 }, Pas inapoi am terminat valoile posibile pentru x{ 2 J, pas inapoi corect, pas inainte corect, pas inainte gest solute tata 5 gest am terminat valoile posible pentru x{ 3 J, pas inapoi corect, pas inainte ‘solute fel 6 aresit gresit 4am terminat valorile posible pentru x{ 2 1, pas inapoi oresit am terminat valoile posible pentru x{ 2 1. pas inapoi 4am terminat valorile posibile pentru x{ 2 1. pas fnapoi Algoritmul general toda backtracking poate implementa iterativ sau recusiv in abel siuali se se folosesteo structurd de deste de tip stiva. in azul implementa iteratve,stve trebuie gestionaia intern in elgorim — ceea ce poate duce ta diclati im mplementare In cazul ‘implementa recursive se foloseste spa de memories de tip sv - STACK elocat progremulu implementarea recursivé este de ‘gulé mai scut gi mai ugor do infles. cost ariel prozinta implomontarirocurcive alo moiode. ‘Unmtorul eubprogram recursiv prozinté algoriimul la modul goneral + la fiecare pel exckk) se genereazl valori pentru elementul x[k} al vectorulul solute; + instruciiunea pentru modeleaza conatile externa, + suvprogramul oc(k) veriic’ conattie interne ‘+ subprogramul solutis(k) veriicd daca confguratia curenté a vectorulu sclutle reprezint o solutie fnalé + subprogramul arécare(k) trateazd sclutia curenté 2 problemel de exemplu o afigeaz’l subprogran BACK() pentru fiecare elenent 3 cin Ak} excita [> xta == f daca OKte) atunct | paca soiutiecky atuncs 1 arissreie) | altfel | eacxties) 1 1 1 tt tt It io ‘opservatit: 460 cele mai multe ori mutimie A sunt de forma A = {1,2,3,....,m}sau A= {1,2,3,....,m) sau A= {a,a-41,0+2,....,b} sau ata forma asta neat s& putem scria insiuciunea 2entru conform specifculi lmpatult de oronramare folost— eventual tolosng o stuctura repetiva Ge ait tp! Daca este necesar tule realzate unele transtorman Incat mutumte salunaa fa aceasta tormt elementele mutimi A pot fin ote ordine. Contezz isd ordnea in cave le vor percurge in instuctunea Pentru, deoatece in plobleme este prevzela de obiceio anumta ordine in care tebuie generate soutite daca parcurgem elementele lui A in ordine crescéloare vor obtine soll in ordine exicogranca, © acd percurgem elementele lui Ain ordine descrescSloare vor obtine solu in ordne inverslericogratc&. in znumite probleme determinarea une slut nale nu conduce la ineruperea apeluor recursive, Un exemplu este genereree submulimior urei mutimi in acest cez elgoritmul de mei sus poate fimodiicatastet 1. Fle nun numar natural nenul. Sa se genereze permutarile de n elemente Indicati: pentru pozita curenta k din stiva, se parcurge Intreg domeniui de valor {1,2,...n} $1 ‘dupa depunerea elementului curent, se verificé daca valoarea este diferité de toate valorile depuse anterior. include asing namespace stdz int _n, st {20}: void ariseaza() couk<<"\n"5 valid(int k) int swol For (int J=12j using namespace std; Ant nym,st [20]; void afiseaza() ‘ for (int j=1sJsqm; j++) cout<n; cout<<"m" 3. Fie n gi m dou numere naturale nenule, msn. S8 se genereze combindirle den elemente luate cate m. Indicati:diferenta fats de generarea aranjamentelor const in faptul c& se genereazé elementele In ordine strict crescatoare. finclude using namespace std: int n,m, st(20]; void atiseaza() cout< using namespace si int a{100},n, x{100 void cit (int a[100], int en) cout<<"\n Introduceti nr de elemente ";cin>>n; cout<<"\n Introduceti elenentele multimii\n for [int isl;icen;it+) t cout<<™\na IM<alil: » void afis(int x[100],iat k) { cours<"\n ( for (int +4) cout< using namespace std: int nym, st (201; void afiseaza() { for (int j=1;}<=mj cout<>n;

You might also like