METODA BACKTRACKING Aspecte teoretice Metoda Backtracking este o
METODA BACKTRACKING
Aspecte teoretice Metoda Backtracking este o metodă de elaborare a algoritmilor. Ea se aplică problemelor în care soluţia se poate reprezenta sub forma unui vector, X=(x 1, x 2, . . . xm), care aparţine lui S=S 1 x. S 2 x. . . Sm - S=S 1 x. S 2 x. . . Sm se numeşte spaţiul soluţiilor posibile - Pentru fiecare problemă în parte se dau anumite condiţii între componentele vectorului soluţie care se numesc condiţii interne - Soluţiile posibile care verifică condiţiile interne se numesc soluţii rezultat - Metoda Backtracking îşi propune să genereze toate soluţiile rezultat
O metodă simplă de a genera soluţiile rezultat constă în a genera într-un mod oarecare toate soluţiile posibile şi de a alege dintre acestea doar pe cele care verifică condiţiile interne. Dezavantajul constă în faptul că timpul cerut este foarte mare.
Metoda Backtracking urmăreşte să evite generarea tuturor soluţiilor posibile. Pentru aceasta elementele vectorului x primesc pe rând valori în sensul că lui xk i se atribuie o valoare doar dacă componentele din faţa sa x 1, x 2, . . . xk-1 au primit valori. Dacă lui xk i s-a atribuit o valoare, nu se trece direct la atribuirea de valori lui xk+1, ci se verifică nişte condiţii de continuare, referitoare la x 1, x 2, . . . xk-1 xk. Dacă condiţiile de continuare au fost satisfăcute, se trece la calculul lui xk+1. Neîndeplinirea lor exprimă faptul că oricum s-ar alege xk+1, . . . , xn, nu se va ajunge la o soluţie rezultat. Evident, ca în cazul neîndeplinirii condiţiilor de continuare va trebui să se facă o altă alegere pentru xk. Sau dacă Sk a fost epuizat, să se micşoreze k cu o unitate, încercând să se facă o nouă alegere pentru xk.
Exemplu pentru înţelegerea metodei Pentru a înţelege mai uşor prezentăm următorul exemplu: Presupunem că dorim să ne îmbrăcăm de la un magazin pentru o festivitate şi dorim să cumpărăm: pantofi, ciorapi, pantaloni, cămaşă şi cravata astfel încât acestea să se asorteze între ele, să se genereze toate modalităţile de a ne îmbrăca. Magazinul are: 5 etaje La etajul 1 are 10 La etajul 2 are 10 La etajul 3 are 10 La etajul 4 are 10 La etajul 5 are 10 raioane raioane cu cu cu pantofi ciorapi pantaloni cămăşi cravate
Deoarece soluţia are mai multe componente, 5 – câte etaje are magazinul, putem folosi metoda Backtracking. Pentru rezolvare vom folosi: k : variabilă întreagă care reprezintă etajul pe care ne găsim x : vector care 5 componente întregi, adică exact câte etaje are magazinul cu proprietatea că xk reprezintă numărul raionului de la care s-a cumpărat pe etajul k. În cazul de faţă xk {1, . . . , 10} unde k {1, . . . , 5} as este o variabilă întreagă care primeşte valoarea 1 dacă pe etajul k mai sunt raioane nevizitate şi primeşte valoarea 0 dacă pe etajul k nu mai sunt raioane nevizitate. ev este o variabilă întreagă care primeşte valoarea 1 dacă ce este la raionul xk convine şi primeşte valoarea 0 dacă ce este la raionul xk nu convine.
IMPLEMENTAREA METODEI BACKTRACKING Forma generală a unei funcţii backtracking Implementarea recursivă a algoritmului furnizat de metoda backtracking, este mai naturală şi deci mai uşoară.
IMPLEMENTAREA METODEI BACKTRACKING Pentru exemplificare vom utiliza generarea permutarilor. Date si structuri de date: v – vectorul solutie n – numarul de elemente k – pozitia din vector care se completeaza Functii: valid() – verifica conditiile de continuare solutie() – verifica daca s-a determinat o solutie afisare() – afiseaza solutia bk() – functia backtracking
Permutări O permutare a unei mulţimi cu n elemente este un şir de elemente obţinut prin schimbarea ordinii elementelor mulţimii date sau chiar mulţimea însăşi. Ne gândim la generarea permutărilor atunci când se dă o mulţime cu n elemente ca date de intrare iar soluţia este sub forma de vector, tot cu n elemente, ale cărui componente sunt distincte şi aparţin mulţimii date. Exemplu: Fie A={1, 2, 3}. Permutările mulţimii A sunt: (1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1). Fie A={a 1, a 2, …, am} o mulţime cu elemente de tip întreg. Trebuie determinate elementele mulţimii { y 1, y 2, …, ym }| yk A, k=1, 2, . . . , m, pentru yi yj pentru i j}. Deci, x=( x 1, x 2, …, xm) unde x {1, . . . , m}, elementele vectorului x trebuie să fie distincte.
IMPLEMENTAREA METODEI BACKTRACKING
IMPLEMENTAREA METODEI BACKTRACKING l Problema generării permutărilor, este cea mai reprezentativă pentru metoda backtracking, ea conţine toate elementele specifice metodei. l Probleme similare, care solicită determinarea tuturor soluţiilor posibile, necesită doar adaptarea acestui algoritm modificând fie modalitatea de selecţie a elementelor din mulţimea Sk, fie condiţiile de continuare fie momentul obţinerii unei soluţii
Aranjamente Se dau două mulţimi A={1, 2, …, p} şi B={1, 2, …, m} se cer toate funcţiile injective definite pe A cu valori în B. O astfel de problemă este una de generare a aranjamentelor de n luate cate p (Anp). Exemplu: p=2, n=3. Avem (1, 2), (2, 1), (1, 3), (3, 1), (2, 3), (3, 2). De exemplu (2, 1) este funcţia f: A→B dată astfel f(1)=2, f(2)=1. Avem relaţiile: =m(m-1). . . (m-p+1).
Avem relaţiile: = m(m-1). . . (m-p+1). Se citesc m şi p. Să se genereze toate aranjamentele de m luate câte p. Se observă că dacă se cunoaşte fiecare submulţime de p elemente a mulţimii de m elemente, atunci aranjamentele se pot obţine permutând în toate modurile posibile elementele unei astfel de mulţimi. O soluţie este de forma: x 1, x 2, . . . xp unde x 1, x 2, . . . xp B. În plus x 1, x 2, . . . xp trebuie să fie distincte. O soluţie are p numere din mulţimea B şi numerele trebuie să fie distincte. De aici rezultă că algoritmul este acelaşi ca la permutări, diferenţa fiind dată de faptul că soluţia are p numere, nu m ca în cazul permutărilor.
GENERAREA ARANJAMENTELOR l Se citesc n şi p numere naturale cu p<=n. Sa se genereze toate aranjamentele de n elemente luate câte p. Exemplu pentru n=3, p=2 (1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2) l Vom genera pe rând soluţiile problemei în vectorul v=(v 1, v 2, v 3, . . . , vn) , unde vk € Sk l Conditia interna: elementele nu au voie sa se repete. l Obţinem o soluţie în momentul în care completăm vectorul cu p elemente. l In cadrul programului pentru generarea permutărilor trebuie modificata o singură funcţie pentru a obtine generarea aranjamentelor şi anume funcţia soluţie, astfel:
GENERAREA ARANJAMENTELOR
GENERAREA COMBINARILOR Se citesc n şi p numere naturale cu p<=n. Să se genereze toate combinările de n elemente luate câte p. Exemplu pentru n=3, p=2. obţinem (1, 2), (1, 3), (2, 3) lÎn cadrul unei combinări elementele nu au voie să se repete. l. Să mai observăm şi faptul că dacă la un moment dat am generat de exemplu soluţia (1, 2), combinarea (2, 1) nu mai poate fi luată în considerare, ea nu mai reprezintă o soluţie. Din acest motiv vom considera că elementele vectorului reprezintă o soluţie, numai dacă se află în ordine strict crescătoare. Acestea reprezintă condiţiile de continuare ale problemei.
GENERAREA COMBINARILOR
- Slides: 17