Proiectarea algoritmilor: Programare dinamică Dorel Lucanu Faculty of Computer Science Alexandru Ioan Cuza University, Iaşi, Romania dlucanu@info.uaic.ro PA 2014/2015 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 1 / 52
Outline 1 Prezentarea generală a paradigmei 2 Studii de caz Distanţa între şiruri D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 2 / 52
Prezentarea generală a paradigmei Plan 1 Prezentarea generală a paradigmei 2 Studii de caz Distanţa între şiruri D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 3 / 52
Prezentarea generală a paradigmei Clasa de probleme Clasa de probleme la care se aplică include probleme de optim. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 4 / 52
Prezentarea generală a paradigmei Modelul matematic 1 Definirea noţiunii de stare, care este de fapt o generalizare a problemei iniţiale şi asocierea funcţiei obiectiv pentru stare. Problemei trebuie sa devină un caz particular (o stare). 2 Definirea unei relaţii de tranziţie între stări. O relaţie s s, unde s şi s sunt stări, va fi numită decizie. O politică este o secvenţă de decizii consecutive, adică o secvenţă de forma s 0 s 1 s n. 3 Unei stări s îi asociem o valoare z şi definim f (z) astfel încât, dacă starea s corespunde problemei iniţiale, atunci f (z) = optim R(x 0,..., x m 1 ) D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 5 / 52
Prezentarea generală a paradigmei Modelul matematic 4 Aplicarea Principiului de Optim pentru obţine o relaţie de recurenţă. Principiul de optim (PO) afirmă că o subpolitică a unei politici optimale este la rândul ei optimală. Deoarece este posibil ca PO să nu aibă loc, rezultă că trebuie verificată validitatea relaţiei de recurenţă. 5 Principiul de optim conduce la obţinerea unei ecuaţii funcţionale de forma: f (z) = optim y [H(z, y, f (T (z, y)))] (1) unde: s şi s sunt două stări astfel încât una se obţine din cealaltă aplicând decizia d, z este valoarea asociată stării s, T (z, y) calculează valoarea stării s, iar H exprimă algoritmul de calcul al valorii f (z) dat de decizia d. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 6 / 52
Prezentarea generală a paradigmei Modelul matematic 6 Relaţia de mai sus poate fi interpretată astfel: dintre toate deciziile care se pot lua în starea s (sau care conduc la starea s), se alege una care dă valoarea optimă în condiţiile în care politica aplicată în continuare (sau până atunci) este este şi ea optimă. 7 Relaţia (1) poate fi dovedită utilizând inducţia şi reducerea la absurd. Deoarece este posibil ca formulările pentru T () şi sau H() să fie neadecvate, ducând la cazul în care principiul de optim nu are loc, este necesară verificarea acestuia pentru problema supusă rezolvării. 8 Rezolvarea ecuaţiilor recurente (1) conduce la determinarea unui şir de decizii ce în final constituie politica optimă prin care se determină valoarea funcţiei obiectiv. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 7 / 52
Prezentarea generală a paradigmei Modelul matematic 9 Calculul recurenţei rezolvând problemele de la mic la mare şi memorând valorile obţinute într-un tablou. Nu se recomandă scrierea unui program recursiv care să calculeze valorile optime. Dacă în secvenţa de decizii luate, o anumită problemă apare de mai multe ori, ea va fi calculată de algoritmul recursiv de câte ori apare. Exemplu cu numerele Fibonacci: pe tabla 10 Extragerea soluţiei optime din tablou utilizând proprietatea de substructură optimă a soluţiei, care afirmă că soluţia optimă a problemei include soluţiile optime ale subproblemelor sale. De remarcat că proprietatea de substructură optimă este echivalentă cu principiul de optim. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 8 / 52
Plan 1 Prezentarea generală a paradigmei 2 Studii de caz Distanţa între şiruri D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 9 / 52
Plan 1 Prezentarea generală a paradigmei 2 Studii de caz Distanţa între şiruri D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 10 / 52
Problema Se consideră n obiecte 1,..., n de dimensiuni (greutăţi) w 1,..., w n Z +, respectiv, şi un rucsac de capacitate M Z +. Un obiect i sau este introdus în totalitate în rucsac, x i = 1, sau nu este introdus de loc, x i = 0, astfel că o umplere a rucsacului constă dintr-o secvenţă x 1,..., x n cu x i {0, 1} şi i x i w i M. Ca şi în cazul continuu, introducerea obiectului i în rucsac aduce profitul p i Z iar profitul total este n i=1 x ip i. Problema constă în a determina o alegere (x 1,..., x n ) care să aducă un profit maxim. Deci, singura deosebire faţă de varianta continuă studiată la metoda greedy constă în condiţia x i {0, 1} în loc de x i [0, 1]. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 11 / 52
Formularea matematică funcţia obiectiv: restricţii: max n x i p i i=1 n x i w i M i=1 x i {0, 1}, i = 1,..., n w i Z +, p i Z, i = 1,..., n M Z D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 12 / 52
Definirea noţiunii de stare Rucsac(j, X ) reprezintă următoarea problemă, care este o generalizare a celei iniţiale: funcţia obiectiv: restricţii: max j x i p i i=1 j x i w i X i=1 x i {0, 1}, i = 1,..., j w i Z +, p i Z, i = 1,..., j X Z Cu f j (X ) notăm valoarea optimă pentru instanţa Rucsac(j, X ). Dacă j = 0 şi X 0, atunci f j (X ) = 0. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 13 / 52
Definirea noţiunilor de decizie şi relaţia de tranziţie Presupunem j > 0. Considerăm decizia optimă prin care starea Rucsac(j, X ) este transformată în Rucsac(j 1,?). Notăm cu (x 1,..., x j ) alegerea care dă valoarea optimă f j (X ). D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 14 / 52
Aplicarea principiului de optim Dacă x j = 0 (obiectul j nu este pus în rucsac) atunci, conform principiului de optim, f j (X ) este valoarea optimă pentru starea Rucsac(X, j 1) şi de aici f j (X ) = f j 1 (X ). Dacă x j = 1 (obiectul j este pus în rucsac) atunci, din nou conform principiului de optim, f j (X ) este valoarea optimă pentru starea Rucsac(j 1, X w j ) la care se adaugă profitul p i şi de aici f j (X ) = f j 1 (X w j ) + p j. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 15 / 52
Obţinerea recurenţei Combinând relaţiile de mai sus obţinem:, dacă X < 0 f j (X ) = 0, dacă j = 0 şi X 0 max{f j 1 (X ), f j 1 (X w j ) + p j }, dacă j > 0 şi X 0 (2) Am considerat f j (X ) = dacă X < 0. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 16 / 52
(2) ca instanţă a relaţiei (1) Reamintim (1): f (z) = optim y [H(z, y, f (T (z, y)))] valoarea z asociată stării s este (j, X ) valoarea T (y, z) asociată stării s este (j 1, X y w j ) algoritmul H este f j 1 (X y w j ) + y p j, unde y {0, 1} optim y este max y {0,1} care duce la scrierea mai concisă pentru cazul j > 0 şi X 0: f j (X ) = max y {0,1} f j 1(X y w j ) + y p j D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 17 / 52
Rezolvarea problemelor de la mic la mare şi memorarea rezultatelor în tabel Fie M = 10, n = 3 şi greutăţile şi profiturile date de următorul tabel: i 1 2 3 w i 3 5 6 p i 10 30 20 Valorile optime pentru subprobleme sunt calculate cu ajutorul relaţiilor 2 şi pot fi memorate într-un tablou bidimensional astfel: X 0 1 2 3 4 5 6 7 8 9 10 f 0 0 0 0 0 0 0 0 0 0 0 0 f 1 0 0 0 10 10 10 10 10 10 10 10 f 2 0 0 0 10 10 30 30 30 40 40 40 f 3 0 0 0 10 10 30 30 30 40 40 40 Tabloul de mai sus este calculat linie cu linie: pentru a calcula valorile de pe o linie sunt consultate numai valorile de pe linia precedentă. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 18 / 52
Analiza Tabloul de mai sus are dimensiunea n m (au fost ignorate prima linie şi prima coloană). Dacă m = O(2 n ) rezultă că atât complexitatea spaţiu cât şi cea timp sunt exponenţiale. Privind tabloul de mai sus observăm că există multe valori care se repetă. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 19 / 52
Rafinare În continuare ne punem problema memorării mai compacte a acestui tablou. Construim graficele funcţiilor f 0, f 1, f 2 şi f 3 pentru exemplul de mai sus. Avem: {, X < 0 f 0 (X ) = 0, X 0 Notăm cu g 0 funcţia dată de: g 0 (X ) = f 0 (X w 1 ) + p 1 = {, X < 3 10, 3 X D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 20 / 52
Rafinare Graficele funcţiilor f 0 şi g 0 : 10 3 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 21 / 52
Rafinare Funcţia f 1 se calculează prin:, X < 0 f 1 (X ) = max{f 0 (X ), g 0 (X )} = 0, 0 X < 3 10, 3 X Notăm cu g 1 funcţia dată prin:, X < 5 g 1 (X ) = f 1 (X w 2 ) + p 2 = 30, 5 X < 8 40, 8 X D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 22 / 52
Rafinare Graficele funcţiilor f 1 şi g 1 : 40 30 10 3 10 3 5 8 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 23 / 52
Rafinare Funcţia f 2 se calculează prin:, X < 0 0, 0 X < 3 f 2 (X ) = max{f 1 (X ), g 1 (X )} = 10, 3 X < 5 30, 5 X < 8 40, 8 X În continuare, notăm cu g 2 funcţia dată prin:, X < 6 20, 6 X < 9 g 2 (X ) = f 2 (X w 3 ) + p 3 = 30, 9 X < 11 50, 11 X < 14 60, 14 X D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 24 / 52
Rafinare Graficele funcţiilor f 2 şi g 2 : 40 30 10 3 5 60 50 40 30 20 10 8 3 5 6 8 9 11 14 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 25 / 52
Rafinare Funcţia f 3 se calculează prin:, X < 0 0, 0 X < 3 10, 3 X < 5 f 3 (X ) = max{f 2 (X ), g 2 (X )} = 30, 5 X < 8 40, 8 < X 11 50, 11 X < 14 60, 14 X D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 26 / 52
Rafinare Graficul funcţiei f 3 : 60 50 40 30 10 3 5 8 11 14 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 27 / 52
Rafinare Se remarcă faptul că funcţiile f i şi g i sunt funcţii în scară. Graficele acestor funcţii pot fi reprezentate prin mulţimi finite din puncte din plan. De exemplu, graficul funcţiei f 2 este reprezentat prin mulţimea {(0, 0), (3, 10), (5, 30), (8, 40)}. X 0 1 2 3 4 5 6 7 8 9 10 f 0 0 0 0 0 0 0 0 0 0 0 0 f 1 0 0 0 10 10 10 10 10 10 10 10 f 2 0 0 0 10 10 30 30 30 40 40 40 f 3 0 0 0 10 10 30 30 30 40 40 40 O mulţime care reprezintă o funcţie în scară conţine acele puncte în care funcţia face salturi. Graficul funcţiei g i se obţine din graficul funcţiei f i printr-o translaţie iar graficul funcţiei f i+1 se obţine prin interclasarea graficelor funcţiilor f i şi g i. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 28 / 52
Rafinare În general, fiecare f i este complet specificat de o mulţime S i = {(X j, Y j ) j = 0,..., r} unde Y j = f i (X j ). Presupunem X 1 < < X r. Analog, funcţiile g i sunt reprezentate prin mulţimile T i = {(X + w i, Y + p i ) (X, Y ) S i }. Notăm T i = τ(s i ) şi S i+1 = µ(s i, T i ). Mulţimea S i+1 se obţine din S i şi T i prin interclasare. Algoritmul pentru µ: Se consideră o variabilă L care ia valoarea 1 dacă graficul lui f i+1 coincide cu cel al lui f i şi cu 2 dacă el coincide cu cel al lui g i. Deoarece (0, 0) aparţine graficului rezultat, considerăm L = 1, j = 1 şi k = 1. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 29 / 52
Rafinare Presupunând că la un pas al interclasării se compară (X j, Y j ) S i cu (X k, Y k ) T i atunci: dacă L = 1: dacă X j < X k atunci adaugă (X j, Y j ) în S i+1 şi se incrementează j; dacă X j = X k : dacă Y j > Y k atunci adaugă (X j, Y j ) în S i+1 şi se incrementează j şi k; dacă Y j < Y k atunci adaugă (X k, Y k ) în S i+1, L = 2 şi se incrementează j şi k; dacă X j > X k atunci, dacă Y k > Y j adaugă (X k, Y k ) în S i+1, L = 2 şi se incrementează k; dacă L = 2: dacă X j < X k atunci, dacă Y j > Y k adaugă (X j, Y j ) în S i+1, L = 1 şi se incrementează j; dacă X j = X k : dacă Y j < Y k atunci adaugă (X k, Y k ) în S i+1 şi se incrementează j şi k; dacă Y j > Y k atunci adaugă (X j, Y j ) în S i+1, L = 1 şi se incrementează j şi k; dacă X j > X k atunci adaugă (X k, Y k ) în S i+1 şi se incrementează k; D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 30 / 52
Rafinare Rămâne de extras soluţia optimă din S n. Considerăm mai întâi cazul din exemplul de mai sus. Se caută în S n = S 3 perechea (X j, Y j ) cu cel mai mare X j pentru care X j M. Obţinem (X j, Y j ) = (8, 40). Deoarece (8, 40) S 3 şi (8, 40) S 2 rezultă f optim (M) = f optim (8) = f 3 (8) = f 2 (8) şi deci x 3 = 0. Perechea (X j, Y j ) rămâne neschimbată. Pentru că (X j, Y j ) = (8, 40) este în S 2 şi nu este în S 1, rezultă că f optim (8) = f 1 (8 w 2 ) + p 2 şi deci x 2 = 1. În continuare se ia (X j, Y j ) = (X j w 2, Y j p 2 ) = (8 5, 40 30) = (3, 10). Pentru că (X j, Y j ) = (3, 10) este în S 1 şi nu este în S 0, rezultă că f optim (3) = f 1 (3 w 1 ) + p 1 şi deci x 1 = 1. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 31 / 52
Rafinare Metoda poate fi descrisă pentru cazul general: Iniţial se determină perechea (X j, Y j ) S n cu cel mai mare X j pentru care X j M. Valoarea Y j constituie încărcarea optimă a rucsacului, i.e. valoarea funcţiei obiectiv din problema iniţială. Pentru i = n 1,..., 0: dacă (X j, Y j ) este în S i, atunci f i+1 (X j ) = f i (X j ) = Y j şi se face x i+1 = 0 (obiectul i + 1 nu este ales); dacă (X j, Y j ) nu este în S i, atunci f i+1 (X j ) = f i (X j w i+1 ) + p i+1 = Y j şi se face x i+1 = 1 (obiectul i + 1 este ales), X j = X j w i+1 şi Y j = Y j p i+1. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 32 / 52
Algoritmul rafinat rucsacvd(n, w, p, valopt, x) { S 0 = {(0, 0)}; T 0 = {(w 1, p 1 )}; for (i = 1; i < n; ++i) { S i (X) = µ(s i 1, T i 1 ) T i = {(X + w i, Y + p i ) (X, Y) S i } } determină (X j, Y j ) cu X j = max{x i (X i, Y i ) S n, X i M} for (i = n-1; i 1; --i) if ((X j, Y j ) S i ) then x i+1 = 0 else { x i+1 = 1 X j = X j w i+1 Y j = Y j p i+1 } } D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 33 / 52
Analiza algoritmului rafinat Notăm m = n i=0 S i. Deoarece T i = S i rezultă că S i+1 2 S i şi de aici i S i i 2i = 2 n 1. Calculul lui S i din S i 1 necesită timpul Θ( S i 1 ) şi de aici calculul lui S n necesită timpul i Θ( S i ) = O(2 n ). Deoarece profiturile p i sunt numere întregi, pentru orice (X, Y ) S i, Y este întreg şi Y j i p j. Analog, pentru că dimensiunile w i sunt numere întregi, pentru (X, Y ) S i, X este întreg şi X j i w j. Deoarece perechile (X, Y ) cu X > M nu interesează, ele pot să nu fie incluse în mulţimile S i. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 34 / 52
Analiza algoritmului rafinat De aici rezultă că numărul maxim de perechi (X, Y ) distincte din S i satisface relaţiile: S i 1 + i j=1 w j S i M care implică i S i 1 + min w j, M Relaţia de mai sus permite o estimare mai precisă a spaţiului necesar pentru memorarea mulţimilor S i în cazul unor probleme concrete. În ceea ce priveşte timpul, făcând calculele rezultă că algoritmul are complexitatea timp O(min(2 n, n n i=1 p i, nm)). j=1 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 35 / 52
Distanţa între şiruri Plan 1 Prezentarea generală a paradigmei 2 Studii de caz Distanţa între şiruri D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 36 / 52
Distanţa între şiruri Problema Se consideră două şiruri α = a 1 a n şi β = b 1 b n formate cu litere dintr-un alfabet A. Asupra şirului α se pot face următoarele operaţii: Ştergere: S(i) şterge litera de pe poziţia i; Inserare: I (i, c) inserează litera c pe poziţia i; Modificare: M(i, c) înlocuieşte litera de pe poziţia i cu c. Problema constă în determinarea unei secvenţe de operaţii de lungime minimă care transformă pe α în β. Exemplu: Fie α = carnet, β = paleta. O secvenţă de transformări este carnet par net palnet palet paleta. Transformările efectuate sunt M(1, p), M(3, l), S(4) şi I (6, a). Există o altă secvenţă mai scurtă? sfex D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 37 / 52
Distanţa între şiruri Analiza domeniului problemei Lemă Fie s = (... T (i, ), T (j, )...) o secvenţă optimă (de lungime minimă) care transformă pe α în β. Atunci există k, l astfel încât secvenţa s = (... T (k, ), T (l, )...), obţinută din s prin interschimbarea celor două operaţii T şi T şi în rest rămânând neschimbată, este de asemenea o secvenţă optimă care transformă pe α în β. Corolar Există o secvenţă optimă care dacă efectuează transformările: α = α 0 α 1 α t = β atunci pentru orice i, α i β, unde prin am notat lungimea şirului. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 38 / 52
Distanţa între şiruri Analiza domeniului problemei Lemă Are loc: (i) d(α, α) = 0; (ii) d(α, β) = d(β, α); (iii) d(α, γ) d(α, β) + d(β, γ). Observaţie: Lema de mai sus arată că d(α, β) este o metrică. De aici şi numele problemei. sfobs D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 39 / 52
Distanţa între şiruri Noţiunea de stare DS(α i, β j ) corespunzătoare transformării subşirului α i = a 1... a i în β j = b 1... b j şi prin d[i, j] valoarea optimă d(α i, β j ). Dacă i = 0, α 0 este şirul vid şi β j se obţine prin j inserări: deci d[0, j] = j. Dacă j = 0, atunci β j se obţine prin i ştergeri şi avem d[i, 0] = i. În continuare presupunem i, j > 0. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 40 / 52
Distanţa între şiruri Decziile şi Principiul de optim Considerăm decizia optimă prin care starea DS(a 1... a i, b 1... b j ) este transformată într-o stare DS(a 1... a i, b 1... b j ) cu (i < i şi j j) sau (i i şi j < j). Distingem următoarele situaţii: 1 Dacă a i = b j atunci i = i 1, j = j 1 şi, aplicând principiul de optim, obţinem d[i, j] = d[i 1, j 1]. 2 DS(a 1,..., a i, b 1,..., b j ) se obţine prin ştergere. Rezultă i = i 1, j = j şi, aplicând principiul de optim, obţinem d[i, j] = d[i 1, j] + 1. 3 DS(a 1,..., a i, b 1,..., b j ) se obţine prin inserare. Avem i = i, j = j 1 şi, aplicând principiul de optim, obţinem d[i, j] = d[i, j 1] + 1. Din corolarul lemei precedente rezultă că această operaţie poate fi realizată numai dacă i < j. 4 DS(a 1,..., a i, b 1,..., b j ) se obţine prin modificare. Avem i = i 1, j = j 1 şi, aplicând principiul de optim, obţinem d[i, j] = d[i 1, j 1] + 1. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 41 / 52
Distanţa între şiruri Relaţia de recurenţă Deoarece d[i, j] trebuie să fie minimă, rezultă: d[i, j] = min{d[i 1, j] + 1, d[i 1, j 1] + δ(i, j), d[i, j 1] + 1} (3) unde δ(i, j) = { 0, dacă a i = b j 1, dacă a i b j D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 42 / 52
Distanţa între şiruri (3) ca instanţă a relaţiei (1) Reamintim (1): f (z) = optim y [H(z, y, f (T (z, y)))] valoarea z asociată stării s este [i, j] valoarea T (y, z) asociată stării s este [i y i, j y j ], unde y i, y j {0, 1}, y i + y j > 0 algoritmul H este d[i y i, j y j ] + δ(i, j, y i, y j ), unde { 0, dacă a i = b j y i + y j = 2 δ(i, j, y i, y j ) = 1, dacă (a i b j y i + y j = 2) y i + y j = 1 optim este min y y i,y j {0,1},y i +y j >0 care duce la scrierea mai concisă pentru cazul i, j > 0: d[i, j] = min d[i y i, j y j ] + δ(i, j, y i, y j ) y i,y j {0,1},y i +y j >0 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 43 / 52
Distanţa între şiruri Calculul lui d[i,j]: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 a 6 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 44 / 52
Distanţa între şiruri Determinarea secvenţei optime Notăm cu L lista care înregistrează transformările soluţiei optime. Se procedează în modul următor: iniţial se consideră i = n; j = n; şi L = ( ) (lista vidă); următorul proces se repetă până când i şi j devin 0: dacă d[i, j] = d[i 1, j 1] atunci L rămâne neschimbată şi se face i = i-1; j = j-1; altfel, dacă d[i, j] = d[i 1, j 1] + 1 atunci se face L = (M(i, b j ), L) şi i = i-1; j = j-1; altfel, dacă d[i, j] = d[i 1, j] + 1 atunci se face L = (S(i), L) şi i = i-1; altfel, dacă d[i, j] = d[i, j 1] + 1 atunci se face L = (I (i, b j ), L) şi j = j-1. D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 45 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 M(5, r ) D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 M(5, r ) D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 M(5, r ) D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 M(5, r ), S(2) D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 M(5, r ), S(2) D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Determinarea secvenţei optime: exemplu c a m a r a 0 1 2 3 4 5 6 a 1 1 1 2 3 4 5 r 2 2 2 2 3 3 4 m 3 3 3 2 3 4 4 a 4 4 3 3 2 3 4 t 5 5 4 4 3 3 4 a 6 6 5 5 4 4 3 M(5, r ), S(2), I (1, c ) D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 46 / 52
Distanţa între şiruri Algoritmul distsir(a, b, n) { for (j = 1; j n; ++j) d[0,j] = j; for (i = 1; i n; ++i) d[i,0] = i; for (i = 1; i n; ++i) for (j = 1; j n; ++j) { δ = (a[i] == b[j])? 0 : 1; d[i, j] = min{d[i 1, j] + 1, d[i 1, j 1] + δ, d[i, j 1] + 1} } L = listavida(); i = n; j = n; repeat if (d[i,j] == d[i-1,j-1]) { i = i-1; j = j-1; } else if (d[i,j] == d[i-1,j-1]+1) { L.pushFront( M, i, b[j])); i = i-1; j = j-1; } else if (d[i,j] == d[i-1,j]+1) { L.pushFront( S, i)); i = i-1 } else { L.pushFront( I, i, b[j]); j = j-1; } until ((i = 0) && (j = 0)) } D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 47 / 52
Distanţa între şiruri Analiza Teoremă Determinarea distanţei optime şi a secvenţei optime care transformă un şir α într-un şir β, α = β = n, se poate face în timpul O(n 2 ). D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 48 / 52
Distanţa între şiruri Variaţii alte operaţii: transpoziţia: schimbă ordinea a două caractere adiacente distanţa Levenshtein (de editare) sunt admise numai inserari, stergeri si inlocuiri toate operaţiile au costul 1 distanţa Hamming sunt admise numai înlocuirile costul operaţiei este 1 este finita ori de cate ori a = b distanta episodica (episode distance) sunt admise numai inserări costul operaţiei este 1 distanţa este sau b a sau D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 49 / 52
Distanţa între şiruri Variaţii distanţa data de cea mai lungă subsecvenţă sunt admise numai inserări şi ştergeri toate operaţiile au costul 1 Exemplu: α = amxbtycsnma şi β = bancxstymcxn α = amxbtycsnma bamxbtycsnma baxbtycsnma banxbtycsnma bancxbtycsnma bancxtycsnma bancxstycsnma bancxstymcsnma bancxstymcnma bancxstymcxnma bancxstymcxna bancxstymcxn = β (a,x,t,y,c,n) este subsecventa comună este cea mai lungă? D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 50 / 52
Distanţa între şiruri Variaţii matching aproximativ peste şiruri (aproximate string matching) problema: dat un text s de lungime n, un patern p de lungime m, o distanţa d() între şiruri şi un număr k, să se determine poziţiile j din textul s astfel încât să existe i cu d(p, s[i..j]) k distanţa Levenshtein: string matching with k differences distanţa Hamming: string matching with k missmatches distanţa episodica: episode matching (modeleaza cazul cand se cauta o secventa de evenimente intr-o perioada scurta de timp) cea mai lungă subsecvenţă comună: exact ce spune numele D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 51 / 52
Distanţa între şiruri Variaţii procesul de cautare pentru matching aproximativ: α = p, β = s trebuie să modificăm algoritmul a.î. orice poziţie j din text este startul potenţial al unei potriviri; asta se realizează prin setarea d[0, j] = 0 calculul matricei se face pe coloane iniţial: d[i, 0] = i pentru i = 0,..., m se procesează textul caracter cu caracter presupunem că la pasul curent se procesează s j coloana j este actualizată: d[i, j] = (p i == s j )? d[i 1, j 1] : 1 + min(d[i 1, j], d[i, j 1], d[i 1, j 1]) pozitiile j pentru care d[m, j] k sunt raportate de remarcat că numai ultimele două coloane sunt necesare D. Lucanu (FII - UAIC) Programare dinamică PA 2014/2015 52 / 52