1 / 42

Paradigma Programare dinamica

Paradigma Programare dinamica. Prezentarea generala a paradigmei Studii de caz alocarea resurselor drumurile minime intr-un digraf rucsac 0/1 distanta intre siruridistanta intre siruri subsecventa crescatoare de lungime maxima Prezentarea formala a paradigmei.

Download Presentation

Paradigma Programare dinamica

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Paradigma Programare dinamica • Prezentarea generala a paradigmei • Studii de caz • alocarea resurselor • drumurile minime intr-un digraf • rucsac 0/1 • distanta intre siruridistanta intre siruri • subsecventa crescatoare de lungime maxima • Prezentarea formala a paradigmei

  2. Programare dinamica - ingrediente • probleme de optim • definirea subproblemei (stare) si asocierea functii obiectiv pentru subproblema • definirea unei relatii de tranzitie intre stari (decizie) • politica = secventa de decizii • aplicarea Principiului de Optim pentru obtine relatia de recurenta Principiul de Optim (PO): o subpolitica a unei politici optimale este la rindul ei optimala • calculul recurentei rezolvind subproblemele de la mic la mare si memorind valorile date de relatia de recurenta intr-un tablou • extragerea solutiei optime din tablou

  3. Exemplu: retea triunghiulara de numere: modelare a0 • functia obiectiv: maxdD lg(d) • stare: DMR(i) = subreteaua cu virful in ai • val. asociata: i • functia asociata: f(i) = maxdD(i) lg(d) • decizii posibile: DMR(i)  DMR(stg(i)), DMR(i)  DMR(drp(i)) • recurenta obtinuta: f(i) = max(f(stg(i)), f(drp(i))) + ai a1 a2 a3 a4 a5 a6 a7 a8 a9

  4. Exemplu: retea triunghiulara de puncte: implementare • Tine minte! Rezolva subproblemele de la mic la mare si memoreaza valorile date de relatia de recurenta intr-un tablou • valorile functiei f[] vor fi calculate in ordinea f[n-1], f[n-2], ..., f[2], f[1], f[0] Atentie! Transformarea recurentei in recursie duce la solutii costisitoare (subprobleme rezolvate de mai multe ori). • extragerea solutiei optime din tabel • initial: sol[0] = 0 • pas curent: • daca f[sol[i]] = f[stg[sol[i]]]+a[sol[i]] atunci sol[i+1] = stg[sol[i]] altfel sol[i+1] = drp[sol[i]]

  5. Alocarea resurselor • Pentru realizarea a p proiecte sunt disponibile r resurse. • Alocarea a j resurse la proiectul i produce un profit c[i,j]. • Problema consta in alocarea celor r resurse astfel incat profitul total sa fie maxim. c[2,0] c[2,1] c[3,2] c[1,0] c[1,1] c[2,0] c[3,1] s t c[2,2] c[2,1] c[1,2] c[3,0] c[2,0] proiectul 3 proiectul 1 proiectul 2

  6. Alocarea resurselor • Intrare: • Digraf etajat G = (V, A), • V = V1  V2  … Vp  Vp+1 • Vi  Vj = Ø • V1 = {s}. Vp+1 = {t} • daca un arc are sursa in Vi atunci are destinatia in Vi+1 • functie de profit c : A  R • Iesire: un drum de la s la t de profit maxim

  7. Alocarea resurselor • X  V • stare: DODE(j) = problema determinarii drumurilor de la j la t • V = {0, 1, …, n-1} • D[i,j] = drumul optim la j  Vi la t • ValOpt[i,j] valoarea acestui drum • decizie: DODE(j)  DODE(k) • aplicam PO si obtinem ValOpt[i, j] = c[j, k] + ValOpt[i+1, k] • de unde rezulta recurenta: ValOpt[p+1, n-1] = 0 ValOpt[i, j] = optim{c[j, k] + ValOpt[i+1, k] | k  Vi+1, (j,k)  A} • ordinea de rezolvare a subproblemelor: DODE(Vp+1), DODE(VpVp+1), …, DODE(V)

  8. Alocarea resurselor function alocRes(G, ValOpt, D) for j  0 to G.n-2 do ValOpt[j]  ValOpt[G.n-1]  0 for k  G.n-1 downto 1 do q  G.a[k] while (q  NULL) do j  q->varf if (ValOpt[j] < ValOpt[k] + q->c) then ValOpt[j]  ValOpt[k] + q->c S[j]  k q  q->succ D[0]  0 D[p]  n-1 for i  1 to p-1 do D[i]  S[D[i-1]] return ValOpt[0] end

  9. Drumuri minime intr-un digraf • Problema • instanta: • D = (V, A, lg), lg : A  R • lg[i, i] = 0, lg[i, j] =  daca (i,j)  A • lungime drum =  lungimilor arcelor de pe drum • iesire: • pentru orice pereche (i,j) lungimea celui mai scurt drum de la i la j • Modelul matematic • stare: DMD(X) – drumuri minime cu virfuri intermediare in X • functia asociata: LX[i, j] = lung. drumului minim de la i la j cu virfuri intermediare in X

  10. Drumuri minime intr-un digraf (continuare) • decizie: DMD(X{k})  DMD(X) • relatia de recurenta: LX {k}[i, j] = min{LX[i, j], LX[i, k] + LX[k, j]} L[i, j] = lg[i, j] • politica optima: DMD(), DMD({0}), DMD({0,1}), ..., DMD({0,1, ...,n-1}) • notatie: Lk[i, j] = L{0,1,...,k-1}[i, j] Lk[i, j] = min{Lk-1[i, j], Lk-1[i, k] + Lk-1[k, j]} • matricele Lk sint calculate in ordinea L0, L1,…, Ln

  11. Drumuri minime intr-un digraf: algoritm (Floyd-Warshall) procedure DMD(D, L) begin for all [i,j] do if (i,j) A) then L[i,j]  lg[i,j] else L[i,j]   if (i = j) then L[i,j] = 0; for k  1 to n do for all [i,j] do temp  L[i,k] + L[k,j] if (L[i,j] > temp) then L[i,j]  temp if (i=j and L[i,i] < 0) then throw “ERR:circuit negativ” end

  12. Problema rucsacului (varianta discreta): formulare • instanta: • n obiecte 0, 1, ..., n-1 de dimensiuni (greutati) w0, w1, ..., wn-1 • un rucsac de capacitate M • un obiect i poate fi introdus in rucsac complet (xi = 1) sau de loc (xi=0) • introducerea in rucsac a obiectului i aduce un profit pi • profitul total adus de alegerile x0, ..., xn-1 este i=0,n-1 xipi • iesire: • o alegere pentru care profitul adus este maxim

  13. Problema rucsacului (varianta discreta): solutie • modelul matematic • stare: RUCSAC(j, X) • functia obiectiv: max i=0,j-1 xipi • restrictii: (i)xi  {0,1} i=0,j-1 xiwi  X X  Z, (i)wi ,pi  Z • functia asociata unei stari: fj(X) = max i=0,j-1 xipi

  14. Problema rucsacului (varianta discreta): solutie (cont) • decizie: RUCSAC(j, X)  RUCSAC(j-1, ?) • relatia de recurenta:

  15. Problema rucsacului (varianta discreta): exemplu X 0 1 2 3 4 5 6 7 8 9 10 f0(X) 0 0 0 0 0 0 0 0 0 0 f1(X) 0 0 0 10 10 10 10 10 10 10 f2(X) 0 0 0 10 10 30 30 30 40 40 f3(X) 0 0 0 10 10 30 30 30 40 40 • M = 10, p = (10, 30, 20), w = (3, 5, 6) 0 10 40 40 x2 = 0 x1 = 1 x0 = 1

  16. Problema rucsacului (varianta discreta): functiile fi • fi este o functie in scara • graficul lui fi poate fi reprezentat prin multimea punctelor de salt Si • graficul lui gi-1(X) = fi-1(x-wi-1)+pi-1 este o translatie a lui Si-1 ; notam (Si-1) • graficul lui fi = max(fi-1, gi-1) se obtine prin interclasarea graficelor Si-1 si (Si-1); notam (Si-1,(Si-1))

  17. Problema rucsacului (varianta discreta): algoritm procedure Rucsac(n, p, w) begin /* calculeaza valoarea optima */ S0  {(0,0)} for i  1 to n do Si (Si-1,(Si-1)) /* determina alegerea optima */ calc. (U,V) a.i. Xj= max{Xi|(Xi,Yi) Sn, Xi  M} for i  n-1 downto 0 do if ((U,V) Sithen xi+1 = 0 else xi+1 = 1; (U,V) = (U-wi+1,V-pi+1) end

  18. Problema rucsacului (varianta discreta): complexitate • calculullui Si din Si-1 se face in timpul |Si| • punctele (Xj,Yj)din Sisatisfac: • 0 Xj M • 0 Yjkpk nmaxkpk • rezulta |Si|  min(M, nmaxkpk) nmax(p0, p1,…, pn-1,M) • rezulta ca Sn-1 se calculeaza in timpul O(n2max(p0, p1,…, pn-1,M)) • calcululsolutiei se face in timpul O(n) • rezulta ca timpul de executie a algoritmuluieste O(n2max(p0, p1,…, pn-1,M)) • spatiul: |S0| + |S1| + … + |Sn-1| = O(n2max(p0, p1,…, pn-1,M)) • dacamax(p0, p1,…, pn-1,M) > 2natuncitimpul de executie a algoritmuluieste exponential • algoritmulestepseudo-polinomial

  19. Algoritmi pseudo-polinomiali • consideram probleme pentru care intrarea pentru P este data ca o secventa de numere intregi • presupunem ca intrarea este codificata peste alfabetul {0,1,#} • daca x = (x0, x1,…, xn-1), atunci cod(x) = cod(x0)#cod(x1)#…#cod(xn-1), cod(x1)  {0,1}* • max(x) = max{x0, x1,…, xn-1} • un algoritm A pentru P este pseudo-polinomial (relativ la timpul de executie) daca exista un polinom p(X,Y) de doua variabile astfel incat timpul de executie a lui A este TA(x) = O(p(|cod(x)|, max(x))) • daca q(X) este un polinom astfel incat max(x)  q(|cod(x)|), atunci TA(x) este marginit de un polinom

  20. Algoritmi pseudo-polinomiali s  0 i  0 while (i < m) do i i+1 s  s + i • nr. de bitipentrureprez. lui m este • n = [log m] + 1 • luam m = 2n-1 • presupunem ca op. i < m sii i+1 se executafiecare in timpul log i • prespunem ca op. s  s + ise executa in timpul log s • rezulta un timp de calcul • TA(m) = Θ(m log m) =Θ(n 2n) • algoritmulestepseudo-polinomial • p(X,Y) = XY • TA(m) = Θ (p(n, m))

  21. Distanta intre siruri – problema • instanta • doua siruri a si b de lungime n • asupra lui a se pot face operatiile: • modificare: M(i, c) daca ai c • stergere: S(i) • inserare: I(i, c) • iesire • o secventa de operatii de lungime minima care transforma sirul a in b • exemplu • a = “armata”, b = “camara” • “armata”  “amata”  “camata”  “camara” • d[“armata”, “camara”] = 3

  22. Distanta intre siruri – propretati • ordinea operatiilor intr-o secventa optima nu are importanta • “armata”  “amata”  “camata”  “camara” • “armata”  “amata”  “amara”  “camara” • “armata”  “carmata”  “camata”  “camara” • “armata”  “carmata”  “carmara”  “camara” • “armata”  “armara”  “amara”  “camara” • “armata”  “armara”  “carmara”  “camara”

  23. Distanta intre siruri – proprietati (cont.) • exista o secventa optima in care sirurile intermediare au lungimea  n • d[a,b] este o metrica: • d[a, a] = 0 • d[a, b] = d[b, a] • d[a, c] d[a, b] + d[b, c]

  24. Distanta intre siruri – model • stare: DES[i,j] = determinarea distantei minime intre subsirurile de lungime i si respectiv j • valoarea asociata unei stari: [i,j] • functia asociata unei stari: d[i, j] = d[a[1..i], b[1..j]] • decizie: • presupunem ca b[j] se obtine prin stergere: DES[i,j]  DES[i-1, j] • presupunem ca b[j] se obtine prin modificare: DES[i,j]  DES[i-1, j-1] • presupunem ca a[i] se obtine prin inserare: DES[i,j]  DES[i, j-1]

  25. Distanta intre siruri – model (cont.) • relatia de recurenta d[0, j] = j, d[i, 0] = i (i, j) d[i, j] = min{d[i-1, j] + 1, d[i-1, j-1] + [i, j], d[i, j-1] + 1} [i, j] = if (a[i] = b[j]) then 0 else 1 • timp: • calculului matricii d: O(n2) • determinarea secventei de operatii: O(n) • spatiu: O(n2)

  26. Distanta intre siruri - exemplu c a m a r a 2 3 4 5 6 a 1 1 2 3 4 5 r 2 2 2 3 3 4 m 3 3 3 3 4 4 a 4 4 3 3 3 4 t 5 5 4 4 3 4 a 6 6 5 5 4 4 0 1 1 2 2 2 3 3 ( M(5,’r’), S(2), ) I(1,’c’)

  27. Distanta intre siruri - variatii • alte operatii: • transpozitia: schimba ordinea a doua caractere adiacente • distanta Levenshtein (de editare) • sunt admise numai inserari, stergeri si inlocuiri • toate operatiile au costul 1 • distanta Hamming • sunt admise numai inlocuirile • costul operatiei este 1 • este finita ori de cate ori |a| = |b| • distanta “episodica” (episode distance) • sunt admise numai inserari • costul operatiei este 1 • distanta este sau |b|-|a| sau 

  28. Distanta intre siruri - variatii • distanta data de cea mai lunga subsecventa • sunt admise numai inserari si stergeri • toate operatiile au costul 1 a = “amxbtycsnma” si b = “bancxstymcxn” “amxbtycsnma”  “bamxbtycsnma”  “baxbtycsnma”  “banxbtycsnma”  “bancxbtycsnma”  “bancxtycsnma”  “bancxstycsnma”  “bancxstymcsnma”  “bancxstymcnma”  “bancxstymcxnma”  “bancxstymcxna”  “bancxstymcxn” = b • (a,x,t,y,c,n) este subsecventa comuna • este cea mai lunga?

  29. Distanta intre siruri - aplicatii • “matching” aproximativ peste siruri (aproximate string matching) • problema: dat un text s de lungime n, un patern p de lungime m, o distanta d() intre siruri si un numar k, sa se determine pozitiile j din textul s astfel incat sa existe i cu d(p, s[i..j])  k • distanta Levenshtein: “string matching with k differences” • distanta Hamming: “string matching with k missmatches” • distanta episodica: “episode matching” (modeleaza cazul cand se cauta o secventa de evenimente intr-o perioada scurta de timp) • cea mai lunga subsecventa comuna: exact ce spune numele • procesul de cautare: • a = p, b = s • trebuie sa modificam alg. a.i. orice pozitie j din text este startul potential al unei potriviri; asta se realizeaza prin setarea d[0,j] = 0

  30. Distanta intre siruri - aplicatii • calculul matricei se face pe coloane • initial: d[i, 0] = i pentru i = 0, …, m • se proceseaza textul caracter cu caracter • presupunem ca la pasul curent se proceseaza sj • coloana j este actualizata: d[i, j] = if (pi = sj) then d[i-1, j-1] else 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 ca numai ultimele doua coloane sunt necesare

  31. Distanta intre siruri - aplicatii

  32. Paralelizare • G. Myers. A fast Bit-Vector Algorithm for Approximate String Matching Based on Dynamic Programming, 1998 • Δh[i,j] = d[i,j] - d[i, j-1], Δ[i,j] = d[i,j] - d[i-1, j], • Δh[i,j], Δv[i,j] ∊ {-1,0,1} (a se vedea fig. 1 din articol) • Δv[*,j] este reprezentata prin vectorii de tip bit Pvj[i] ≡ Δv[i,j] = +1, Mvj[i] ≡ Δv[i,j] = -1 • se considera celule ale matricii formate din patrate (i-1, j-1), (i-1, j), (i, j-1), (i,j) • Eq = Eq[i,j] = if pi = sj then 1 else 0 • Δvout = min{-Eq, vin , Δhin }+ {1 -Δhin }, Δhout = min{-Eq, vin , Δhin }+ {1 -Δvin } (a se vedea fig. 2) • (Pvout , Mvout ) = (Mhin or not (Xv or Phin), Phin and Xv), (Phout , Mhout ) = (Mvin or not (Xh or Pvin), Pvin and Xh), unde Xv = Eq or Mvin

  33. Paralelizare (continuare) • Scorej = m, Scorej = Scorej-1 + Δh[m,j] • scanarea (a se vedea fig. 3) Phj[i] = Mvj-1[i] or not (Xhj[i] or Pvj[i] Mhj[i] = Pvj-1[i]and Xvj[i] Scorej = Scorej-1 + (1 if Phj[m]) – (1 if Mhj[m]) Phj[0] = Mhj[0] = 0 (*) Pvj[i] = Mhj-1[i] or not (Xvj[i] or Phj[i] Mvj[i] = Phj-1[i]and Xhj[i] • calculul pe biti (a se vedea fig. 4) • algoritmul ((a se vedea fig. 5)

  34. Subsecventa crescatoare maximala – problema • instanta • o secventa de numere intregi a = (a1, a2, …, an) • stergand cateva elemente din a se obtine o subsecventa • o subsecventa pastreaza ordinea relativa a elementelor • exemplu: • a = (9, 3, 15, 12, 7, 4, 13, 6, 8) • subsecventa: (3, 12, 7, 6) • subsecventa crescatoare: ( 3, 7, 13) • iesire: subsecventa crescatoare de lungime maxima • exemplu: exista o subsecventa crescatoare de lungime > 3? • cum se poate rezolva utilizand distanta de editare?

  35. Subsecventa crescatoare maximala – model • a = (9, 3, 15, 12, 7, 4, 13, 6, 8) 1 2 3 4 5 6 7 8 9 • construim un graf G: • varfuri: 0, 1, 2, …, 9 • arce: { (0,i) | i > 0 }  { (i,j) | a[i] <= a[j] } 0 1 2 3 4 5 6 7 8 9

  36. Subsecventa crescatoare maximala – model • subsecventa crescatoare = drum in G • subsecventa crescatoare maximala = drum de lungime maxima in G • asociem o matrice de costuri: • c[i, j] = 1 daca i < j si (a[i] <= a[j] sau i = 0) • c[i,j] = -  altfel • stare: SCM(i) = subproblema determinarii celui mai lung drum ce se termina in i • L[i] = valoarea optima pentru SCM(i) • PO implica L[i] = L[j] + c[j,i], j predecesorul lui i pe drumul optim • relatia de recurenta: • L[0] = 0 • L[i] = max { L[j] + c[j,i] | j < i }

  37. Subsecventa crescatoare maximala – model • a = (9, 3, 15, 12, 7, 4, 13, 6, 8) 0 1 2 3 4 5 6 7 8 9 L = (0, 1, 1, 2, 2, 2, 2, 3, 3, 4) • extragerea solutiei: • s[4] = 9 • s[3] = 8 • s[2] = 6 • s[1] = 2 • s[0] = 0 • timp de executie: O(n2) • spatiu suplimentar: O(n)

  38. Programare dinamica – prezentare formala • Modelul matematic • probleme de optim • functia obiectiv: optim R(x1, ..., xn) • restrictii: g(x1, ..., xn) ? 0 • decizie: d: s  s’ • unei stari s asociem o valoare z si o functie f(z) a.i. daca s corespunde starii initiale atunci f(z) = optim R(x1, ..., xn) • politica: d1: s0 s1, d2: s1 s2, . . . , dn: sn-1 sn,

  39. Programare dinamica – prezentare formala (cont.) • PO conduce la o relatie de recurenta: • daca • d: s  s’ (sau d: s’  s) • z val. asociata lui s, T(z,y) val. asociata lui s’, • H algoritmul care calculeaza f(z) conform lui d, atunci, aplicind PO, obtinem f(z) = optimy H(z, y, f(T(z,y)))

  40. Addendum: Cea mai lunga subsecventa comuna - problema • instanta • X = x1 ... xm • Y = y1 ... yn • iesire • Z = z1 ... zk – cea mai lunga subsecventa comuna • exemplu: X = abeac Y = aebcac Z = abac

  41. Cea mai lunga subsecventa comuna - model • stare: Xi = x1 x2 ... xi Yj = y1 y2 ... yj LCS(Xi, Yj) • cazuri de baza: LCS(X0, Yj), LCS(Xi, Y0) • decizii posibile la evaluarea LCS(Xi, Yj) • xi== yj atunci • zk = xi = yj /\ Zk-1 este LCS(Xi-1, Yj-1) • xi =/= yj /\ zk =/= xi atunci • Zk este LCS(Xi-1, Yj) • xi =/= yj /\ zk =/= yj atunci • Zk este LCS(Xi, Yj-1)

  42. Cea mai lunga subsecventa comuna – model (cont.) • recurenta: • exemplu:

More Related