Curs 7 Paradigma Programare dinamica Prezentarea generala a










![Drumuri minime intr-un digraf: algoritm (Floyd-Warshall) procedure DMD(D, L) begin for all [i, j] Drumuri minime intr-un digraf: algoritm (Floyd-Warshall) procedure DMD(D, L) begin for all [i, j]](https://slidetodoc.com/presentation_image_h/dc1b3161742339d87a4d2da336672f5b/image-11.jpg)









- Slides: 20
Curs 7 Ø Paradigma Programare dinamica ð Prezentarea generala a paradigmei ð Studii de caz • alocarea resurselor • drumurile minime intr-un digraf • rucsac 0/1 • distanta intre siruri
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
Exemplu: retea triunghiulara de numere: modelare a 0 a 1 a 3 a 6 a 2 a 4 a 7 a 5 a 8 a 9 Ø 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
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]]
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[1, 0] s c[1, 1] c[1, 2] c[2, 1] c[3, 2] c[2, 0] c[2, 1] c[3, 1] c[2, 2] c[2, 0] proiectul 1 t proiectul 2 c[3, 0] proiectul 3
Alocarea resurselor Ø Intrare: ð Digraf etajat G = (V, E), • V = V 1 V 2 … Vp Vp+1 • Vi Vj = Ø • V 1 = {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
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 Val. Opt[i, j] valoarea acestui drum decizie: DODE(j) DODE(k) aplicam PO si obtinem Val. Opt[i, j] = c[j, k] + Val. Opt[i+1, k] Ø de unde rezulta recurenta: Val. Opt[p+1, n-1] = 0 Val. Opt[i, j] = optim{c[j, k] + Val. Opt[i+1, k] | k Vi+1, (j, k) A} Ø ordinea de rezolvare a subproblemelor: DODE(Vp+1), DODE(Vp Vp+1), …, DODE(V) Ø Ø Ø Ø
Alocarea resurselor function aloc. Res(G, Val. Opt, D) for j 0 to G. n-2 do Val. Opt[j] Val. Opt[G. n-1] 0 for k G. n-1 downto 1 do q G. a[k] while (q NULL) do j q->varf if (Val. Opt[j] < Val. Opt[k] + q->c) then Val. Opt[j] Val. Opt[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 Val. Opt[0] end
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
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 L 0, L 1, …, Ln
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
Problema rucsacului (varianta discreta): formulare Ø instanta: ð n obiecte 0, 1, . . . , n-1 de dimensiuni (greutati) w 0, w 1, . . . , 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 x 0, . . . , xn-1 este i=0, n-1 xipi Ø iesire: ð o alegere pentru care profitul adus este maxim
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
Problema rucsacului (varianta discreta): solutie (cont) ðdecizie: RUCSAC(j, X) RUCSAC(j-1, ? ) ðrelatia de recurenta:
Problema rucsacului (varianta discreta): exemplu Ø M = 10, p = (10, 30, 20), w = (3, 5, 6) X 0 1 2 3 4 5 6 7 8 9 10 f 0(X) 0 0 0 f 1(X) 0 0 0 10 10 f 2(X) 0 0 0 10 10 30 30 30 40 40 40 f 3(X) 0 0 0 10 10 30 30 30 40 40 40 x 2 = 0 x 1 = 1 x 0 = 1
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))
Problema rucsacului (varianta discreta): algoritm procedure Rucsac(n, p, w) begin /* calculeaza valoarea optima */ S 0 {(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) Si then xi+1 = 0 else xi+1 = 1; (U, V) = (U-wi+1, V-pi+1) end
Problema rucsacului (varianta discreta): complexitate Ø calculul lui Si din Si-1 se face in timpul |Si| Ø punctele (Xj, Yj)din Si satisfac: ð 0 Xj M ð 0 Yj kpk n maxkpk ð rezulta |Si| min(M, n maxkpk) n max(p 0, p 1, …, pn-1, M) Ø rezulta ca Sn-1 se calculeaza in timpul O(n 2 max(p 0, p 1, …, pn-1, M)) Ø calculul solutiei se face in timpul O(n) Ø rezulta ca timpul de executie a algoritmului este O(n 2 max(p 0, p 1, …, pn-1, M)) Ø spatiul: |S 0| + |S 1| + … + |Sn-1| = O(n 2 max(p 0, p 1, …, pn-1, M)) Ø daca max(p 0, p 1, …, pn-1, M) > 2 n atunci timpul de executie a algoritmului este exponential Ø algoritmul este pseudo-polinomial
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 = (x 0, x 1, …, xn-1), atunci cod(x) = cod(x 0)#cod(x 1)#…#cod(xn-1), cod(x 1) {0, 1}* ð max(x) = max{x 0, x 1, …, 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
Algoritmi pseudo-polinomiali • nr. de biti pentru reprez. lui m este • n = [log m] + 1 • luam m = 2 n-1 • presupunem ca op. i < m si i i+1 se executa fiecare in timpul log i • prespunem ca op. s s + i se executa in timpul log s • rezulta un timp de calcul • TA(m) = Θ(m log m) = Θ(n 2 n) • algoritmul este pseudo-polinomial • p(X, Y) = XY • TA(m) = Θ (p(n, m)) s 0 i 0 while (i < m) do i i+1 s s + i




















