200 likes | 626 Views
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
E N D
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 a0 • functia obiectiv: maxdD lg(d) • stare: DMR(i) = subreteaua cu virful in ai • val. asociata: i • functia asociata: f(i) = maxdD(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
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[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
Alocarea resurselor • Intrare: • Digraf etajat G = (V, E), • 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
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(VpVp+1), …, DODE(V)
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
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 L0, L1,…, 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) 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
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 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
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 */ 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
Problema rucsacului (varianta discreta): complexitate • calculullui Si din Si-1 se face in timpul |Si| • punctele (Xj,Yj)din Sisatisfac: • 0 Xj M • 0 Yjkpk nmaxkpk • rezulta |Si| min(M, nmaxkpk) nmax(p0, p1,…, pn-1,M) • rezulta ca Sn-1 se calculeaza in timpul O(n2max(p0, p1,…, pn-1,M)) • calcululsolutiei se face in timpul O(n) • rezulta ca timpul de executie a algoritmuluieste O(n2max(p0, p1,…, pn-1,M)) • spatiul: |S0| + |S1| + … + |Sn-1| = O(n2max(p0, p1,…, pn-1,M)) • dacamax(p0, p1,…, pn-1,M) > 2natuncitimpul de executie a algoritmuluieste exponential • algoritmuleste 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 = (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
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) • algoritmuleste pseudo-polinomial • p(X,Y) = XY • TA(m) = Θ (p(n, m))