Programmazione dinamica

Documenti analoghi
Algoritmi greedy. Gli algoritmi che risolvono problemi di ottimizzazione devono in genere operare una sequenza di scelte per arrivare alla soluzione

Note per la Lezione 6 Ugo Vaccaro

Note per la Lezione 7 Ugo Vaccaro

Parte III: Algoritmo di Branch-and-Bound

Algoritmi e Strutture Dati (Mod. B) Algoritmi Greedy (parte I)

Programmazione dinamica

Programmazione dinamica. Progettazione di Algoritmi a.a Matricole congrue a 1 Docente: Annalisa De Bonis

PROGRAMMAZIONE DINAMICA

Algoritmi e Strutture Dati

Algoritmi e strutture di dati 2

Heap e code di priorità

Il problema dello zaino

Complementi ed Esercizi di Informatica Teorica II

Ricerca Operativa. G. Liuzzi. Lunedí 20 Aprile 2015

Cammini minimi fra tutte le coppie

Tecniche avanzate di sintesi di algoritmi: Programmazione dinamica Algoritmi greedy

3.4 Metodo di Branch and Bound

Tecniche Algoritmiche: divide et impera

Progettazione di Algoritmi

Tempo e spazio di calcolo (continua)

e Algoritmi Marco Piastra Intelligenza Artificiale I Soddisfacibilità

Il Branch & Bound. Definizione 1. Sia S R n. La famiglia S = {S 1, S 2,..., S k S} tale che S 1 S 2 S k = S viene detta suddivisione di S.

Progettazione di Algoritmi

Cammini minimi in grafi:

Metodi e Modelli per l Ottimizzazione Combinatoria Cover inequalities

Problemi, istanze, soluzioni

Laboratorio di Programmazione M-Z

Note per la Lezione 4 Ugo Vaccaro

Esercizi Capitolo 11 - Strutture di dati e progettazione di algoritmi

Algoritmi e strutture dati

Una Libreria di Algebra Lineare per il Calcolo Scientifico

Un tipico esempio è la definizione del fattoriale n! di un numero n, la cui definizione è la seguente:

Università degli Studi di Verona. Algoritmie Diagrammidiflusso. Gennaio Sergio Marin Vargas. Dipartimento di Biotecnologie

10 STRUTTURE DI CONTROLLO REPEAT E WHILE. Strutture di controllo e variabili strutturate

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Appunti sui Codici di Reed Muller. Giovanni Barbarino

Array e Oggetti. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 12. A. Miola Dicembre 2006

Lezione 6 programmazione in Java

Sviluppo di programmi

Analisi algoritmi ricorsivi e relazioni di ricorrenza

Introduzione alla tecnica di Programmazione Dinamica

Esercitazioni per il corso di Logica Matematica

Albero di Riscorsione

Algoritmo di Branch & Bound

Algoritmi e Strutture Dati Geometria Computazionale. Daniele Loiacono

Algoritmi di ordinamento: Array e ricorsione

Esercizi per il corso di Algoritmi

Algoritmi e Strutture Dati

Matematica Discreta e Algebra Lineare (per Informatica)

Alberi di copertura. Mauro Passacantando. Dipartimento di Informatica Largo B. Pontecorvo 3, Pisa

Note sul Sudoku. Marco Liverani. Dicembre 2005

Laboratorio di Python

UNIVERSITÀ DEGLI STUDI DI PAVIA FACOLTÀ DI INGEGNERIA. Matlab: esempi ed esercizi

5. DIVIDE AND CONQUER I

Algoritmi e Strutture Dati

Divide et impera. Divide et impera. Divide et impera. Divide et impera

Gestione della produzione e della supply chain Logistica distributiva

Universita degli Studi di Ancona - Facolta di Ingegneria Laurea in Ing. Elettronica (VO) Ing. Informatica e Automatica - Ing. delle Telecomunicazioni

Schedulazione real-time di task PERIODICI

n n 1 n = > Il calcolo del fattoriale La funzione fattoriale, molto usata nel calcolo combinatorio, è così definita

Quadrato Magico. Fondamenti di Programmazione

Lezione 8 programmazione in Java. Anteprima. La ricorsione. Nicola Drago Dipartimento di Informatica Università di Verona

11.4 Chiusura transitiva

Sistemi di Elaborazione delle Informazioni

Luigi Piroddi

Problemi, algoritmi, calcolatore

Lezione 4. Problemi trattabili e soluzioni sempre più efficienti. Gianluca Rossi

Aniello Murano Problemi non decidibili e riducibilità

Il problema dello zaino

Esercitazione 3. Heapsort

Transcript:

Programmazione dinamica Violetta Lonati Università degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica Violetta Lonati Programmazione dinamica 1/26

Argomenti Programmazione dinamica: caratteristiche generali Scheduling di intervalli pesati Il problema dello zaino Violetta Lonati Programmazione dinamica 2/26

Argomenti Programmazione dinamica: caratteristiche generali Scheduling di intervalli pesati Il problema dello zaino Violetta Lonati Programmazione dinamica 3/26

Programmazione dinamica e problemi di ottimizzazione Tipicamente la programmazione dinamica si applica a problemi di ottimizzazione. Questi problemi ammettono in genere molte soluzioni possibili. Ciascuna soluzione ha un valore e ci interessa trovare una delle soluzione che ha il valore ottimo (massimo o minimo). Chiamiamo tale soluzione una soluzione ottimale (non è detto che ce ne sia una sola!) Violetta Lonati Programmazione dinamica 4/26

Programmazione dinamica: approccio generale La programmazione dinamica risolve un problema combinando le soluzioni dei suoi sottoproblemi. L approccio generale si può riassumere in 4 passi. 1. Caratterizzare la struttura di una soluzione ottimale. 2. Definire ricorsivamente il valore di una soluzione ottimale (e quindi di tutte). 3. Calcolare il valore delle soluzioni ottimali, tipicamente in maniera bottom-up, memorizzando in tabelle i valori delle sottosoluzioni ottimali. 4. Costruire una soluzione ottimale usando le informazioni già calcolate e memorizzate. Nota: il termine programming, tradotto con programmazione, non si riferisce alla scrittura di codice, ma al fatto che il metodo prevede la compilazione di tabelle. Violetta Lonati Programmazione dinamica 5/26

Programmazione dinamica: quando è utile Sottostruttura ottima: la soluzione ottimale contiene al suo interno le soluzioni ottimali dei suoi sottoproblemi Sottoproblemi sovrapposti: i sottoproblemi coinvolti devono essere sempre quelli, cioè lo spazio dei sottoproblemi deve essere piccolo; il numero dei sottoproblemi distinti deve essere polinomiale nella dimensione dell input. Violetta Lonati Programmazione dinamica 6/26

Programmazione dinamica VS metodo divide-et-impera Come il metodo divide-et-impera, la programmazione dinamica risolve un problema combinando le soluzioni dei suoi sottoproblemi. La programmazione dinamica è utile quando i sottoproblemi si sovrappongono, ovvero diversi sottoproblemi contengono gli stessi sottosottoproblemi: il metodo divide-et-impera risolverebbe i sottoproblemi inutilmente ogni volta un algoritmi di programmazione dinamica risolve ogni sottoproblema una sola volta e ne memorizza la soluzione in una tabella (memoization), evitando di dover ripetere ogni volta il calcolo della soluzione di un sottoproblema già risolto. Esempio: Fibonacci L albero delle chiamate ricorsive esplode! Memorizzando i valori già calcolati, evito di ripetere calcoli già svolti. Violetta Lonati Programmazione dinamica 7/26

Argomenti Programmazione dinamica: caratteristiche generali Scheduling di intervalli pesati Il problema dello zaino Violetta Lonati Programmazione dinamica 8/26

Scheduling di intervalli pesati - il problema Intervallo: (i, f, v), dove i è il tempo di inizio, f è il tempo di fine, v è il valore (o peso) dell intervallo. Dato un insieme I di intervalli, una soluzione al problema dello scheduling è data da un sottoinsieme S I di intervalli che non si sovrappongono fra loro. Il valore di una soluzione S è dato dalla somma dei valori degli intervalli contenuti in S Violetta Lonati Programmazione dinamica 9/26

Scheduling di intervalli pesati - continua Ordiniamo gli elementi di i in base al tempo di fine: I = {(i 1, f 1, v 1 ), (i 2, f 2, v 2 ),..., (i n, f n, v n )} f 1 f 2... f n Definizione Per ogni indice j tra 1 e n, sia p(j) come il più grande indice i < j tale che l intervallo di indice i non si sovrappone all intervallo di indice j. Violetta Lonati Programmazione dinamica 10/26

Scheduling di intervalli pesati - soluzione ricorsiva Detto Opt(j) il valore di una qualsiasi soluzione ottimale S j costruita usando gli intervalli di indici {1, 2,..., j}, vale questa relazione ricorsiva: Opt(j) = max{v j + Opt(p(j)), Opt(j 1)} se j S j, allora Opt(j) = v j + Opt(p(j)), altrimenti Opt(j) = Opt(j 1). Violetta Lonati Programmazione dinamica 11/26

Scheduling di intervalli pesati - complessità? Ogni sottoproblema può venire calcolato molte volte!! Su questa istanza del problema le chiamate ricorsive esplodono! Violetta Lonati Programmazione dinamica 12/26

Scheduling di intervalli pesati - Memoization Memorizziamo le soluzioni dei sottoproblemi in un vettore, riducendo le chiamate ricorsive: Violetta Lonati Programmazione dinamica 13/26

Scheduling di intervalli pesati - Ricostruire la soluzione Non c è bisogno di aggiungere informazioni. C è già tutto nel vettore! Violetta Lonati Programmazione dinamica 14/26

Scheduling di intervalli pesati - Programmazione dinamica Costruiamo il vettore delle soluzioni dei sottoproblemi senza ricorsione: Violetta Lonati Programmazione dinamica 15/26

Scheduling di intervalli pesati - Esempio di esecuzione Violetta Lonati Programmazione dinamica 16/26

Argomenti Programmazione dinamica: caratteristiche generali Scheduling di intervalli pesati Il problema dello zaino Violetta Lonati Programmazione dinamica 17/26

Il problema dello zaino - versione semplificata Dati: uno zaino che sopporta un peso massimo P, un insieme T = {1, 2,..., n} di tipi di oggetti. Ogni tipo i di oggetti ha un peso p i e un valore v i, entrambi interi positivi. (Per ogni tipo è disponibile una fornitura illimitata di oggetti.) Problema: Vogliamo riempire lo zaino non superando P con il peso complessivo degli oggetti, ma allo stesso tempo massimizzando la somma dei valori degli oggetti nello zaino. Una soluzione S è data da una lista di tipi, eventualmente ripetuti. Es: 3 oggetti di tipo 1 + 2 oggetti di tipo 4 + 1 oggetto di tipo 5. { } p i = P, MAX v i S i S Violetta Lonati Programmazione dinamica 18/26 i S

Il problema dello zaino (sempl.) - ricerca esaustiva È chiaro che in linea di principio potremmo provare a enumerare tutti gli insiemi di oggetti che stanno nello zaino, e cercare quello con valore massimo. Se però i tipi sono molti, e la capacità dello zaino grande, il numero di soluzioni da esaminare diventa improponibile. Violetta Lonati Programmazione dinamica 19/26

Il problema dello zaino (sempl.) - sottoproblemi Struttura ricorsiva del problema - sottoproblemi Se ho una soluzione ottima per uno zaino che regge P, e tolgo dalla soluzione un oggetto qualsiasi di tipo t, ottengo una soluzione ottima per uno zaino che regge P p t. Dimostrazione per assurdo: Infatti, se per assurdo esistesse una soluzione migliore con peso inferiore a P p t, potrei aggiungerle un oggetto di tipo t e ottenere così una soluzione migliore per il problema originale (il che è impossibile, avendo assunto che la soluzione fosse ottima). Violetta Lonati Programmazione dinamica 20/26

Il problema dello zaino (sempl.) - progr. dinamica Se conosciamo la soluzione ottima per uno zaino di peso Q, possiamo ottenere nuove soluzioni per zaini di grandezza superiore aggiungendo un oggetto di tipo t, per ogni tipo t in T. In particolare, se ho una soluzione di valore V per uno zaino di peso Q, allora so che esiste una soluzione di valore V + v t per uno zaino di peso P + p t, per ogni t in T. Tutte le soluzioni ottime si ottengono in questo modo. Violetta Lonati Programmazione dinamica 21/26

Il problema dello zaino (sempl.) - vettore di supporto Costruisco un vettore s di lunghezza P, tale che s[i] contenga il valore delle soluzioni ottime per uno zaino di peso i. Il vettore si può costruire partendo da i = 0 e incrementando i, sfruttando la relazione vista prima. Una volta completato il vettore s, il valore ottimo di una soluzione per P è chiaramente dato da s[p]. Violetta Lonati Programmazione dinamica 22/26

Il problema dello zaino (sempl.) - esempio Tabella dei pesi e dei valori dei tipi: Tipo Peso Valore 1 5 2 2 3 3 3 7 8 Nel seguente schema: la prima riga riporta gli indici, ciascuna delle righe successive rappresenta un passo dell esecuzione: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 0 0 3 2 8 0 0 0 3 3 2 2 8 8 0 0 0 3 3 3 2 8 8 8 0 0 0 3 3 3 6 8 8 8 11 Violetta Lonati Programmazione dinamica 23/26

Il problema dello zaino - versione generale uno zaino che sopporta un peso massimo P, un insieme E = {1, 2,..., m} di oggetti. Ogni oggetto ha un peso p i e un valore v i, entrambi interi positivi. Problema: Vogliamo riempire lo zaino non superando P con il peso complessivo degli oggetti, ma allo stesso tempo massimizzando la somma dei valori degli oggetti nello zaino. Riduzione? Non possiamo più utilizzare la riduzione precedente: infatti, se tolgo un oggetto e da una soluzione ottima per uno zaino che porta P, non è detto che quanto rimane sia una soluzione ottima per uno zaino che porta P p e. Infatti, utilizzando e potrei ottenere una soluzione migliore per quel peso, e a questo punto non potrei aggiungerlo nuovamente: la dimostrazione per assurdo non funziona più. Violetta Lonati Programmazione dinamica 24/26

Il problema dello zaino - riduzione a sottoproblemi Riduco rispetto a due parametri: peso e numero di oggetti considerati! Cerco soluzione ottima S P,j per tutti gli zaini di peso inferiore a P e per tutti gli insiemi di oggetti 1, 2,..., j con j m. Struttura ricorsiva Sia S P,j soluzione ottima di valore V per uno zaino di peso P che utilizza gli oggetti 1, 2,..., j. Ci sono due possibilità: se j S P,j, allora esiste soluzione ottima S P pj,j 1 di valore V v j se j S P,j, allora esiste soluzione ottima S P,j 1 di valore V (data dallo stesso sottoinsieme!) Violetta Lonati Programmazione dinamica 25/26

Il problema dello zaino - riduzione a sottoproblemi Un vettore non sarà sufficiente! Uso una matrice che contiene nella posizione di indici i e j il valore della sottosoluzione ottima per uno zaino di peso i che utilizza al più i primi j oggetti di E (chiaramente, 0 i P e 0 j m). Costruisco la matrice a partire dalla posizione (0, 0). Il valore ottimo sarà nella posizione (P, m). Violetta Lonati Programmazione dinamica 26/26