Programmazione dinamica

Slides:



Advertisements
Presentazioni simili
UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA
Advertisements

UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA
Algoritmi e Strutture Dati
Master Bioinformatica 2002: Grafi Problema: cammini minimi da tutti i vertici a tutti i vertici Dato un grafo pesato G =(V,E,w), trovare un cammino minimo.
Algoritmi e Strutture Dati 2
Programmazione dinamica: problema della sottosequenza più lunga
                      Insertion-Sort
UNIVERSITÀ DEGLI STUDI DI PARMA
MATLAB.
Cammini minimi con una sorgente
Code a priorità (Heap) Definizione
Alberi binari di ricerca
Master Bioinformatica 2002: Progetto di Algoritmi1 Programmazione Dinamica (PD) Altra tecnica per risolvere problemi di ottimizzazione, piu generale degli.
Introduzione agli algoritmi. Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Usa la tecnica del.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 06/03/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Algoritmi e strutture Dati - Lezione 7
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl Capitolo 4 Ordinamento:
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Algoritmi e Strutture Dati
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
A cosa serve la Matematica nella nostra società
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. B)
Trovare il percorso minimo da b ad ogni altro vertice
Il linguaggio Fortran 90: 4. Array: Vettori e Matrici
APPUNTI SUL LINGUAGGIO C
CONTROLLO DI SUPPLY CHAIN MEDIANTE TECNICHE H-INFINITO E NEGOZIAZIONE
Algoritmi e Strutture Dati
Studente Claudia Puzzo
Lalgoritmo MergeSort Applica la strategia del divide et impera Divide: suddivide la sequenza di n elementi data in due sottosequenze di n/2 elementi Impera:
Algoritmo SelectSort Invariante di ciclo: ad ogni passo
Elementi di Informatica di base
Radix-Sort(A,d) // A[i] = cd...c2c1
Studieremo alcune tecniche per il progetto di algoritmi e di strutture dati: Programmazione dinamica Algoritmi golosi Analisi ammortizzata Vedremo poi.
Calcolo Parallelo e Distribuito
Merge-Sort(A,p,r) if p < r q = (p+r)/2 Merge-Sort(A,p,q)
Passo 3: calcolo del costo minimo
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Terzo passo: lunghezza di una LCS LCS-Length(X, Y, m, n) for i = 0 to m c[i, 0] = 0 for j = 1 to n c[0, j] = 0 for j = 1 to n for i = 1 to m if x i ==
Algoritmi e Strutture Dati
Algoritmi e Strutture Dati
Introduzione agli algoritmi e strutture dati 3/ed T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein Copyright © 2010 – The McGraw-Hill Companies srl.
Cammini minimi tra tutte le coppie
Progressioni aritmetiche descrizione elementare
Teoria degli algoritmi e della computabilità Terza giornata: Ricerca e ordinamento ottimi. P vs NP, algoritmi di approssimazione, e il potere della randomizzazione.
Complessità degli algoritmi (cenni) CORDA – Informatica A. Ferrari.
Array (ordinamento) CORDA – Informatica A. Ferrari.
Soluzione: Algoritmo Heap-Sort Un array A[1..n] può essere interpretato come un albero binario: A[1] è la radice, A[2i] e A[2i+1] sono i figli di A[i]
Risoluzione di Problemi con gli algoritmi Ricorsivi
Algoritmi e Strutture Dati
Paola Disisto, Erika Griffini, Yris Noriega.  Insieme ordinato di operazioni non ambigue ed effettivamente computabili che, quando eseguito, produce.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Programmazione dinamica Algoritmi golosi Analisi ammortizzata
Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.
Algoritmi golosi Tecniche di soluzione dei problemi viste finora:
Complessità Computazionale
Algoritmi e Strutture Dati Luciano Gualà
Transcript della presentazione:

Programmazione dinamica Introduzione. Prodotto di una sequenza di matrici. Caratterizzazione soluzione ottima. Definizione ricorsiva soluzione ottima. Calcolo del valore di una soluzione ottima. Costruzione di una soluzione ottima.

Programmazione dinamica La programmazione dinamica, generalmente, viene adottata per risolvere problemi di ottimizzazione. Questo vuol dire: il problema ammette diverse soluzioni ogni soluzione ha un costo si sta cercando una soluzione che mi dia il valore ottimo (il massimo o il minimo dei costi) Nota: non si cerca “la” soluzione ottima, ma “una” soluzione ottima, dato che possono esistere varie soluzioni ottime.

Prodotto di una sequenza di matrici Problema: Si vuole effettuare il prodotto di una sequenza di matrici <A1, A2,…, An> minimizzando il numero di moltiplicazioni scalari effettuati. Il costo dipende dalla sua parentesizzazione: ((A1 ((A2 A3) (A4 …)))An) Per esempio: <A1, A2, A3> dim(A1)=10x100; dim(A2)=100x5; dim(A3)=5x50; E’ meglio ((A1 A2) A3) ? Oppure (A1 (A2 A3)) ?

Costo moltiplicazione di due matrici MATRIX-MULTIPLY(A, B) if columns[A] ≠ rows[B] then error “dimensioni non compatibili” else for i ← 1 to rows[A] do for j ← 1 to columns[B] do C[i,j] ← 0 for k ← 1 to columns[A] do C[i,j] ← C[i,j] + A[i,k] B[k,j] return C Sostanzialmente: Se si moltiplica A con dimensioni p x q e B con dimensioni q x r, si ottiene una nuova matrice C con dimensioni p x r. Il costo è determinato dal numero di moltiplicazioni scalari effettuati, ossia p • q • r. Per ogni elemento della matrice C (p x r) bisogna effettuare q moltiplicazioni scalari.

Prodotto di una sequenza di matrici Ritornando all’esempio: <A1, A2, A3> dim(A1)=10x100; dim(A2)=100x5; dim(A3)=5x50; (A1 A2) → (10 • 100 • 5) = 5000 molt. ((A1 A2) A3) → (10 • 100 • 5) + (10 • 5 • 50) = 7500 molt. (A2 A3) → (100 • 5 • 50) = 25000 molt. (A1 (A2 A3)) → (100 • 5 • 50) + (10 • 100 • 50) = 75000 molt. Quindi: ((A1 A2) A3) costa meno di (A1 (A2 A3))!

Numero di parentesizzazioni Supponiamo che per risolvere il problema si controlli in maniera esaustiva tutte le soluzioni. P(n) = tutte le possibili parentesizzazioni di una sequenza di n matrici prodotto di sottoparentesizzazioni sequenza dei numeri Catalani Nota: la ricerca esaustiva risulta essere molto dispendiosa!

Soluzione in programmazione dinamica Lo sviluppo di un algoritmo in programmazione dinamica può essere diviso in quattro fasi o passi: Caratterizzazione della struttura di una soluzione ottima. Definizione ricorsiva del valore di una soluzione ottima. Calcolo del valore di una soluzione ottima con una strategia bottom-up. Costruzione di una soluzione ottima a partire dalle informazioni calcolate.

1. Caratterizzazione della struttura di una soluzione ottima. Per il nostro problema una soluzione ottima è del tipo: ((A1 A2… Ak) (Ak+1 Ak+2… An)) con 1 ≤ k ≤ n tale che (A1 A2… Ak) → la sua parentizzazione è ottima per la sequenza <A1, A2,… Ak> (altrimenti scelgo quella ottima, costa meno!). Dimensione matrice finale = p x q (Ak+1 Ak+2… An) → la sua parentizzazione è ottima per la sequenza <Ak+1, Ak+2,… An> (altrimenti scelgo quella ottima). Dimensione matrice finale = q x r Inoltre il costo della soluzione ottima è costo = costo(A1 A2… Ak) + costo(Ak+1 Ak+2… An) + p•q•r

2. Definizione ricorsiva del valore di una soluzione ottima. Si determina una soluzione ottima ricorsivamente in termini dei valori delle soluzioni ottime dei sottoproblemi. Sottoproblema: <Ai, Ai+1,… Aj> con 1 ≤ i ≤ j ≤ n m[i,j] = costo minimo per la sottosequenza <Ai, Ai+1,… Aj> m[i,i] = costo minimo per la sottoseq. <Ai,… Aj> = Ai = 0 m[1,n] = costo minimo per la sequenza <A1, A2,… An>

2. Definizione ricorsiva del valore di una soluzione ottima. E’ facile vedere che il valore di m[i,j] è ottenuto sommando i costi minimi del calcolo dei sottoprodotti Ai..k e Ak+1..j con il costo del prodotto delle due matrici risultanti (pari a pi-1pkpj). (pi-1Aipi…pk-1Akpk) (pkAk+1pk+1…pj-1Ajpj) Nota: definiamo s[i,j] = k, per tenere traccia del valore k che costituisce una soluzione ottima per il sottoproblema <Ai, A2,… Aj>. Dimensioni matrice Aj

3. Calcolo del valore di una soluzione ottima con strategia bottom-up. Bottom-up vuol dire che si parte a calcolare i costi ottimi per le sottosequenze lunghe 1, poi quelle lunghe 2 e così via… UP lung=n m[1,n] … … lung=3 m[1,3] m[2,4] m[3,5] … m[n-2,n] lung=2 m[1,2] m[2,3] m[3,4] m[4,5] … m[n-1,n] lung=1 m[1,1] = 0 m[2,2] = 0 m[3,3] = 0 m[4,4] = 0 … m[n,n] = 0 BOTTOM

3. Calcolo del valore di una soluzione ottima con strategia bottom-up. MATRIX-CHAIN-ORDER(p) // INPUT: p = <p0, p1, …, pn> dimensioni matrici in ingresso, lunghezza(p) = n+1 n ← length[p] – 1 // n = lunghezza(p) – 1 for i ← 1 to n do m[i,i] ← 0 // costo 0 sottoseq. lunghe 1 for l ← 2 to n // l = lunghezza sottoseq., da 2 a n !!! do for i ← 1 to n-l+1 // i = inizio sottoseq. do j ← i+ l -1 // j = fine sottoseq. m[i,j] ← ∞ // costo sottoseq. [i,j] inizializzato a ∞ for k ← i to j-1 // calcolo k soluzione ottima m[i,j] do q ← m[i,k] + m[k+1,j] + pi-1pkpj if q < m[i,j] // se costo calcolato è minore del costo ottimo attuale then m[i,j] ← q // aggiorna matrice costi s[i,j] ← k // aggiorna matrice indici k return m e s

3. Calcolo del valore di una soluzione ottima con strategia bottom-up. 1 6 2 5 15125 matrice dimensione A1 30 x 35 A2 35 x 15 A3 15 x 5 A4 5 x 10 A5 10 x 20 A6 20 x 25 j 11875 10500 3 4 i 4 3 9375 7125 5375 5 2 7875 4375 2500 3500 6 1 15750 2625 750 1000 5000 A1 A2 A3 A4 A5 A6

3. Calcolo del valore di una soluzione ottima con strategia bottom-up. 1 6 2 5 3 matrice dimensione A1 30 x 35 A2 35 x 15 A3 15 x 5 A4 5 x 10 A5 10 x 20 A6 20 x 25 j 3 3 3 4 i 4 3 3 3 3 5 2 1 3 3 5 1 2 3 4 5 ((A1 ) (A2 A3)) ((A4 A5) A6) → s[1,6]=3; s[1,3]=1; s[4,6]=5.

3. Calcolo del valore di una soluzione ottima con strategia bottom-up. Osservazione importante: Il numero di sottoproblemi è relativamente basso: un problema per ogni scelta di i e j, con 1 ≤ i ≤ j ≤ n, per un totale di numero di sottoproblemi Θ(n2) =memoria necessaria per m e s Problemi di lunghezza 0 (m[i,i]) Problemi di lunghezza l>0 (m[i,j]) Sottoproblemi comuni Se si facesse una ricerca esaustiva potrebbe succedere di risolvere più volte lo stesso sottoproblema. Per esempio, la soluzione ((A1 ) (A2 A3)) ((A4 A5) A6) e la soluzione (A1) (((A2 A3) (A4 A5)) A6) hanno in comune (A2 A3) e (A4 A5).

4. Costruzione di una soluzione ottima La strategia per la costruzione di una soluzione ottima dipende dalle informazioni dei sottoproblemi calcolate nelle fasi precedenti. Nel nostro caso specifico utilizziamo la matrice s: A1 A2… An A1 A2… As[1,n] As[1,n]+1As[1,n]+2… An A1… As[1,s[1,n]] As[1,s[1,n]]+1… As[1,n]

4. Costruzione di una soluzione ottima Nel nostro caso specifico utilizziamo la matrice s: A1 A2 A3 A4 A5 A6 s[1,6]=3. s[1,3]=1; s[4,6]=5. s[2,3]=2; s[4,5]=4. A1 A2 A3 A4 A5 A6 A1 A2 A3 A4 A5 A6 A2 A3 A4 A5 Soluzione: ((A1 ) (A2 A3)) ((A4 A5) A6).

4. Costruzione di una soluzione ottima MATRIX-CHAIN-MULTIPLY(A, s, i, j) if j > i then X ← MATRIX-CHAIN-MULTIPLY(A, s, i, s[i,j]) Y ← MATRIX-CHAIN-MULTIPLY(A, s, s[i,j]+1, j) return MATRIX-MULTIPLY(X,Y) else return Ai MATRIX-CHAIN-MULTIPLY(A, s, 1, 6) calcola il prodotto della sequenza di matrici secondo la parentizzazione: ((A1 ) (A2 A3)) ((A4 A5) A6).

Altri problemi La più lunga sottosequenza in comune Dati due sequenze X e Y si cerca una sottosequenza Z comune di lunghezza massima. Il problema della zaino Dato degli oggetti O1, O2, …, On che hanno volume V1, V2, …, Vn e valore Val1, Val2, …, Valn, si cerca di riempire lo zaino di volume V massimizzando la somma dei valori. Il problema consiste nel scegliere i vari oggetti in modo che il volume complessivo sia al massimo V e la somma dei loro valori sia ottimo.