Master Bioinformatica 2002: Progetto di Algoritmi1 Programmazione Dinamica (PD) Altra tecnica per risolvere problemi di ottimizzazione, piu generale degli algoritmi greedy La programmazione dinamica risolve un problema di ottimizzazione componendo le soluzioni dei sottoproblemi
Master Bioinformatica 2002: Progetto di Algoritmi2 Caratteristiche della programmazione dinamica Risolve i problemi in modo bottom-up: si parte da problemi piccoli e se ne compongono le soluzioni per trovare soluzioni di problemi di dimensioni più grandi. Si applica nei casi in cui un problema ha la proprieta della sottostruttura ottima.
Master Bioinformatica 2002: Progetto di Algoritmi3 Differenza con i metodi divide et impera I metodi divide et impera (esempio: ordinamento con mergesort) procedono top-down: la scomposizione produce problemi che vengono risolti in modo indipendente. Nei problemi a cui si applica la PD la scomposizione produce sottoproblemi che non sono indipendenti: la soluzione di alcuni sottoproblemi richiede di risolvere i medesimi sottoproblemi.
Master Bioinformatica 2002: Progetto di Algoritmi4 PD versus divide et impera (segue) I metodi divide et impera si applicano quando la scomposizione in sottoproblemi produce problemi tutti distinti. La PD si applica quando la scomposizione in sottoproblemi produce piu volte gli stessi sottoproblemi. Per evitare di risolvere piu volte gli stessi sottoproblemi, si memorizzano le soluzioni dei sottoproblemi in una tabella.
Master Bioinformatica 2002: Progetto di Algoritmi5 PD versus metodi greedy Programmazione dinamica e metodi greedy si applicano entrambi a problemi di ottimizzazione in cui vale la proprieta della sottostruttura ottima. Nei metodi greedy, le scelte ad ogni passo dipendono da un criterio esterno (appetibilità) ogni scelta determina un sottoproblema Nella PD le scelte dipendono dalla soluzione dei sottoproblemi
Master Bioinformatica 2002: Progetto di Algoritmi6 PD versus metodi greedy (segue) I metodi greedy agiscono in modo top-down: riducono progressivamente un problema a sottoproblemi di dimensioni decrescenti. I metodi basati sulla PD procedono bottom-up risolvendo per primi i problemi più piccoli. I metodi greedy sono molto piu efficienti di quelli basati sulla programmazione dinamica che devono provare tutte le alternative per fare una scelta ottima. La PD ha unapplicabilita maggiore rispetto ai metodi greedy.
Master Bioinformatica 2002: Progetto di Algoritmi7 Sviluppo di un algoritmo di programmazione dinamica Caratterizzazione della struttura di una soluzione ottima definizione ricorsiva del valore di una soluzione ottima. Calcolo iterativo del valore di una soluzione ottima mediante una strategia bottom-up Costruzione di una soluzione ottima a partire dal valore calcolato
Master Bioinformatica 2002: Progetto di Algoritmi8 Esempio: zaino0-1 La programmazione dinamica permette di risolvere il problema dello zaino 0-1, che non ammette una soluzione con i metodi greedy
Master Bioinformatica 2002: Progetto di Algoritmi9 Struttura di una soluzione ottima: Possiamo definire: M[i,j] = il massimo valore trasportabile con un peso j e potendo selezionare gli oggetti 1,…i.
Master Bioinformatica 2002: Progetto di Algoritmi10 Struttura di una soluzione ottima: Considera una soluzione ottima in cui si hanno a disposizione gli articoli 1,…,i e un carico j se i non e incluso nella soluzione ottima M[i, j] = M[i-1,j] se i e incluso nella soluzione ottima M[i,j] = M[i-1, j - w i ] + v i, dove j w i
Master Bioinformatica 2002: Progetto di Algoritmi11 Condizioni limite –M[i,0] = 0 per ogni i –M[0,j] = 0 per ogni j Posso calcolare in modo iterativo (bottom-up) i valori di M[i,j] a partire da M[0,0] per valori crescenti di i e j. Se ho n articoli e un peso W il valore di una selezione ottima sarà dato alla fine da M[n,W]
Master Bioinformatica 2002: Progetto di Algoritmi12 Definizione ricorsiva del valore di una soluzione M[0,j] = 0 M[i,0] = 0 M[i,j] = M[i-1,j] se j < w i M[i,j] = max {M[i-1,j], v i + M[i-1,j- w i ]} se j w i
Master Bioinformatica 2002: Progetto di Algoritmi13 Calcolo iterativo del valore di una soluzione ottima DynamicKnapsack0-1(W, w,v) for j = 0 to W M [0,j] 0 for i = 0 to n M [i,0] 0 for i = 1 to n for j = 1 to W if (j w i ) then M[i,j] max {M[i-1, j], v i +M[i-1, j- w i ]} else M[i,j] M [i-1,j];
Master Bioinformatica 2002: Progetto di Algoritmi14 Rivedendo lesempio
Master Bioinformatica 2002: Progetto di Algoritmi15 Esempio precedente j0<10< 20< 30< 40< 50 i
Master Bioinformatica 2002: Progetto di Algoritmi16 Calcolo di M[i,j] M[1,j] = 0j = 0,…9 nulla = 60 j = 10,…50{1} M[2,j] = 0j = 0,…,9 nulla = 60 j = 10,…,19 {1} = 100j = 20,…, 29 {2} = 160j = 30,…, 50 {1,2}
Master Bioinformatica 2002: Progetto di Algoritmi17 Calcolo di M[i,j] (segue) M[3,j] = 0j = 0,…,9 nulla = 60 j = 10,…,19{1} = 100j = 20,…, 29{2} = 160j = 30,…, 39{1,2} = 180j = 40,…,49{1,3} = 220j = 50{2,3}
Master Bioinformatica 2002: Progetto di Algoritmi18 Complessità dellalgoritmo La complessità dellalgoritmo di programmazione dinamica per lo zaino 0-1 è O(nW) dove n è il numero degli articoli e W è il peso dello zaino. Notare che W può essere arbitrariamente grande rispetto a n (ad esempio può essere W = 2 n )