Documente Academic
Documente Profesional
Documente Cultură
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.
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.
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
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.
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.
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.
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.
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
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:
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).
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;
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.
5. Metoda programrii dinamice ----------------------------------------------------------------------------------------------------------------------for i=1,n if lung(i)=nr then ind 1; s(1)ai; scrie(i)
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.
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.
4.
5.
Cum poate fi aplicat metoda programrii dinamice la descompunerea unui dreptunghi n ptrate ?
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 .
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
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)
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
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