05/11/2013 Algoritmi e strutture di dati 2 Paola Vocca Lezione 4: Programmazione dinamica Lezione 4- Programmazione dinamica 1 Caratteristiche • Programmazione dinamica: paradigma basato sullo stesso principio utilizzato per il divide et impera o il problema viene decomposto in sotto-problemi o a soluzione del problema è derivata da quelle di tali sottoproblemi • Entrambi i paradigmi vengono applicati a partire da una definizione ricorsiva che correla la soluzione di un problema a quella di un insieme di sotto-problemi. Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 2 1 05/11/2013 Differenze tra programmazione dinamica e divide et impera • La programmazione dinamica è nata principalmente per risolvere problemi di ottimizzazione, il divide et impera è più mirato alla risoluzione di problemi non necessariamente di ottimizzazione • nel divide et impera un qualunque sotto-problema viene considerato una sola volta, nella programmazione dinamica uno stesso sotto-problema può rientrare come componente nella definizione di più problemi Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 3 Differenze tra programmazione dinamica e divide et impera Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 4 2 05/11/2013 Proprietà di decomposizione Risoluzione mediante programmazione dinamica di un problema caratterizzata dalle due proprietà della decomposizione: • Ottimalità dei sotto-problemi: o La soluzione ottima di un problema deriva dalle soluzioni ottime dei sotto-problemi in cui esso è stato decomposto (come nel divide et impera). • Sovrapposizione dei sotto-problemi: o Uno stesso sotto-problema può venire usato nella soluzione di due (o più) sotto-problemi diversi. Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 5 Definizione di un algoritmo di programmazione dinamica La definizione di un algoritmo di programmazione dinamica è basata su: 1. 2. 3. 4. caratterizzazione della struttura generale di cui sono istanze sia il problema in questione che tutti i sotto-problemi identificazione dei sotto-problemi elementari e individuazione della relativa modalità di determinazione della soluzione definizione di una regola ricorsiva per la soluzione in termini di composizione delle soluzioni di un insieme di sotto-problemi derivazione di un ordinamento di tutti i sotto-problemi, per il calcolo efficiente e la memorizzazione delle loro soluzioni in una tabella. (memorizzazione dei valori intermedi – memoization- in una tabella di programmazione dinamica) Numero di passi dell'algoritmo limitato superiormente dal prodotto tra il numero di sotto-problemi e il costo di ricombinazione delle loro soluzioni ottime Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 6 3 05/11/2013 Esempio: Numeri di Fibonacci • Esempio: successione di Fibonacci (0, 1, 1, 2, 3, 5, 8, 13,...) o 0 = 0 o 1 = 1 o = − 1 + − 2 ≥ 2 • Ricorsione Fib( n ) { // n >= 0 if (n <= 1) RETURN n; else RETURN Fib(n-1) + Fib(n-2); } Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 7 Ricorsione inefficiente: analisi = ( …. − − − − − =* − + + + + + = φ + − − + = − + )+ = − + + = − + + + ! " + + ∑ , ≥ . ≤ + = ∑ ≤ > = Fib(n) richiede O(Fn+3) = O(φ φn+3) passi, dove φ = ( + ")/ ≈ , ' ( Algoritmi e strutture di dati 2 ).... è il rapporto aureo Lezione 4- Programmazione dinamica 8 4 05/11/2013 Fibonacci con programmazione dinamica Fib( n ) { // n >= 0 F[0] = 0; F[1] = 1; for (k = 2; k <= n; k = k + 1) F[k] = F[k-1] + F[k-2]; RETURN F[n]; [alvie] } L’array F è la tabella di programmazione dinamica e richiede O(n) tempo per essere riempita Fn può essere anche calcolato in tempo O(log n), basandosi sulla forma chiusa di Binet. Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 9 Problema del resto Dati: • un insieme - = { , . . , / − }di tipi di monete , di valore 1 , … , 1/ • un numero illimitato di monete di tipo 2per 0 ≤ 2 ≤ 3 − 1 • un intero 4 si vuole determinare un vettore , … , / , dove è il numero di monete dell'2 −esimo tipo, in modo da ottenere il resto 4con il minor numero possibile di monete. • • Vogliamo quindi minimizzare / con il vincolo 5 / 5 Algoritmi e strutture di dati 2 1 =4 Lezione 4- Programmazione dinamica 10 5 05/11/2013 Soluzione ricorsiva 6(4):minimo numero di monete necessario per ottenere il resto 4 o 4 = è il caso base. Non occorre restituire alcuna moneta, per cui 6 = o 4 > : è il caso ricorsivo. Se si utilizza una moneta di tipo i per il resto 4, allora il problema diventa creare il resto di 4 − 1 col minor numero possibile di monete Definizione di 6 4 conseguente: 6 4 =: CD4 = +∞ CD1 > 6ED6FG ≤ ≤ / − + min 6(4 − 1 ) +HI6 /D I >:?@ AB Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 11 Algoritmo per il problema del resto Basato sul riempimenti di una tabella resto di dimensione 4 + . Problema più generale: o resto[c] indica il minimo numero di monete necessarie per ottenere il resto c o Se c=R, abbiamo la soluzione o riempimento della tabella da sinistra verso destra • Caso base: resto[c]=0 • Caso ricorsivo, calcola resto[c] prendendo il minimo tra tutti i valori resto[K − 1 ]+1 Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 12 6 05/11/2013 Algoritmo per il problema del resto Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 13 Algoritmo per il problema del resto: esempio Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 14 7 05/11/2013 Algoritmo per il problema del resto: esempio Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 15 Algoritmo goloso per il problema del resto Più semplice: si effettuano iterativamente le operazioni seguenti, fino ad ottenere 4. o si sceglie la moneta di valore più alto a disposizione o se ne usa la massima quantità possibile Caratteristica tipica degli algoritmi golosi (greedy): le scelte si basano principalmente sulla configurazione attuale, senza cercare di valutarne le conseguenze sulle configurazioni successive. • Può essere interpretato come un caso speciale di programmazione dinamica. Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 16 8 05/11/2013 Coin Changing: Greedy Algorithm Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 17 Coin Changing: Greedy Algorithm Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 18 9 05/11/2013 Algoritmo goloso per il problema del resto Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 19 Non ottimalità dell'algoritmo goloso per il problema del resto Esempio: M = 9, 3 = 3, PQ = 6, PS = 4 PU = 1. • Algoritmo goloso: una moneta da 6e tre monete da 1, in totale 4 • Soluzione ottima: due monete da 4 e una 1, in totale 3 Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 20 10 05/11/2013 Greedy Algorithm: Special cases Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 21 Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 22 11 05/11/2013 Sequenza ottima di moltiplicazioni Vogliamo usare la programmazione dinamica per calcolare il prodotto di n matrici V2di taglia W2 XW2 + 1 Hp. semplificativa: il costo di moltiplicazione di due matrici di taglia × Z e Z × [è pari a × Z × [ Esempio: W0 = 100, W1 = 20, W2 = 1000, W3 = 2, W4 = 50 Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 23 Sequenza ottima di moltiplicazioni • Il costo varia a seconda di come associamo il prodotto utilizzando la moltiplicazione tra due matrici: in generale, qual è il costo minimo? • input: sequenza di interi positivi W0, W1, … , W (dove W2 × W> S è la taglia della matrice V2 ) • output: minimo numero di operazioni per calcolare (detto costo minimo per V∗ ) con l’ipotesi che la moltiplicazione di due matrici di taglia × Z e Z × [ richieda × Z × [ operazioni. Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 24 12 05/11/2013 Approccio di forza bruta • Esiste un numero esponenziale (in ) di modi per calcolare il costo minimo per V∗ usando l’associatività con le parentesi: inefficiente! [Tale numero è quello di Catalan Cn-1 = n.ro di alberi binari distinti con n-1 nodi interni, aventi ciascuno due figli] • Metodo più efficiente: per 0 ≤ 2 ≤ ^ ≤ − 1, sia -( , _)= costo minimo per ` × ` + × L × `_ (la cui taglia risultante è W2 × Wa S ) • Il costo minimo per V∗ è quindi dato da b(0, − 1) Algoritmi e strutture di dati 2 • • Lezione 4- Programmazione dinamica 25 Calcolo ricorsivo di M(i,j) Caso base: -( , ) = per 0 ≤ 2 ≤ − 1 (per ottenere V2 non dobbiamo moltiplicare) Caso induttivo: per ogni 2 ≤ ` ×` × L × `_ = (` × ` dim.: W2 × Wa S < ^,vale × L × `6) × (`6 W2 × Wd S costo: c × c6 × `6 Wf × c_ S × Wa S b(2, ^) ≤ b(2, ) + b( + 1, ^) + W> × Wd Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica × L × `_ ) S × Wa S 26 13 05/11/2013 Calcolo ricorsivo di M(i,j) b(2, ^ Algoritmi e strutture di dati 2 b$2, b$ 1, ^ W> Y Wd S Y Wa Lezione 4- Programmazione dinamica S 27 Numero esponenziale di chiamate ricorsive, ciascuna invocata molte volte con gli stessi parametri d’ingresso Ricorsione costosa (come con Fibonacci) Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 28 14 05/11/2013 Tabella di programmazione dinamica Riempita per diagonali a partire dalla principale min b 0,0 b 0,1 b 1,2 b 2,2 WQ Y WS Y Wi WQ Y WU Y Wi tabella: ghZ[2[2][^] = b(2, ^ Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 29 Programmazione dinamica è iterativa Sostituiscono le chiamate ricorsive Serve a ricostruire la soluzione ottima Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 30 15 05/11/2013 Analisi di complessità • La tabella costi ha taglia × e il calcolo di ciascuno dei suoi elementi richiede j( )tempo (ciclo for più interno) • CostoMinimoIterativo richiede k( )tempo (laddove la versione ricorsiva è esponenziale in ) • Lo spazio occupato è k( )celle • Esercizio: utilizzando la tabella indice, ricavare la sequenza ottima di moltiplicazioni per il calcolo di `∗ Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 31 Sotto-sequenza comune più lunga Definizione del problema: • due stringhe di caratteri l, m,di lunghezze 3, • stringa nsotto-sequenza comune più lunga (longest common subsequence, LCS) se non ne esistono sottosequenze di lunghezza maggiore che siano comuni ad le m • opq(+, ):lunghezza delle sotto-sequenze comuni più lunghe di le m • numero esponenziale in 3e di possibili sotto-sequenze comuni di le m • non è efficiente generarle tutte per poi scegliere quella di lunghezza massima Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 32 16 05/11/2013 Sotto-sequenza comune più lunga Definizione: o( , _): lunghezza della sotto-sequenza più lunga comune alle due sequenze formate dai primi 2 elementi di le dai primi ^elementi di m. o , _ = opq ` , − ,r ,_ − o s(3, ) fornisce la soluzione opq +, o s(2, 0) = s(0, ^) = 0 per ogni2, ^ Algoritmi e strutture di dati 2 al problema Lezione 4- Programmazione dinamica 33 Sotto-sequenza comune più lunga Definizione: CD = F_ = o , _ = :o − , _ − + CD , _ > D+ − = [_ − ] max{o , _ − , o − , _ } CD , _ > D+ − ≠ [_ − ] se una delle due sequenza è vuota, allora la sotto-sequenza comune più lunga è vuota Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 34 17 05/11/2013 Sotto-sequenza comune più lunga Definizione: o ,_ CD F_ ,_ CD , _ , D+ :o ,o , _ 0 CD , _ , D+ max.o , _ J_ L v J_ L se l’ultimo carattere c in ciascuna sequenza è uguale, esiste una sotto-sequenza comune più lunga che lo contiene ed è ottenibile da quella in cui l’ultimo carattere è rimosso. c c Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 35 Sotto-sequenza comune più lunga Definizione: o ,_ CD F_ ,_ CD , _ , D+ :o max.o , _ ,o , _ 0 CD , _ , D+ J_ L v J_ L se invece l’ultimo carattere differisce, la sotto-sequenza comune più lunga è quella ottenuta rimuovendo l’ultimo carattere in una sola delle due sequenze Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 36 18 05/11/2013 Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 37 Sotto-sequenza comune più lunga Definizione: o ,_ • • • • • CD = F_ = o − , _ − + CD , _ > D+ − = [_ − ] =: max{o , _ − , o − , _ } CD , _ > D+ − ≠ [_ − ] Tabella lunghezza di dimensione (/ + ) × ( + ): l'algoritmo pone Hw GxDyy+[ ][_] = s(2, ^) j(3 ) elementi da determinare, corrispondenti a k(/ ) sottoproblemi L'elemento Hw GxDyy+[ ][_]è calcolabile in tempo costante, dati tutti gli elementi Hw GxDyy+[6][C]con C < _o con C = _, 6 < L'algoritmo richiede tempo k(/ ) Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 38 19 05/11/2013 Partizione di insiemi di interi • Insieme di interi positivi ` = {+ , + , …, + totale (pari) ∑ + = C. }di somma • Si vuole determinare se esiste `z = + , + , …, + {| tale che ∑{ + = C. ⊆` • Risolubile generando esplicitamente tutti i sottoinsiemi di `. • sottoinsiemi: tempo esponenziale in Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 39 Programmazione dinamica • Definiamo per 0 ≤ 2 ≤ e 0 ≤ ^ ≤ Z ~(2, ^) = [ • sse esiste € ⊆ {l0, l1, . . , l> S }t.c. ∑‚∈„ • =j Nota: ~( , Z) = [ • sse la partizione è possibile [convenzione: {+ , + , … , + − } = ∅] Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 40 20 05/11/2013 Programmazione dinamica per partizione Regola ricorsiva se l’insieme è vuoto allora la somma ^ = 0è l’unica possibile Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 41 Programmazione dinamica per partizione Regola ricorsiva la somma pari ^ era già possibile con un sottoinsieme di .+ , + , . . , + 0che non include l> S Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 42 21 05/11/2013 Programmazione dinamica per partizione Regola ricorsiva la somma pari ^èpossibile con un sottoinsieme che include l> : eliminando l> S deve esistere un sottoinsime la cui somma è pari a j l> S (ovviamente se j l> S ) Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 43 Partizione di un insieme di interi: tabella di programmazione dinamica • Tabella di programmazione dinamica di taglia Z+1 1 × • parti[i][j] = ~(2, ^) • Ordine riempimento per righe Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 44 22 05/11/2013 Partizione di insiemi di interi: esempi Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 45 Programmazione dinamica e partizione di insiemi di interi Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 46 23 05/11/2013 Analisi di complessità per partizione • Tempo k( C) • Spazio k( C) k(C)usando solo le ultime due righe compilate iterativamente • Nota: in generale è possibile ottenere delle prestazioni simili a quelle della programmazione dinamica usando ricorsione + memoization • [memoization = prender nota] • Convenzione: Φ denota un valore indefinito Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 47 Ricorsione + memoization Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 48 24 05/11/2013 Pseudo-polinomialità e programmazione dinamica • • • • • • Quando gli interi coinvolti nel problema diventano molto grandi dobbiamo usare un differente modello di computazione Esempio: complessità dell’algoritmo di partizione è k( C)ma la dimensione dell’input è circa + celle, per memorizzare la sequenza C, + , + , …, + : algoritmo pseudo-polinomiale Al crescere di Crispetto ad n, non possiamo più pensare di memorizzare C in una singola cella, ma piuttosto in { = k(log C ) celle (la sua rappresentazione binaria): la dimensione dell’input diventa di circa + {celle di memoria La complessità k( C) = k( {) diventa quindi esponenziale. In tal caso va confrontata con quella k( sottoinsiemi. ) che genera tutti i In altre parole, k( C)è una complessità polinomiale soltanto se C = k( )per una costante > . Algoritmi e strutture di dati 2 Lezione 4- Programmazione dinamica 49 25