Il paradigma della “programmazione dinamica”
Transcript
Il paradigma della “programmazione dinamica”
APA I eII 10 La programmazione dinamica Il paradigma della “programmazione dinamica” Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino Tipologie di problemi Problemi di ricerca: esiste una soluzione valida? z ciclo Hamiltoniano: dato un grafo non orientato, esiste un ciclo semplice che contiene tutti i vertici? Problemi di ottimizzazione: quale è la soluzione migliore? z Parentesizzazione di un prodotto di matrici: quale è il minimo numero di operazioni necessarie? A.A. 2006/2007 10 Il paradigma della programmazione dinamica 2 1 APA I eII 10 La programmazione dinamica A.A. 2006/2007 Problemi ibridi (ricerca+ottimizzazione): esistono delle soluzioni valide? E quale è la migliore? z Commesso viaggiatore: ciclo Hamiltoniano a costo minimo. 10 Il paradigma della programmazione dinamica 3 Rappresentazione S: soluzioni V: soluzioni valide s s f(s) M: soluzioni migliori s A.A. 2006/2007 10 Il paradigma della programmazione dinamica 4 2 APA I eII 10 La programmazione dinamica Classificazione Problemi di ricerca z S ≠ V ; |V| = 0 ? Trovare un s ∈ V Problemi di ottimizzazione z S = V ; trovare max(f(s)) Problemi ibridi z S ≠ V ; trovare max(f(s)) garantendo che s ∈ V A.A. 2006/2007 10 Il paradigma della programmazione dinamica 5 Definizioni Soluzione ottima: migliore soluzione possibile Soluzione ottima localmente: soluzione ottima in un dominio contiguo Soluzione ottima f(x) Soluzioni ottime localmente x A.A. 2006/2007 10 Il paradigma della programmazione dinamica 6 3 APA I eII 10 La programmazione dinamica Grafica e moltiplicazione di matrici A.A. 2006/2007 Scena tridimensionale come insieme di traingoli nello spazio Triangolo individuato da 4 coordinate: assi x, y e z e dimensione fittizia (per scalamento) Operazioni grafiche elementari: scalamento, rotazione e tralsazione di figure geometriche 10 Il paradigma della programmazione dinamica 7 Scalamento (αx, βy) (x, y) α 0 0 [x, y, 1] · 0 β 0 = [αx, βy, 1] 0 0 1 A.A. 2006/2007 10 Il paradigma della programmazione dinamica 8 4 APA I eII 10 La programmazione dinamica Rotazione (x’, y’) r x = r cos Ψ y = r sin Ψ A.A. 2006/2007 x’ = = = y’ = = = Φ r (x, y) Ψ cos (Φ+Ψ) = cosΦcosΨ - sinΦsinΨ sin (Φ+Ψ) = sinΦcosΨ + cosΦsinΨ 10 Il paradigma della programmazione dinamica 9 r cos (Φ+Ψ) rcosΦcosΨ - rsinΦsinΨ xcosΦ - ysinΦ r sin(Φ+Ψ) rsinΦcosΨ + rcosΦsinΨ xsinΦ + ycosΦ cosΦ sinΦ 0 [x, y, 1] · -sinΦ cosΦ 0 = [x’, y’, 1] 0 0 1 A.A. 2006/2007 10 Il paradigma della programmazione dinamica 10 5 APA I eII 10 La programmazione dinamica Traslazione (x + ∆x, y + ∆ y) (x, y) 1 0 0 [x, y, 1] · 0 1 0 = [x+∆x, y+∆ y,1] ∆x ∆y 1 A.A. 2006/2007 10 Il paradigma della programmazione dinamica 11 Trasformazione: [x, y, z, 1] · A1 · A2 ….. · An Stessa trasformazione applicata a punti diversi ⇒ calcolo una volta per tutte del prodotto A1 · A2 ….. · An A.A. 2006/2007 10 Il paradigma della programmazione dinamica 12 6 APA I eII 10 La programmazione dinamica Prodotto di 2 matrici Due matrici A p x q e B s x r sono compatibili se e solo se q = s Ipotesi di semplificazione: matrici quadrate di dimensione n x n Algoritmo semplice: 3 cicli annidati, complessità T(n) = O(n3), se n = 2 richiede 8 moltiplicazioni e 4 somme A.A. 2006/2007 10 Il paradigma della programmazione dinamica 13 Prodotto in catena di n matrici A.A. 2006/2007 Data la sequenza di n matrici compatibili A1, A2, A3, …. An dove Ai ha dimensioni pi-1 x pi con i= 1, 2, …,n calcolare il prodotto A1 · A2 · A3 · …. · An 10 Il paradigma della programmazione dinamica 14 7 APA I eII 10 La programmazione dinamica Parentesizzazione Definisce l’ordine di applicazione delle operazioni di prodotto di due matrici con costo minimo Esempio: A1·A2·A3· A4 5 parentesizzazioni possibili (A1·(A2·(A3· A4))) (A1·((A2·A3)· A4)) ((A1·A2)·(A3· A4 )) ((A1·(A2·A3))· A4) (((A1·A2)·A3)· A4) A.A. 2006/2007 10 Il paradigma della programmazione dinamica 15 Costi Date A p x q e B q x r, il costo di A · B è legato al numero di moltiplicazioni scalari p xqxr Esempio: A1·A2·A3 dove A1 10x100, A2 100x 5, A3 5x50 Parentesizzazione #1: (A1·A2)·A3 z costo di A1·A2 10x100x5 = 5000, risultato A12 10x5 z costo di A12·A3 10x5x50 = 2500 z costo totale 7500 A.A. 2006/2007 10 Il paradigma della programmazione dinamica 16 8 APA I eII 10 La programmazione dinamica Parentesizzazione #2: A1·(A2·A3) z costo di A2·A3 100x5x50 = 25000, risultato A23 100x50 z costo di A1·A23 10x100x50 = 50000 z costo totale 75000 A.A. 2006/2007 10 Il paradigma della programmazione dinamica 17 Numero di parentesizzazioni 1 n=1 P(n) = Σ1≤ k ≤ n-1 P(k) · P(n-k) n ≥ 2 Si dimostra che P(n)= C(n-1) dove C(n) è detto numero catalano e vale 2n C(n) = 1/(n+1) n = Ω(4n / n3/2) A.A. 2006/2007 10 Il paradigma della programmazione dinamica 18 9 APA I eII 10 La programmazione dinamica La Programmazione Dinamica A.A. 2006/2007 Applicata a problemi di ottimizzazione Passi: z caratterizzazione della struttura di una soluzione ottima z definizione ricorsiva del valore di una soluzione ottima z calcolo bottom-up del valore di una soluzione ottima z costruzione di una soluzione ottima. 10 Il paradigma della programmazione dinamica 19 Struttura della parentesizzazione ottima Notazione: Ai…j = Ai·Ai+1 · ….. Aj Divisione in sottoproblemi A1…n A1…k Ak+1…n 1≤k<n Costo di A1…n: costo di A1…k + costo di Ak+1…n + costo prodotto A1…k · Ak+1…n A.A. 2006/2007 10 Il paradigma della programmazione dinamica 20 10 APA I eII 10 La programmazione dinamica Perché sia ottima la soluzione di A1…n devono essere ottime le soluzioni di A1…k e Ak+1…n. Problema con sottostruttura ottima applicabilità del paradigma della programmazione dinamica A.A. 2006/2007 10 Il paradigma della programmazione dinamica 21 Soluzione ricorsiva Sottoproblema: determinare il costo minimo della parentesizzazione di Ai…j con 1 ≤ i ≤ j ≤ n. m[i, j]: costo minimo per Ai…j 0 se i = j m[i, j] = min{m[i,k]+m[k+1,j]+pi-1pkpj} se i < j i≤k<j s[i, j] contiene il valore di k che dà una parentesizzazione ottima nella divisione di Ai…j A.A. 2006/2007 10 Il paradigma della programmazione dinamica 22 11 APA I eII 10 La programmazione dinamica Limiti della soluzione ricorsiva assunzione di indipendenza dei sottoproblemi numero di sottoproblemi: uno per ogni scelta di i e j con 1 ≤ i ≤ j ≤ , quindi n 2 + n = Θ(n2) A.A. 2006/2007 10 Il paradigma della programmazione dinamica 23 Calcolo bottom-up del valore di una soluzione ottima Ai matrice pj-1 x pj con i=1, 2,….n input: sequenza p=p0, p1, …., pn, length[p]= n+1 tabella m[1…n, 1…n] per i costi m[i, j] tabella s[1…n, 1…n] per il valore ottimo di k A.A. 2006/2007 10 Il paradigma della programmazione dinamica 24 12 APA I eII 10 La programmazione dinamica Pseudocodice matrix-chain(p) n <-length[p]-1 for i <- 1 to n do m[i,i] <- 0 for l <-2 to n do for i <- 1 to n-l+1 do j <- i+l-1 m[i,j] <- ∞ for k <- i to j-1 do q <- m[i,k] + m[k+1,j] + pi-1pkpj if q < m[i,j] then m[i,j] <- q s[i,j] <- k return m ed s A.A. 2006/2007 10 Il paradigma della programmazione dinamica 25 Esempio A1 A2 A3 A4 p0 p1 p2 p3 p4 A.A. 2006/2007 4x4 4x6 6 x 15 15 x 10 4 4 6 15 10 4 j 1 i 2 3 3 2 1 4 m 4 j 3 2 1 i 2 3 s 10 Il paradigma della programmazione dinamica 26 13 APA I eII 10 La programmazione dinamica 4 j m[1,1] m[2,2] m[3,3] m[4,4] = = = = 0 0 0 0 1 i 2 3 3 2 1 m 0 0 0 4 j 1 i 2 3 4 0 3 2 s A.A. 2006/2007 10 Il paradigma della programmazione dinamica 27 m[1,2] = m[1,1] + m[2,2] + p0p1p2 = 96 4 j k=1 3 2 1 m 0 3 0 4 3 2 s 10 Il paradigma della programmazione dinamica 1 i 2 96 j A.A. 2006/2007 1 0 4 0 1 i 2 3 28 14 APA I eII 10 La programmazione dinamica m[2,3] = m[2,2] + m[3,3] + p1p2p3 = 360 4 j k=2 3 2 1 m 0 0 3 2 10 Il paradigma della programmazione dinamica 29 m[3,4] = m[3,3] + m[4,4] + p2p3p4 = 900 4 j k=3 3 2 1 m 0 96 1 3 360 900 4 0 0 0 1 s 10 Il paradigma della programmazione dinamica 1 i 2 3 2 i 2 4 j A.A. 2006/2007 i 2 1 4 0 1 3 s 3 0 4 2 i 2 360 96 j A.A. 2006/2007 1 2 3 3 30 15 APA I eII 10 La programmazione dinamica 4 1 i m[1,3] = m[1,1] + m[2,3] j 2 3 + p0p1p3 = 360+ 240 =600 3 2 456 k=1 96 360 900 4 1 0 m[1,3] = m[1,2] + m[3,3] 0 0 0 m + p0p2p3 = 96 + 360 = 456 4 1 i k=2 j 3 2 s A.A. 2006/2007 2 2 1 2 3 3 10 Il paradigma della programmazione dinamica 31 4 1 i m[2,4] = m[2,2] + m[3,4] j 2 3 + p1p2p4 = 900 + 240 =1140 2 456 960 3 k=2 96 360 900 4 1 0 m[2,4] = m[2,3] + m[4,4] 0 0 0 m + p1p3p4 = 360 + 600= 960 4 1 i k=3 j 3 2 s A.A. 2006/2007 10 Il paradigma della programmazione dinamica 1 2 3 2 2 3 3 32 16 APA I eII 10 La programmazione dinamica m[1,4] = m[1,1] + m[2,4] 4 1 i + p0p1p4 = 960 + 160 = 1120 j 3 1056 2 k=1 2 456 960 3 m[1,4] = m[1,2] + m[3,4] 96 360 900 4 1 0 0 0 0 + p0p2p4 = 1236 m k=2 4 1 i j m[1,4] = m[1,3] + m[4,4] 3 2 3 + p0p3p4 = 456 + 600 =1056 2 3 3 2 1 2 3 k=3 s A.A. 2006/2007 10 Il paradigma della programmazione dinamica 33 Complessità T(n) = Ω(n3) S(n) = Θ (n2) rispetto al costo esponenziale nel tempo della soluzione ricorsiva A.A. 2006/2007 10 Il paradigma della programmazione dinamica 34 17 APA I eII 10 La programmazione dinamica Costruzione di una soluzione ottima matr-chain-mult(A, s, i, j) if j > i then X <- matr-chain-mult(A,s,i,s[i,j]) Y <- matr-chain-mult(A,s,s[i,j]+1,j) return matrix-mult(X,Y) else return Ai 4 matr-chain-mult(A, s, 1, 4) j A = ((A ·A ) ·A )·A 1…4 1 2 3 3 4 2 s A.A. 2006/2007 1 3 2 1 3 2 i 2 3 10 Il paradigma della programmazione dinamica 3 35 Applicabilità della programmazione dinamica Esistenza di una sottostruttura ottima Esistenza di molti sottoproblemi in comune vantaggio rispetto al divide et impera che assume l’indipendenza dei sottoproblemi approccio bottom-up rispetto a top-down (divide et impera) A.A. 2006/2007 10 Il paradigma della programmazione dinamica 36 18 APA I eII 10 La programmazione dinamica Ricorsione con memorizzazione Approccio top-down Memorizzazione delle soluzioni ai sottoproblemi Lookup: evita di risolvere problemi già trattati A.A. 2006/2007 10 Il paradigma della programmazione dinamica 37 Esempio: parentesizzazione ottima memoized-matr-chain(p) n <-length[p]-1 for i <- 1 to n do for j <- i to n do m[i,j] <- ∞ return lookup-chain(p, 1, n) A.A. 2006/2007 10 Il paradigma della programmazione dinamica 38 19 APA I eII 10 La programmazione dinamica lookup-chain(p, i, j) if m[i,j] < ∞ then return m[i,j] if i=j then m[i,j] <- 0 else for k <- i to j-1 do q <-lookup-chain(p,i,k) + lookup-chain(p,k+1,j)+pi-1pkpj if q < m[i,j] then m[i,j] <- q return m[i,j] A.A. 2006/2007 10 Il paradigma della programmazione dinamica 39 Esempio: numeri di Fibonacci Memorizzazione dei valori calcolati in un array knownF int F(int i); { int t; if (knownF[i] != unknown) return knownF[i]; if (i == 0) t = 0; if (i == 1) t = 1; if (i > 1) t = F(i-1) + F(i-2); return knownF[i] = t; } A.A. 2006/2007 10 Il paradigma della programmazione dinamica 40 20 APA I eII 10 La programmazione dinamica Esempio: il problema dello zaino Dato un insieme di N oggetti ciascuno dotato di peso pj e di valore vj e dato un peso massimo M, determinare il sottoinsieme S di oggetti tali che: ∑j∈S pj xj ≤ M ∑j∈S vj xj = MAX A.A. 2006/2007 10 Il paradigma della programmazione dinamica 41 21