Sunteți pe pagina 1din 14

5.

Metoda programrii dinamice -----------------------------------------------------------------------------------------------------------------------

Unitatea de nvare nr. 5


METODA PROGRAMRII DINAMICE Cuprins
Introducere .......................................................................................................................... 2 5.1. O problem general .................................................................................................... 2 5.2. Metoda irului cresctor de mulimi .............................................................................. 3 5.3. Sortarea topologic ....................................................................................................... 4 5.4. Soluie final ................................................................................................................. 5 5.5. Metoda programrii dinamice. Exemple reprezentative ................................................ 6 5.6. Comentarii i rspunsuri la testele de autoevaluare ................................................... 12 5.7. Lucrare de verificare pentru studeni .......................................................................... 14 5.8. Bibliografie .................................................................................................................. 14

Dup ce vei parcurge aceast unitate de nvare, vei reui s cunoatei: noiunea de graf de dependene; metode de rezolvare precum cea a irului cresctor de mulimi i cea a sortrii topologice; noiunea de PD-arbore; parcurgerea n postordine a unui PD-arbore ca soluie final pentru metoda programrii dinamice; exemple reprezentative de probleme rezolvate prin metoda programrii dinamice.

Indicaii metodice pentru unitatea de nvare nr. 5


Materialul trebuie parcurs n ordinea sa fireasc, prezentat n continuare. Se recomand conspectarea i notarea ideilor principale, repcum i consultarea bibliografiei pentru detalii i informaii suplimentare. Timpul minim pe care trebuie s-l acordai acestei uniti de nvare este de 8 ore.

-------------------------------------------------------------------------------------------------------------------Tehnici avansate de programare 1

5. Metoda programrii dinamice -----------------------------------------------------------------------------------------------------------------------

Introducere
Vom ncepe prin a enuna o problem general i a trece n revist mai muli algoritmi de rezolvare. Abia dup aceea vom descrie metoda programrii dinamice.

5.1. O problem general


Fie A i B dou mulimi oarecare. Fiecrui element xA urmeaz s i se asocieze o valoare v(x)B. Iniial v este cunoscut doar pe XA, X. Fiecrui xA\X i asociem: AxA: mulimea elementelor din A de a cror valoare depinde v(x); fx: funcie care specific dependena de mai sus. Dac Ax={a1,...,ak}, atunci v(x)=fx(v(a1),...,v(ak)). Se mai d zA. Se cere s se calculeze, dac este posibil, valoarea v(z). Exemplul 1:
A={1,2,...,12}; A3={1,2}; A10={7,8}; X={1,2,6,7,8,9}; A4={1,2,3}; A5={1,4}; A11={8,9}; A12={10,11}.

Elementele din X au asociat valoarea 1. Fiecare funcie fx calculeaz v(x) ca fiind suma valorilor elementelor din Ax.
z=5.

Este evident c vom obine v=(1,1,2,4,5,1,1,1,1,1,2,2,4). O ordine posibil de a considera elementele lui A\X astfel nct s putem calcula valoarea asociat lor este: 3,10,11,12,4,2. Lucrurile devin mai clare dac reprezentm problema pe un graf de dependene. Vrfurile corespund elementelor din A, iar descendenii unui vrf x sunt vrfurile din Ax. Vrfurile din X apar ngroate. 5 4 3 6 10 1 2 7 8 1 2 4 9 10 3 Problema enunat nu are totdeauna soluie, aa cum se vede pe graful de dependene alturat, n care exist un circuit. z=3. 11 12

-------------------------------------------------------------------------------------------------------------------2 Tehnici avansate de programare

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------Observaii:


A poate fi chiar infinit; B este de obicei N, Z, R, {0,1} sau un produs cartezian; fx poate fi un minim, un maxim, o sum etc.

Pentru orice xA, spunem c x este accesibil dac, plecnd de la X, poate fi calculat valoarea v(x). Evident, problema are soluie dac i numai dac z este accesibil. Pentru orice xA, notm prin Ox mulimea vrfurilor observabile din x, adic mulimea vrfurilor y pentru care exist un drum de la y la x. Problema enunat are soluie dac i numai dac: 1) Oz nu are circuite; 2) vrfurile din Oz n care nu sosesc arce fac parte din X. Prezentm n continuare mai multe metode de rezolvare a problemei enunate.

5.2. Metoda irului cresctor de mulimi


Fie A o mulime finit i X o submulime a sa. Definim urmtorul ir cresctor de mulimi:
X0 = X Xk+1 = Xk {x AAx Xk}, k>0 Evident, X0 X1 ... Xk Xk+1 ...

Propoziia 1: Dac Xk+1=Xk, atunci Xk+i=Xk ,iN. Facem demonstraia prin inducie dup i. Pentru i=1 rezultatul este evident. Presupunem Xk+i=Xk i demonstrm c Xk+i+1=Xk : = cf. definiiei irului de mulimi
= = = =

Xk+i+1

Xk+i {x A AxXk+i} = cf. ipotezei de inducie Xk {x A AxXk} = cf. definiiei irului de mulimi Xk+1 = cf. ipotezei de inducie Xk.

Consecina 1: ne oprim cu construcia irului cresctor de mulimi la primul k cu Xk=Xk+1 (A este finit!); - dac aplicm cele de mai sus pentru problema general enunat, aceasta are soluie dac i numai dac zXk.
-

Vom lucra cu o partiie A=UV, unde U este mulimea curent de vrfuri a cror valoare asociat este cunoscut. -------------------------------------------------------------------------------------------------------------------Tehnici avansate de programare 3

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------U X; V A\X repeat W V for toi xV if AxU then U U {x}; V V\{x} calculeaz v(x) conform funciei fx if x=z then write v(x); stop until V=W { nu s-a avansat! } write(z, 'nu este accesibil)

Metoda irului cresctor de mulimi este larg folosit n teoria limbajelor formale, unde de cele mai multe ori ne intereseaz existena unui algoritm i nu performanele sale.

5.3. Sortarea topologic


Fie A={1,...,n} o mulime finit. Pe A este dat o relaie tranzitiv, notat prin "<". Relaia este dat prin mulimea perechilor (i,j) cu i<j. Se cere s se listeze elementele 1,..,n ale mulimii ntr-o ordine ce satisface cerina: dac i<j, atunci i apare la ieire naintea lui j. Problema enunat apare de exemplu la nscrierea unor termeni ntr-un dicionar astfel nct explicaiile pentru orice termen s conin numai termeni ce apar anterior. Este evident c problema se transpune imediat la grafurile de dependen: se cere o parcurgere a vrfurilor grafului astfel nct dac exist un arc de la i la j, atunci i trebuie vizitat naintea lui j. Observaii:
-

problema are soluie dac i numai dac graful este aciclic; dac exist soluie, ea nu este neaprat unic.

n esen, algoritmul care urmeaz repet urmtorii pai: - determin i care nu are predecesori; - l scrie; - elimin perechile pentru care sursa este i. Fie M mulimea curent de vrfuri. Iniial M=A. Fie C coada elementelor din M care nu au predecesori. Pentru fiecare iA, considerm: Si = lista succesorilor lui i; nrpredi = numrul predecesorilor lui i din mulimea M curent.

-------------------------------------------------------------------------------------------------------------------4 Tehnici avansate de programare

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------Etapa de iniializare const n urmtoarele:


Si , nrpredi0, i C ; nr 0 { nr este numrul elementelor produse la ieire } for k=1,m { m este numrul perechilor din relaia "<" } read(i,j) Si j; nrpredj nrpredj+1 for i=1,n if nrpredi=0 then i C

S observm c timpul cerut de etapa de iniializare este de ordinul O(m+n).


while C i C; write(i); calculeaz v(x) conform funciei fx if i=z then write v(i); stop for toi jSi nrpredj nrpredj-1 if nrpredj=0 then j C if nr<n then write('Nu)

Algoritmul propriu-zis, adaptat la problema general, este urmtorul:

Fiecare executare a lui while necesit un timp proporional cu Si. Dar |S1|+...+|Sn|=m, ceea ce face ca timpul de executare s fie de ordinul O(m). innd cont i de etapa de iniializare, rezult c timpul total este de ordinul O(m+n), deci liniar.

5.4. Soluie final


Etapele sunt urmtoarele: - Identificm Gz = subgraful asociat lui Oz ; - Aplicm sortarea topologic. Fie Gz=(Xz,Mz). Iniial Xz=, Mz=. Pentru a obine graful Gz executm apelul DF(z), unde procedura DF este:
procedure DF(x) x Xz for toi yAx if yXz then (y,x) Mz; DF(y) end;

Timpul este liniar. -------------------------------------------------------------------------------------------------------------------Tehnici avansate de programare 5

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------Observaie: Ar fi totui mai bine dac :


- am cunoate de la inceput Gz; - forma grafului ar permite o parcurgere mai simpl.

5.5. Metoda programrii dinamice. Exemple reprezentative


Definim un PDarbore de rdcin z ca fiind un graf de dependene n care: - x, xOz (exist drum de la x la z); - X={xgrad-(x)=0}. Exemplul 2: Urmtorul graf este un PD-arbore de rdcin z=5. 5 4 4 3 3 2 5

Un PD-arbore nu este neaprat un arbore, dar:


- poate fi pus pe niveluri: fiecare vrf x va fi pus pe nivelul egal cu lungimea celui mai lung drum de la x la z; - poate fi parcurs (cu mici modificri) n postordine;

Prin parcurgerea n postordine, vrfurile apar sortate topologic. Algoritmul de parcurgere n postordine folosete un vector parcurs pentru a ine evidena vrfurilor vizitate. Este iniializat vectorul parcurs i se ncepe parcurgerea prin apelul postord(z):
for toate vrfurile x parcurs(x) xX postord(z) unde procedura postord are forma: procedure postord(x) for toi jAx cu parcurs(j)=false postord(j) calculeaz v(x) conform funciei fx; parcurs(x)true end

Timpul de executare a algoritmului este evident liniar.

-------------------------------------------------------------------------------------------------------------------6 Tehnici avansate de programare

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------Metoda programrii dinamice se aplic problemelor care urmresc calcularea unei valori i const n urmtoarele: 1) Se asociaz problemei un graf de dependene; 2) n graf este pus n eviden un PD-arbore; problema se reduce la determinarea valorii asociate lui z (rdcina arborelui); 3) Se parcurge n postordine PD-arborele. Mai pe scurt, putem spune: Metoda programrii dinamice const n identificarea unui PD-arbore i parcurgerea sa n postordine. n multe probleme este util s cutam n PD-arbore regulariti care s evite memorarea valorilor tuturor vrfurilor. Vom ncepe cu cteva exemple foarte simple, dar care pun n eviden anumite caracteristici ale metodei programrii dinamice. Exemplul 3: irul lui Fibonacci tim c acest ir este definit astfel:
F0=0; F1=1; Fn = Fn-1 + Fn-2 , n2 Dorim s calculm Fn pentru un n oarecare.

Aici A={0,...,n}, X={0,1}, B=N, iar Ak={k-1,k-2}, k2 v(k)=Fk ; fk(a,b)=a+b, k2 Un prim graf de dependene este urmtorul:

S observm c o mai bun alegere a mulimii B simplific structura BDarborelui.


A={1,2,.,n}; B=NN; v(k)=(Fk-1, Fk); fk(a,b)=(b,a+b) v(0)=(0,1). n-1 1 2 3

i obinem algoritmul binecunoscut:


a0; b1 for i=2,n (a,b)(b,a+b) write(b)

-------------------------------------------------------------------------------------------------------------------Tehnici avansate de programare 7

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------Exemplul 4: Calculul sumei a1+ ...+an Este evident c trebuie calculate anumite sume pariale. O prim posibilitate este s considerm un graf n care fiecare vrf s fie o submulime {i1,...,ik} a lui {1,2,...,n}, cu valoarea asociat ai1+...+aik. Aceast abordare este nerealizabil: numrul de vrfuri ar fi exponenial.
{i,i+1,...,j} cu ij i cu valoarea ataat si,j=ai+...+aj. Vom nota un astfel de vrf prin (i:j). Dorim s calculm valoarea vrfului z=(1:n).

O a doua posibilitate este ca vrfurile corespund mulimilor

Putem considera mai muli PD-arbori: Arborele liniar constituit din vrfurile cu i=1. Obinem relaiile de recuren: s1,1=a1; s1,j=s1,j-1+aj , ji care corespund asociativitii la stnga: (...((a1+a2)+a3)+...). Arborele liniar constituit din vrfurile cu j=n. Acest arbore corespunde asociativitii la dreapta a sumei. Exemplul 5: Deteminarea subirului cresctor de lungime maxim. Se consider vectorul a=(a1,...,an). Se cer lungimea celui mai lung ir cresctor, precum i toate subirurile cresctoare de lungime maxim. Introducem notaiile:
nr = lungimea maxim cutat; lung(i)= lungimea maxim a subirului cresctor ce ncepe cu ai. A={1,2,...,n}; X={n}; Ai={i+1,...,n}, fi=lung(i) Evident, suntem n prezena unui PD-arbore de rdcin 1. i<n;

nr 1; lung(n)1 for i=n-1,1,-1 lung(i)1+max{lung(j)j>i & ai<aj} nr max{nr,lung(i)}

Determinarea lui nr se face astfel:

Determinarea tuturor subirurilor cresctoare de lungime maxim se face printr-un backtracking recursiv optimal. Subirurile se obin n vectorul s, iar ind reprezint ultima poziie completat din s.

-------------------------------------------------------------------------------------------------------------------8 Tehnici avansate de programare

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------for i=1,n if lung(i)=nr then ind 1; s(1)ai; scrie(i)

unde procedura scrie are forma:


procedure scrie(i) if ind=nr then write(s) else for j=i+1,n if ai<aj & lung(i)=1+lung(j) then ind++; s(ind)a(j); scrie(j); indind-1 end;

Observaie:

Dac dorim s obinem un singur subir cresctor de lungime nr, este suficient s eliminm instruciunea indind-1. nmulirea optim a unui ir de matrici Avem de calculat produsul de matrici A1A2...An, unde dimensiunile matricilor sunt respectiv (d1,d2), (d2,d3), ... ,(dn,dn+1). tiind c nmulirea matricilor este asociativ, se pune problema ordinii n care trebuie nmulite matricile astfel nct numrul de nmuliri elementare s fie minim. Presupunem c nmulirea a dou matrici se face n modul uzual, adic produsul matricilor A(m,n) i B(n,p) necesit mnp nmuliri elementare. Pentru a pune n eviden importana ordinii de nmulire, s considerm produsul de matrici A1A2A3A4 unde A1(100,1), A2(1,100), A3(100,1), A4(1,100). Pentru ordinea de nmulire (A1A2)(A3A4) sunt necesare 1.020.000 de nmuliri elementare. n schimb, pentru ordinea de nmulire (A1(A2A3))A4 sunt necesare doar 10.200 de nmuliri elementare. Fie cost(i,j) numrul minim de nmuliri elementare pentru calculul produsului Ai...Aj. Punnd n eviden ultima nmulire de matrici, obinem relaiile:
cost(i,i) = 0 cost(i,j) = min {cost(i,k)+cost(k+1,j)+didk+1dj+1 | ik<j}. Valoarea cerut este cost(1,n).

Exemplul 6:

Vrfurile grafului de dependen sunt perechile (i,j) cu ik. cost(i,j) depinde de vrfurile din stnga i de cele de deasupra. Se observ uor c suntem n prezena unui PD-arbore.

-------------------------------------------------------------------------------------------------------------------Tehnici avansate de programare 9

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------j 1 i (i,i (i,j) (j,j) i n j

Forma particular a PD-arborelui nu face necesar aplicarea algoritmului general de parcurgere n postordine: este suficient s parcurgem coloanele 2,...,n, iar pe fiecare coloan s mergem de la diagonal pn la (i,j). for j=2,n
for i=j-1,1,-1 cost(i,j) calculat ca mai sus; fie k valoarea pentru care se realizeaz minimul cost(j,i)k write cost(1,n)

(se observ c am folosit partea inferior triunghiular a matricii pentru a memora indicii pentru care se realizeaz minimul). Dac dorim numai costul final, nu este nevoie s memorm ntreaga matrice, ci este suficient s folosim un vector. Dac dorim s producem i o ordine de nmulire optim, avem nevoie de ntreaga matrice. Vom apela sol(1,n), unde procedura sol are forma:
procedure sol(p,u) if p=u then write(p) else kcost(u,p) write('('); sol(p,k); write(','); sol(k+1,u); write(')') end;

Pentru evaluarea timpului de lucru, vom calcula numrul de comparri efectuate. Aceste este:
j=2i=1 (j1)(j2) = O(n 3) (j i + 1)= j(j 1) 2 j=2 n j1 n

Exemplul 7: Descompunerea unui dreptunghi n ptrate Se consider un dreptunghi cu laturile de m, respectiv n uniti (m<n). Asupra sa se pot face tieturi complete pe orizontal sau vertical. Se cere numrul minim de ptrate n care poate fi descompus dreptunghiul.

-------------------------------------------------------------------------------------------------------------------10 Tehnici avansate de programare

5. Metoda programrii dinamice -----------------------------------------------------------------------------------------------------------------------

Testul de autoevaluare nr. 1 1. Care este definiia unui graf de dependene?

Rspunsurile 2. la test se vor da n spaiul liber din chenar, n continuarea 3. enunurilor

Care sunt limitele metodei irului cresctor de mulimi?

Care sunt limitele metodei sortrii topologice?

4.

Care este definiia unui PD-arbore?

5.

Cum poate fi aplicat metoda programrii dinamice la descompunerea unui dreptunghi n ptrate ?

Rspunsurile la acest test se gsesc pe pagina urmtoare.

-------------------------------------------------------------------------------------------------------------------Tehnici avansate de programare 11

5. Metoda programrii dinamice -----------------------------------------------------------------------------------------------------------------------

Tema de autoinstruire nr. 1 Consultai bibliografia pentru: 1. a nelege limitele unei ncercri de a rezolva problema programrii dinamice prin metoda Divide et Impera. 2. a vedea cum metoda programrii dinamice poate fi util i pentru calculul paralel, de exemplu chiar pentru problema sumei a n numere. 3. a studia aplicativitatea metodei programrii dinamice n teoria limbajelor formale .

5.6. Comentarii i rspunsuri la testele de autoevaluare


Testul 1. 2. Metoda irului cresctor de mulimi are dou deficiene majore:
- la fiecare reluare se parcurg toate elementele lui V; - nu este precizat o ordine de considerare a elementelor.

Aceste deficiene fac ca aceast metod s nu fie performant. 3. Sortarea topologic aplicat problemei generale, dei necesit un timp liniar, prezint un dezavantaj: sunt calculate i valori ale unor vrfuri "neinteresante", adic neobservabile din z. 5. Fie aij = numrul minim de ptrate n care poate fi descompus un dreptunghi de laturi i i j. Evident aij=aji. Rezultatul cutat este amn. Vrfurile grafului sunt (i,j), iar valorile asociate sunt aij .
k j-k

k i i-k j

-------------------------------------------------------------------------------------------------------------------12 Tehnici avansate de programare

5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------Pentru calculul lui aij avem de ales ntre a face: - o tietur pe vertical; costurile sunt: aik+ai,j-k, k j/2 ; - o tietur pe orizontal; costurile sunt: ak,j+ai-k,j, k i/2 . Rezult c valoarea aij a unui vrf (i,j) depinde de valorile vrfurilor din stnga sa i de cele aflate deasupra sa. Se observ c graful de dependene este un PD-arbore.
j

(i,j)

Dependenele pot fi exprimate astfel:


ai,1=i, i=1,...,m a1,j=j, j=1,,n aii=1, =1,...,m aij = min{, }, unde =min{aik+ai,j-k | k j/2} , iar =min{ ak,j+ai-k,j, | k i/2 }.

Forma particular a PD-arborelui permite o parcurgere mai uoar dect aplicarea algoritmului general de postordine. De exemplu putem cobor pe linii, iar pe fiecare linie mergem de la stnga la dreapta. Dup iniializrile date de primele 3 dependene de mai sus, efectum calculele:
for i=2,m for j=i+1,n

calculul lui aij conform celei de a patra dependene de mai sus if jm then ajiaij

-------------------------------------------------------------------------------------------------------------------Tehnici avansate de programare 13

5. Metoda programrii dinamice -----------------------------------------------------------------------------------------------------------------------

5.7. Lucrare de verificare pentru studeni


Scriei cte un program ce folosete metoda programrii dinamice pentru cele trei probleme de mai jos: 1. Cele mai scurte drumuri ntr-un graf. Fie G = (X, G) un graf orientat cu |X| = n vrfuri. Fiecrui arc (i, j) i se pune n coresponden o lungime (cost) cij. Determinai pentru fiecare pereche (i, j) lungimea drumului minim de la i la j. 2. Numele transformate. Se dau dou nume (iruri de caractere) i formate din n, respectiv m litere. Asupra irului sunt permise urmtoarele operaii: S (tergerea unui caracter); I (inserarea unui caracter); M (modificarea unui caracter). Se cere s se transforme irul n irul folosind un numr minim de operaii admise. 3. Problema circuitului hamiltonian. Se cere s se rezolve problema circuitului hamiltonian folosind metoda programrii dinamice. Rezolvrile, dar i dificultile ntmpinate, vor fi expediate prin mail tutorelui.

5.8. Bibliografie
[1] Georgescu Horia, Tehnici de programare, Editura Universitii Bucureti, 2005 [2] Cormen T. H. et al. Introducere n algoritmi, Computer Libris Agora, 2000 [3] Parberry Ian, Gasarch William, Problems on Algorithms (2nd Edition), 2002 [4] Cormen T. H. et al. Introducere n algoritmi, Computer Libris Agora, 2000 [5] Skiena Steven, The Algoritm Design Manual, Springer 1998

-------------------------------------------------------------------------------------------------------------------14 Tehnici avansate de programare

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