Sunteți pe pagina 1din 8

LUCRAREA DE LABORATOR NR.

4
Tema: Metoda programrii dinamice Scopul lucrrii:
1. Studierea metodei programrii dinamice. 2. Analiza i implementarea algoritmilor de programare dinamic.

Note de curs: 1. Programarea dinamic.


O problem rezolvabil prin metoda programrii dinamice trebuie adus mai nti la o form discret n timp. Deciziile care se iau pentru a obine un rezultat trebuie s se poat lua pas cu pas. De asemenea, foarte important este ordinea n care acestea se iau. Programarea dinamic este (i nu luai aceste rnduri ca pe o definiie) n esen un proces decizional n mai multe etape: n starea iniial a problemei lum prima decizie, care determin o nou stare a problemei n care lum o decizie. Termenul dinamic se refer chiar la acest lucru: problema este rezolvat n etape dependente de timp. Variabilele, sau funciile care descriu fiecare etap trebuie s fie n aa fel definite nct s descrie complet un proces, deci pentru acest lucru va trebui s rspundem la dou ntrebri: care este etapa iniial (caz n care avem de a face cu un proces decizional descendent) sau care este etapa final (caz n care avem de a face cu un proces decizional ascendent)? 2) care este regula dup care trecem dintr-o etap n alta ? De obicei aceast regul este exprimat printr-o recuren.
1)

Deoarece, avem de a face cu o problem care se rezolv n mai multe etape, nu ne mai rmne dect s vedem cum lum deciziile dintr-o etap n alta. Nu m refer aici la o relaie de recuren de care am vorbit mai sus, ci la faptul c foarte probabil apare posibilitatea ca la un anumit moment s putem alege din mai multe decizii. De exemplu, problema calculului numerelor lui Fibonaci se ncadreaz n categoria programrii dinamice deoarece: este un proces n etape; fiecrei etape k i corespunde calculul celui de al k-lea numr Fibonacci; exist o singur decizie pentru a trece la o etap superioar; Determinarea unui drum ce leag dou orae A i B i care trece printr-un numr minim de alte orae este tot o problem de programare dinamic deoarece: este un proces n etape, fiecrei etape k i corespunde determinarea unui drum de lungime k ce pleac din oraul A, dar exist mai multe decizii pentru trecerea la drumul de lungimea k + 1. n cele ce urmeaz prin strategie nelegem un ir de decizii. Conform principiului lui Bellman, numit principiul optimalitii avem: O strategie are proprietatea c oricare ar fi starea iniial i decizia iniial, deciziile rmase trebuie s constituie o strategie optim privitoare la starea care rezult din decizia anterioar. Demonstrarea corectitudinii unui algoritm de programare dinamic se face, aa cum rezult i din principiul optimalitii, prin inducie matematic.

Definiia 1. Fie P problema care trebuie rezolvat. Simbolul P codific problema iniial mpreun cu dimensiunea datelor de intrare. O subproblem Qi (care este rezolvat la etapa i) are aceeai form ca P, dar datele de intrare pe care le prelucreaz sunt mai mici n comparaie cu cele cu care lucreaz P. Cuvntul dinamic vrea s sugereze tocmai acest lucru: uniformitatea subproblemelor i rezolvarea lor n mod ascendent. Pe scurt Qi se obine din P printr-o restricionare a datelor de intrare. Din aceast definiie rezult aa-zisa dependen (mai precis incluziune) dintre subprobleme. O subproblem Qi obine alte subprobleme dac datele asupra crora opereaz Qi sunt mai mari dect datele asupra crora opereaz subproblemele coninute, deci nu este vorba doar de o simpl dependen ntre subprobleme, acestea fiind incluse una n cealalt. Exist dou tipuri de subprobleme: directe care rezult din relaia de recuren i subprobleme indirecte care de fapt sunt sub-sub-subprobleme ale problemei iniiale. De exemplu, n cazul numerelor lui Fibonacci, pentru determinarea termenului F(5) subproblemele directe sunt F(4) i F(3), iar F(2), F(1) i F(0) sunt subprobleme indirecte. Definirea relaiilor dintre etape se face recursiv. Prin prisma unui matematician acest lucru este inconvenient, dar orice informatician tie c recursivitatea nseamn resurse (timp i memorie) consumate. Pe lng inconvenienele legate de apelurile recursive, o subproblem este calculat de mai multe ori. Aceste lucruri pot fi evitate dac subproblemele se calculeaz ncepnd de jos n sus (adic de la cea mai mic la cea mai mare) i se rein rezultatele obinute. n cazul numerelor Fibonacci, cea mai mic subproblem este calcularea lui Fibonacci(0) i a lui Fibonacci(1), iar cea mai mare subproblem este calcularea lui Fibonacci(N) unde N este un numr dat. Dezvoltarea unui algoritm bazat pe programarea dinamic poate fi mprit ntr-o secven de patru pai: 1. Caracterizarea structurii unei soluii optime. 2. Definirea recursiv a valorii unei soluii optime. 3. Calculul valorii unei soluii optime ntr-o manier de tip "bottom-up". 4. Construirea unei soluii optime din informaia calculat. Paii 1-3 sunt baza unei abordri de tip programare dinamic. Pasul 4 poate fi omis dac se dorete doar calculul unei singure soluii optime. In vederea realizrii pasului 4, deseori se pstreaz informaie suplimentar de la execuia pasului 3, pentru a uura construcia unei soluii optimale. O problem de programare dinamic se poate prezenta sub forma unui graf orientat. Fiecrui nod i corespunde o etap (sau o subproblem), iar din relaiile de recuren se deduce modul de adugare a arcelor. Mai precis, vom aduga un arc de la starea (etapa) i la starea (etapa) j dac starea j depinde direct de starea i. Dependena direct dintre etape este dat de relaiile de recuren. Construirea unui astfel de graf este echivalent cu rezolvarea problemei. Determinarea irului deciziilor care au adus la soluie se reduce la o problem de drum n grafuri. Notm cu P, problema pe care o dorim s o rezolvm. nelesul pe care l dm lu P include i dimensiunea datelor de la intrare. Am spus anterior c o etap, sau o subproblem are aceeai form ca i problema de rezolvat la care sunt adugate cteva restricii. Pentru ca aceste probleme s poat fi calculate trebuie stabilit o ordine n care ele vor fi prelucrate. Considernd reprezentarea sub forma unui graf (nodurile corespund etapelor, muchiilor - deciziilor), va trebui s efectum o sortare topologic asupra nodurilor grafului. Fie Q0, Q1,, QN ordinea rezultat unei astfel de sortri. Prin Qi am notat o subproblem (Q0 este subproblema cea mai mic). n cazul submulimii de sum dat, Qi este chiar descompunerea lui i n sum de numere din vectorul dat. Fie Si soluia problemei Qi. Soluia subproblemei QN este soluia problemei P. Algoritmul general este: procedure Rezolva(P) {iniializeaz (S0) } for i 1 to N do progreseaz (S0, , Si-1, Si); { aceasta procedura calculeaz soluia problemei Qi pe baza soluiilor problemelor

Q0, , Qi-1, cu o recuren de jos n sus.} return(SN) Demonstrarea corectitudinii unui astfel de algoritm se face prin inducie dup i. Referitor la complexitatea unui algoritm de programare dinamic, putem spune c aceasta depinde de mai muli factori: numrul de stri, numrul de decizii cu care se poate trece ntr-o stare, complexitatea subproblemei iniiale (Q0) . Ceea ce apare ns n toate problemele, este numrul de stri (etape). Deci complexitatea va avea forma O(N). Noiunea de complexitate pseudo polinomial, de asemenea este legat uneori de complexitatea unui algoritm de programare dinamic. Fie D mulimea tuturor intrrilor corecte pentru o problem dat. Definim dou funcii: Max: D Z+ i Lungimea: D Z+. Funcia Max indic valoarea maxim a datelor de intrare, iar funcia Lungimea indic lungimea lor. Un algoritm este numit algoritm pseudo polinomial, dac funcia sa de complexitate este mrginit superior de o funcie polinomial n dou variabile: Max[I] i Lungime[I]. Prin definiie orice algoritm polinomial este i pseudo polinomial, deoarece se execut ntr-un timp mrginit de un polinom de Lungime[I], dar nu toi algoritmii pseudo-polinomiali sunt polinomiali. Pentru problemele care au proprietatea c Max[I] este mrginit de o funcie polinomial n variabila Lungime [I] nu exist nici o distincie ntre algoritmii polinomiali i cei pseudo-polinomiali. S vedem cnd se poate i cnd nu se poate construi un algoritm pseudo-polinomiali? Spunem despre o problem c este number-problem dac nu exist nici o funcie polinomial p, astfel nct Max[I] p(Lungime[I]) pentru orice intrare I corect. Singurele probleme NP-complete care sunt candidate pentru a fi rezolvate prin algoritmi pseudopolinomial se afl n aceast clas de probleme. Exist mai multe clasificri ale problemelor de programare dinamic: 1. Dup natura deciziilor pot fi deterministe sau nedeterministe. La cele nedeterministe, n scrierea relaiilor de recuren intervine i o probabilitate (probabilitatea ca produsul s fie vndut, ca individul x s ajung ntr-un punct dat, ca moneda s cad pe partea cu stema, ca o main s se strice dup ce a produs un numr de piese.) 2. Dup valoarea deciziilor pot fi de optimizare (determinarea drumurilor de cost minim ntre dou noduri ale unui graf), de neoptimizare (determinarea numerelor Fibonacci). 3. Dup numrul de dimensiuni (sau numrul de parametri ai funciilor de recuren) pot fi unidimensionale (precum numerele lui Fibonacci), sau multidimensionale. 4. Dup numrul deciziilor care se pot lua la un pas pot fi unidecizionale (ca numerele lui Fibonacci), sau multidecizionale (ca drumul de lungime minim ntre dou noduri ale unui graf). Problemele unidecizionale sunt de obicei de neoptimizare. 5. Dup direcia deciziilor putem avea programare dinamic nainte n care starea i se calculeaz n funcie de strile i + 1, i + 2, , sau programare dinamic napoi n care starea i se calculeaz n funcie de strile i 1, i 2, .

1.1. Problema nmulirii irului de matrice


Problema nmulirii irului de matrice poate fi enunat n urmtorul mod: dndu-se un ir (A1,A2,...,An )de n matrice, unde, pentru i = 1,2,..., n, matricea Ai are dimensiunile pi-1 x pi s se parantezeze complet produsul A1A2...An, astfel nct s se minimizeze numrul de nmuliri scalare.

1.1.1. Structura unei parantezri optime


Primul pas din schema general a metodei programrii dinamice const n caracterizarea structurii unei soluii optimale. Pentru problema nmulirii irului de matrice, aceasta este descris n continuare. Pentru simplitate, vom adopta convenia de notare Ai..j pentru matricea care rezult n urma evalurii produsului AiAi+1...Aj. O parantezare optim a produsului A1A2...An mparte produsul ntre Ak i Ak+1 pentru un anumit ntreg k din intervalul 1 k < n. Aceasta nseamn c, pentru o valoare a lui k, mai nti calculm matricele A1..k. i Ak+1..n i apoi, le nmulim pentru a produce rezultatul final A1..n. Costul acestei parantezri optime este, deci, costul calculului matricei A1..k plus costul calculului matricei Ak+1..n, plus costul nmulirii celor dou matrice.

Observaia cheie este c parantezarea subirului ''prefix" A1A2...Ak, n cadrul parantezrii optime a produsului A1A2...An, trebuie s fie o parantezare optim pentru A1A2...Ak. De ce? Dac ar fi existat o modalitate mai puin costisitoare de parantezare a lui A1A2...Ak, nlocuirea respectivei parantezri n parantezarea lui A1A2...An ar produce o alt parantezare pentru A1A2...An al crei cost ar fi mai mic dect costul optimului, ceea ce este o contradicie. O observaie asemntoare este valabil i pentru parantezarea subirului Ak+1Ak+2 ...An n cadrul parantezrii optime a lui A1A2...An: aceasta trebuie s fie o parantezare optim pentru Ak+1Ak+2 ...An. Prin urmare, o soluie optim a unei instane a problemei nmulirii irului de matrice conine soluii optime pentru instane ale subproblemelor. Existena substructurilor optime n cadrul unei soluii optime este una dintre caracteristicile cadrului de aplicare a metodei programrii dinamice.

1.1.2. O soluie recursiv


Al doilea pas n aplicarea metodei programrii dinamice este definirea valorii unei soluii optime n mod recursiv, n funcie de soluiile optime ale subproblemelor. n cazul problemei nmulim irului de matrice, o subproblem const n determinarea costului minim al unei parantezri a irului AiAi+1...Aj, pentru 1 i j n. Fie m[i,j] numrul minim de nmuliri scalare necesare pentru a calcula matricea Ai..j; costul modalitii optime de calcul a lui A1..n va fi, atunci, m[l,n]. Putem defini m[i,j] n mod recursiv, dup cum urmeaz. Dac i = j. irul const dintr-o singur matrice Ai..i = Ai i, pentru calculul produsului nu este necesar nici o nmulire scalar. Atunci, m[i,i] = 0 pentru i = 1. 2,...,n. Pentru a calcula m[i,j] cnd i < j, vom folosi structura unei soluii optimale gsite la pasul 1. S presupunem c descompunerea optim n paranteze mparte produsul AiAi+1...Aj ntre Ak i Ak+1, cu i k < j. Atunci. m[i,j] este egal cu costul minim pentru calculul subprodusului Ai..k i Ak+1..j , plus costul nmulirii acestor dou matrice rezultat. Deoarece evaluarea produsului Ai..kAk+i..j necesit pi-1pkpj nmuliri scalare, vom obine m[i, j ] = m[i, k ] + m[k + 1, j ] + pi 1 pk p j . Aceasta ecuaie recursiv presupune cunoaterea valorii lui k, lucru care nu este posibil. Exist doar j - i valori posibile pentru k, i anume k = i, i + 1,... ,j - 1. Deoarece parantezarea optim trebuie s foloseasc una dintre aceste valori pentru k, va trebui s le verificm pe toate pentru a o putea gsi pe cea mai bun. Atunci, definiia recursiv a costului minim a parantezrii produsului AiAi+1...Aj, devine dac i = j , 0 m[i, j ] = min{m[i, k ] + m[k + 1, j ] + pi 1 pk p j } dac i < j . ik < j (16.2)

Valorile m[i,j] exprim costul soluiilor optime ale subproblemelor. Pentru a putea urmri modul de construcie a soluiei optime, s definim s[i,j] care va conine valoarea k pentru care mprirea produsului AiAi+1...Aj produce o parantezare optim. Aceasta nseamn c s[i,j] este egal cu valoarea k pentru care m[i, j ] = m[i, k ] + m[k + 1, j ] + pi 1 pk p j .

1.1.3. Calculul costului optimal


n acest moment, este uor s scriem un algoritm recursiv bazat pe recurena (16.2) care calculeaz costul minim m[1,n] al produsului A1A2 ... An. Un algoritm recursiv poate ntlni fiecare subproblem de mai multe ori pe ramuri diferite ale arborelui su de recuren. Aceast proprietate de suprapunere a subproblemelor este a doua caracteristic a programrii dinamice. n loc s calculm recursiv soluia recurenei (4.2), vom aplica cel de-al treilea pas al schemei generale a metodei programrii dinamice i vom calcula costul optimal cu o abordare "bottom-up". Algoritmul urmtor presupune c matricea A, are dimensiunile pi-1 x pi, pentru i = l,2,...,n. Intrarea este secvena (p0,p1, ... ,pn), unde lungime[p] = n + 1. Procedura folosete un tablou auxiliar m[1..n, 1..n] pentru costurile m[i,j] i un tablou auxiliar s[1..n, 1..n] care nregistreaz acea valoare a lui k pentru care s-a obinut costul optim n calculul lui m[i,j]. ORDINE IR MATRICE(p)

1: n lungime[p] -1 2: for i l,n do 3: m[i,i]0 4: for l 2,n do 5: for i 1, n l + 1 do 6: j i +l 1 7: m[i,j] 8: for k i, j 1 do 9: q m[i, k] + m[k + 1, j] + pi-1pkpj 10: if q < m[i, j] then 11: m[i, j] q 12: s[i, j] k 13: return m, s Algoritmul completeaz tabloul m ntr-un mod ce corespunde rezolvrii problemei parantezrii unor iruri de matrice de lungime din ce n ce mai mare. Ecuaia (4.2) arat c m[i,j], costul de calcul al produsului irului de ji+1 matrice, depinde doar de costurile calculrii produselor irurilor de mai puin de ji+1 matrice. Aceasta nseamn c, pentru k = i, i + 1,... ,j - 1, matricea Ai..k. este un produs de k i+1<ji +1 matrice, iar matricea Ak+i..j este un produs de j k < j i + 1 matrice. Algoritmul iniializeaz, mai nti, m[i, i] 0 pentru i = 1, 2,..., n (costul minim al irurilor de lungime 1) n liniile 2-3. Se folosete, apoi, recurena (4. 2) pentru a calcula m[i,i+ 1] pentru i = 1,2,..., n 1 (costul minim al irurilor de lungime 2) la prima execuie a ciclului din liniile 4 12. La a doua trecere prin ciclu, se calculeaz m[i,i+2] pentru i = 1,2,...,n 2 (costul minim al irurilor de lungime 3) etc. La fiecare pas, costul m[i,j] calculat pe liniile 9 12 depinde doar de intrrile m[i,k] i m[k + 1,j] ale tabloului, deja calculate. 1.1.4. Construirea unei soluii optime Dei algoritmul ORDINE-IR-MATRICE determin numrul optim de nmuliri se necesare pentru calculul produsului irului de matrice, acesta nu prezint n mod direct, trebuie fcut nmulirea. Pasul 4 al schemei generale a metodei programrii dinamice urmeaz construirea unei soluii optime din informaia disponibil. n acest caz particular, vom folosi tabloul s[1..n,1..n] pentru a determina modul optim de nmulire a matricelor. Fiecare element s[i,j] conine valoarea lui k pentru care parantezarea optim a produsului AiAi+1...Aj mparte produsul ntre Ak i Ak+1. Atunci tim c, n produsul final de calcul al matricei A1..n, optimul este A1..s[1,n] As[1,n]+1..n. nmulirile anterioare determinate recursiv, deoarece s[1,s[1,n]] determin ultima nmulire matriceal din calculul lui A1..s[1,n] i s[s[1,n]+1,n] determin ultima nmulire matriceal din calculul lui As[1,n] - .Urmtoarea procedur recursiv calculeaz produsul irului de matrice Ai..j, fiind date matricea A = (A1,A2, ...., An), tabloul s calculat de ORDINE-IR-MATRICE i indicii i i j. Apelul este NMULIRE-IR-MATRICE (A,s,1,n).
NMULIRE-IR-MATRICE

(A,s,1,n)

1: 2: 3: 4: 5: 6:

if j > i then X NMULIRE-IR-MATRICE (A, s, i, s[i,j]) Y NMULIRE-IR-MATRICE (A, s, s[i,j]+1, j) return NMULIRE-IR-MATRICE (X,Y) else return Ai

1.2. Cel mai lung subir comun


Urmtoarea problem pe care o vom lua n considerare este problema celui mai lung subir comun. Un subir al unui ir dat este irul iniial din care lipsesc unele elemente (eventual nici unul). n mod formal, dndu-se irul X = (x1x2,... ,Xm), un alt ir Z = (Z1,Z2,... ,Zk) este un subir al lui X dac exist un ir strict cresctor de indici din X, (i1,i2,....,ik), astfel nct, pentru toate valorile j= 1, 2,..., k, avem xi j = z j . De exemplu, Z = (B, C, D, B) este un subir al lui X = (A, B, C, B, D, A, B), secvena de indici corespunztoare fiind (2,3,5,7).

Dndu-se dou iruri X i Y, spunem c irul Z este un subir comun pentru X i Y dac Z este un subir att pentru X ct i pentru Y. De exemplu, dac X = (A, B, C, B, D, A, B) i Y = (B, D, C, A, B, A), irul (B, C, A) este un subir comun pentru X i Y. irul (B, C, A) nu este cel mai lung subir comun (CMLSC) pentru X i Y, deoarece are lungimea 3, iar irul (B, C, B, A), care este de asemenea subir comun lui X i Y, are lungimea 4. irul (B, C, B, A) este un CMLSC pentru X i Y, la fel i irul (B, D, A, B), deoarece nu exist un subir comun de lungime cel puin 5. n problema celui mai lung subir comun, se dau dou iruri X = (x1x2,... ,xm) i Y = (y1,y2,...,yn) i se dorete determinarea unui subir comun de lungime maxim pentru X i Y. Aceast seciune va arta c problema CMLSC poate fi rezolvat eficient prin metoda programrii dinamice. 1.2.1. Caracterizarea celui mai lung subir comun O abordare prin metoda forei brute pentru rezolvarea problemei CMLSC const n enumerarea tuturor subirurilor lui X i verificarea dac acestea constituie un subir i pentru Y, memornd cel mai lung subir gsit. Fiecare subir al lui X corespunde unei submulimi a indicilor lui X (1,2,..., m). Exist 2m subiruri pentru X i, deci, aceast abordare necesit un timp exponenial, ceea ce o face inabordabil pentru iruri de lungimi mari. Problema CMLSC are proprietatea de substructur optim, aa cum vom arta n urmtoarea teorem. Clasa natural de subprobleme corespunde unor perechi de ''prefixe'' ale celor dou iruri de intrare. Mai precis, dndu-se un ir X = (x1x2,... ,xm), definim prefixul i al lui X, pentru i = 0,1,..., m, ca fiind Xi = (x1x2,... ,xi). De exemplu, dac X=(A, B, C, B, D, A, B), atunci X4 =(A, B, C, B) iar X0 este irul vid. Teorema 1. (Substructura optimal a unui CMLSC) Fie irurile X = (x1x2,... ,xm) i Y = (y1,y2,...,yn) i fie Z=(Z1,Z2,... ,Zk) un CMLSC pentru X i Y. 1. Dac xm = yn, atunci zk = xm = yn i Zk-1 este un CMLSC pentru Xm-1 i Yn-1. 2. Dac xm yn, atunci, din zk xm rezult c Z este un CMLSC pentru Xm-1 i Y. 3. Dac xm yn , atunci, din zk yn rezult c Z este un CMLSC pentru X i Yn-1. Demonstraie. (1) Dac zk xm atunci putem aduga xm = yn la Z pentru a obine un subir comun a lui X i Y de lungime k + 1. contrazicnd presupunerea c Z este cel mai lung subir comun pentru X i Y. Deci, va trebui s avem zk = xm = yn. Prefixul Zk-1 este un subir comun de lungime k 1 pentru Xm-1 i Yn-1. Dorim s demonstrm c este un CMLSC. S presupunem, prin absurd. c exist un subir W comun pentru Xm-1 i Yn-1, a crui lungime este fie mai mare dect k 1. Atunci, adugnd la W elementul xm = yn se va forma un subir comun a lui X i Y a crui lungime este mai mare dect k, ceea ce este o contradicie. (2) Dac zk xm , atunci Z este un subir comun pentru Xm-1 i Y . Dac ar exista un subir comun W al lui Xm-1 i Y , cu lungime mai mare dect k, atunci W ar fi i un subir comun al lui Xm i Y, contrazicnd presupunerea c Z este un CMLSC pentru X i Y. (3) Demonstraia este simetric celei de la (2). Caracterizarea din teorema 4.1 arat c un CMLSC al dou iruri conine un CMLSC pentru prefixele celor dou iruri. Atunci, problema CMLSC are proprietatea de substructur optimal. O soluie recursiv are, de asemenea, proprietatea de suprapunere a problemelor, dup cum vom arta n cele ce urmeaz. 1.2.2. O soluie recursiv a subproblemelor Teorema 4.1 implic faptul c exist fie una, fie dou probleme care trebuie examinate pentru gsirea unui CMLSC pentru X = (x1x2,... ,xm) i Y = (y1,y2,...,yn). Dac xm = yn , trebuie gsit un CMLSC pentru Xm-1 i Yn-1. Adugarea elementului xm = yn la acest CMLSC produce un CMLSC pentru X i Y. Dac xm yn , atunci trebuie rezolvate dou subprobleme: gsirea unui CMLSC pentru Xm-1 i Y i gsirea unui CMLSC pentru X i Yn-1. Cel mai lung CMLSC dintre acestea dou va fi CMLSC pentru X i Y. Se poate observa c problema CMLSC se descompune n subprobleme suprapuse. Pentru a gsi un CMLSC al irurilor X i Y, va trebui, probabil, calculat CMLSC pentru X i i Yn-1 respectiv, pentru Xm-1 i Y . Dar fiecare dintre aceste subprobleme conine sub-subproblema gsirii CMLSC pentru Xm-1 i Yn-1. Multe alte subprobleme au n comun sub-subprobleme. Ca i problema nmulirii irului de matrice, soluia recursiv pentru problema CMLSC implic stabilirea unei recurene pentru costul unei soluii optime. S definim c[i,j] ca lungimea unui CMLSC al

irurilor Xi, i Yj. Dac i=0 sau j=0, CMLSC are lungimea 0. Substructura optimal a problemei CMLSC produce formula recursiv

0 d a c i = 0 a u j = 0, s c[ i, j ] = c[ i 1, j 1] +1 d a ci j , > x yj = , 0i i c i m a x (c [i 1] ,c [i 1, j ] ) d a i j, >0 i x yj .

(1 6 . 5)

Calculul lungimii unui CMLSC Pe baza ecuaiei (4.5) se poate scrie un algoritm recursiv avnd timp exponenial pentru calculul lungimii unui CMLSC a dou iruri. Deoarece exist numai (mn) subprobleme distincte, vom folosi metoda programrii dinamice pentru a calcula soluiile n mod "bottom-up". LUNGIME-CMLSC(A', R) 1: m lungime[X] 2: n lungime[Y] 3: pentru i l, m execut 4: c[i,0] 0 5: pentru j 0, n execut 6: c[0,j] 0 7: pentru i 1, m execut 8: pentru j 1, n execut 9: dac xi = yj atunci 10: c[i,j] c[i 1,j 1]+ 1 11: b[i, j] ^ 12: altfel 13: dac c[i -1,j] c[i, j 1] atunci 14: c[i, j] c[i-1, j] 15: b[i, j] 16: altfel 17: c[i, j] c[i, j 1] 18: b[i, j] 19: returneaz c, b Procedura LUNGIME-CMLSC are ca date de intrare dou iruri X = (x1x2,... ,xm) i Y = (y1,y2,...,yn). Procedura memoreaz valorile c[i, j] ntr-un tablou c[0..m,0..n] ale crui elemente sunt calculate n ordinea cresctoare a liniilor. (Aceasta nseamn c se completeaz mai nti prima linie de la stnga la dreapta, apoi a doua linie i aa mai departe.) De asemenea. se construiete un tablou b[1..m, 1..n] care simplific determinarea unei soluii optimale. Intuitiv. b[i, j] indic elementul tabloului care corespunde soluiei optime a subproblemei alese la calculul lui c[i, j]. Procedura returneaz tablourile b i c; c[m, n] conine lungimea unui CMLSC pentru X i Y. Figura 16.3 conine tabloul produs de LUNGIME-CMLSC pentru irurile X = (A, B, C, B, D, A, B) i Y = (B, D, C, A, B, A). Timpul de execuie al procedurii este O(mn), deoarece calculul fiecrui element al tabloului necesit un timp O(1). Construirea unui CMLSC Tabelul b returnat de LUNGIME-CMLSC poate fi folosit pentru construcia rapid a unui CMLSC pentru X = (x1x2,... ,xm) i Y = (y1,y2,...,yn). Pur i simplu, se ncepe cu b[m, n] i se parcurge tabloul conform direciilor indicate. Ori de cte ori se ntlnete un element '' ^ " pe poziia b[i, j], aceasta nseamn c xi = yj este un element al CMLSC. Prin aceast metod, elementele CMLSC sunt regsite n ordine invers. Urmtoarea procedur recursiv tiprete un CMLSC al irurilor X i Y n ordinea corect. Apelul iniial este SCRIE-CMLSC(b, X, lungime[X], lungime[Y]). SCRIE-CMLSC (6,A,i,J)

l: dac i = 0 sau j = 0 atunci 2: revenire 3: dac b[i, j] =" ^ '' atunci 4: SCRIE-CMLSC (b, X, i 1, j 1) 5: tiprete xi 6: altfel dac b[i, j] =" " atunci 7: SCRIE-CMLSC (b, X, i 1, j) 8: altfel 9: SCRIE-CMLSC (b, X, i, j 1) Pentru tabloul b din figura 16.3, aceast procedur tiprete "BCBA". Procedura necesit un timp de O(m + n), deoarece, cel puin unul dintre i i j este decrementat n fiecare etapa a recurenei.

SARCINA DE BAZ:
De studiat metoda programare dinamic de proiectare a algoritmilor. 2. De implementat ntr-un limbaj de programare algoritmii: nmulirea optimal a unui ir de matrice; Determinarea celui mai lung subir comun a dou iruri. 3. De fcut analiza acestor algoritmi. 4. De alctuit un raport.
1.

ntrebri de control:
Descriei metoda programare dinamic. 2. De ce aceast metod se numete programare dinamic? 3. Care este diferena ntre metoda divide et impera i metoda programrii dinamice? 4. Care este clasificarea problemelor de programare dinanic? 5. Ce este un algoritm pseudo-polinomial?
1.

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