Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali.

Slides:



Advertisements
Presentazioni simili
Rette perpendicolari Due rette r e s si dicono perpendicolari se, incontrandosi, formano quattro angoli fra loro congruenti; ciascuno di questi angoli.
Advertisements

UNIVERSITA’ DI MILANO-BICOCCA LAUREA MAGISTRALE IN BIOINFORMATICA
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.
Programmazione dinamica: problema della sottosequenza più lunga
I Poligoni.
Informatica Generale Marzia Buscemi
1 Grandezze omogenee, commensurabili e incommensurabili
Programmazione dinamica
Camil Demetrescu, Irene Finocchi, Giuseppe F. ItalianoAlgoritmi e strutture dati Copyright © The McGraw - Hill Companies, srl 1 Ordinamenti ottimi.
Iterazione enumerativa (for)
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
U V U V (a) |cfc|=2 prima e dopo (b) |cfc|=2 prima e |cfc|=1 dopo
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
Capitolo 4 Ordinamento Algoritmi e Strutture Dati.
CORSO DI PROGRAMMAZIONE II Introduzione alla ricorsione
Algoritmi e Strutture Dati (Mod. B)
Algoritmi e Strutture Dati (Mod. A)
Alberi di Ricorrenza Gli alberi di ricorrenza rappresentano un modo conveniente per visualizzare i passi di sostitu- zione necessari per risolvere una.
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
Algoritmi e strutture dati
Uso dei cicli y t =c+ty t-1 +e Un uso dei cicli può essere quello di creare una serie storica per cui y t =c+ty t-1 +e dove poniamo c e t scalari ed e~N(0,1).
Algoritmi e Strutture Dati
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:
Anche la RB-Delete ha due fasi: Nella prima viene tolto un nodo y avente uno dei sottoalberi vuoto sostituendolo con la radice dellaltro sottoalbero. Per.
Metodo della moltiplicazione
Esercizio 10.* Un cassiere vuole dare un resto di n centesimi di euro usando il minimo numero di monete. a) Descrivere un algoritmo goloso per fare ciò.
Strutture dati per insiemi disgiunti
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.
Passo 3: calcolo del costo minimo
Vedremo in seguito che (n log n) è un limite stretto per il problema dellordinamento. Per ora ci limitiamo a dimostrare che: La complessità nel caso pessimo.
Cerchiamo di rispondere alla seconda domanda 2)La soluzione trovata con lalgoritmo goloso è ottima o esistono anche soluzioni con più di quattro attività?
Ispezione lineare La funzione hash h(k,i) si ottiene da una funzione hash ordinaria h'(k) ponendo L’esplorazione inizia dalla cella h(k,0) = h'(k) e continua.
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
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
La complessità media O(n log n) di Quick-Sort vale soltanto se tutte le permutazioni dell’array in ingresso sono ugualmente probabili. In molte applicazioni.
Cammini minimi da un sorgente
Implementazione di dizionari Problema del dizionario dinamico Scegliere una struttura dati in cui memorizzare dei record con un campo key e alcuni altri.
Allievi Elettrici - AA Le funzioni ricorsive in C
Risoluzione delle collisioni con indirizzamento aperto Con la tecnica di indirizzamento aperto tutti gli elementi stanno nella tavola. La funzione hash.
Ordinamento in tempo lineare Il limite inferiore Ω(n log n) vale per tutti gli algoritmi di ordinamento generali, ossia per algoritmi che non fanno alcuna.
Capitolo 13 Cammini minimi: Algoritmo di Floyd e Warshall Algoritmi e Strutture Dati.
I Poligoni.
Algoritmi e strutture Dati - Lezione 7 1 Algoritmi di ordinamento ottimali L’algoritmo Merge-Sort ha complessità O(n log(n))  Algoritmo di ordinamento.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Realizzazione software
1 Informatica Generale Marzia Buscemi Ricevimento: Giovedì ore , Dipartimento di Informatica, stanza 306-PS o per posta.
Codici prefissi Un codice prefisso è un codice in cui nessuna parola codice è prefisso (parte iniziale) di un’altra Ogni codice a lunghezza fissa è ovviamente.
Informatica 4 La ricorsione. Definizione di ricorsione Ricorsione è la proprietà di quei programmi che, all’interno delle istruzioni che li compongono,
Programmazione dinamica Algoritmi golosi Analisi ammortizzata
Algoritmi golosi Tecniche di soluzione dei problemi viste finora:
Complessità Computazionale
Problema dell’Ordinamento. Problema dell’ordinamento Formulazione del problema –Si vuole ordinare una lista di elementi secondo una data proprietà P Esempio:
GLI ALGORITMI DI ORDINAMENTO
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Divide et Impera Parte 11 - Risoluzione di problemi per divisione in sottoproblemi “bilanciati” Corso A: Prof. Stefano Berardi
Algoritmi e Strutture Dati HeapSort. Select Sort: intuizioni L’algoritmo Select-Sort  scandisce tutti gli elementi dell’array a partire dall’ultimo elemento.
I Poligoni.
Algoritmi e Strutture Dati Luciano Gualà
Rudimenti di Complessità Corso di Programmazione II Prof. Dario Catalano.
Le caratteristiche dei poligoni
1 ELEMENTI DI CALCOLO COMBINATORIO. 2 Elementi di calcolo combinatorio Si tratta di una serie di tecniche per determinare il numero di elementi di un.
La Circonferenza. LA CIRCONFERENZA Assegnato nel piano un punto C detto Centro, si chiama circonferenza la curva piana con i punti equidistanti da C.
Transcript della presentazione:

Problemi risolvibili con la programmazione dinamica Abbiamo usato la programmazione dinamica per risolvere due problemi. Cerchiamo ora di capire quali problemi si possono risolvere con questa tecnica. Sono dei problemi di ottimizzazione in cui da un insieme (generalmente molto grande) di soluzioni possibili vogliamo estrarre una soluzione ottima rispetto ad una determinata misura.

a)una soluzione ottima si possa costruire a partire da soluzioni ottime di sottoproblemi: Proprietà di sottostruttura ottima. Per poter applicare vantaggiosamente la programmazione dinamica bisogna che:

b) che il numero di sottoproblemi distinti sia molto minore del numero di soluzioni possibili tra cui cercare quella ottima. Altrimenti una enumerazione di tutte le soluzioni può risultare più conveniente. Se ciò è vero significa che uno stesso problema deve comparire molte volte come sottoproblema di altri sottoproblemi. Proprietà della ripetizione dei sottoproblemi.

Supposto che le condizioni a) e b) siano verificate, occorre scegliere l’ordine in cui calcolare le soluzioni dei sottoproblemi. Tale ordine ci deve assicurare che nel momento in cui si risolve un sottoproblema le soluzioni dei sottoproblemi da cui esso dipende siano già state calcolate. Ordine bottom-up.

Alternativamente si può usare una procedura ricorsiva top-down che esprima direttamente la soluzione di un sottoproblema in termini delle soluzioni dei sottoproblemi da cui essa dipende. In questo caso occorre però memorizzare le soluzioni trovate in modo che esse non vengano ricalcolate più volte.

Confronto tra algoritmo iterativo bottom-up ed algoritmo ricorsivo top-down con memoria: Se per il calcolo della soluzione globale servono le soluzioni di tutti i sottoproblemi l’algoritmo bottom-up è migliore di quello top-down. Entrambi gli algoritmi calcolano una sola volta le soluzioni dei sottoproblemi ma il secondo è ricorsivo ed inoltre effettua un controllo in più.

Se per il calcolo della soluzione globale servono soltanto alcune delle soluzioni dei sottoproblemi l’algoritmo bottom-up le calcola comunque tutte mentre quello top-down calcola soltanto quelle che servono effettivamente. In questo caso l’algoritmo top-down può risultare migliore di quello bottom-up. Il prossimo problema è un esempio di questa situazione.

Massima sottosequenza comune In questo problema sono date due sequenze X = x 1 x 2...x m e Y = y 1 y 2...y n e si chiede di trovare la più lunga sequenza Z = z 1 z 2...z k che è sottosequenza sia di X che di Y Ricordiamo che una sottosequenza di una sequenza X è una qualsiasi sequenza ottenuta da X cancellando alcuni elementi.

Il problema della massima sottosequenza ha molte applicazioni. Per citarne solo alcune: - individuare le parti comuni di due versioni dello stesso file (sequenze di caratteri ASCII). - valutare la similitudine tra due segmenti di DNA (sequenze di simboli A,C,G,T).

Passo 1: Struttura di una massima sottosequenza comune (LCS) Sia Z = z 1...z k una LCS di X = x 1...x m e Y = y 1...y n La sottostruttura ottima di Z discende dalle seguenti proprietà: 1.se x m = y n allora z k = x m = y n e Z k-1 è una LCS di X m-1 e Y n-1 2.altrimenti se z k ≠ x m allora Z è LCS di X m-1 e Y 3.altrimenti z k ≠ y n e Z è una LCS di X e Y n-1

Dimostrazione: 1.Supponiamo x m = y n Se z k ≠ x m = y n potremmo aggiungere il simbolo x m = y n in coda a Z ottenendo una sottosequenza comune più lunga contro l’ipotesi che Z sia una LCS. Quindi z k = x m = y n e Z k-1 è sottosequenza comune di X m-1 e Y n-1. 2.Se z k ≠ x m allora Z è sottosequenza di X m-1 e Y Essendo Z una LCS di X e Y essa è anche una LCS di X m-1 e Y. 3.il caso z k ≠ y n è simmetrico.

Data una sequenza X = x 1 x 2...x m indicheremo con X i = x 1 x 2...x i il prefisso di X di lunghezza i. L’insieme dei sottoproblemi è costituito quindi dalla ricerca delle LCS di tutte le coppie di prefissi (X i,Y j ), per i = 0,…,m e j = 0,…,n. Totale (m+1)(n+1) = Θ(mn) sottoproblemi.

Passo 2: soluzione ricorsiva Siano X = x 1...x m e Y = y 1...y n le due sequenze di cui vogliamo calcolare una LCS e per i = 0,1,...,m e j = 0,1,...,n sia c i,j la lunghezza di una LCS dei due prefissi X i e Y j. Usando le proprietà che abbiamo appena dimostrato possiamo scrivere:

Passo 3 Esempio X=ABCBDAB Y=BDCABA i j CDB cscs 1 BAA ABCBDABABCBDAB cscs cscs cscs cscs cscs cscs cscs Y X 00 11 11 11 11 11 11 00 11 11 11 22 22 22 00 11 22 22 22 22 22 11 11 22 22 22 33 33 11 22 22 33 33 33 44 11 22 22 33 33 44 44

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 == y j c[i, j] = c[i-1, j-1]+1, s[i, j] = “  ” elseif c[i-1, j] ≥ c[i, j-1] c[i, j] = c[i-1, j], s[i, j] = “  ” else c[i, j] = c[i, j-1], s[i, j] = “  ” return c,s

Quarto passo Esempio X=ABCBDAB Y=BDCABA i j CDB cscs 1 BAA ABCBDABABCBDAB cscs cscs cscs cscs cscs cscs cscs Y X 00 11 11 11 11 11 11 00 11 11 11 22 22 22 00 11 22 22 22 22 22 11 11 22 22 22 33 33 11 22 22 33 33 33 44 11 22 22 33 33 44 44 44 44 LCS=....LCS=...A 33 33 LCS=..BA 22 22 LCS=.CBA 11 11 LCS=BCBA 0 cscs

Quarto passo: Stampa della LCS Print-LCS(X, s, i, j) if i > 0 and j > 0 if s[i, j] == “  ” Print-LCS(X, s, i-1, j-1) print X[i] elseif s[i, j] == “  ” Print-LCS(X, s, i-1, j) else Print-LCS(X, s, i, j-1)

0 11 0 00 00 11 11 11 11 22 22 33 0 11 11 11 11 22 22 22 22 22 33 44 33 44 44 Metodo top-down Esempio X=ABCBDAB Y=BDCABA i j CDB 1 BAA ABCBDABABCBDAB Y X cscs cscs cscs cscs cscs cscs cscs cscs

Triangolazione ottima Una triangolazione di un poligono convesso è una suddivisione del poligono in triangoli ottenuta tracciando delle diagonali che non si intersecano. Vi sono più triangolazioni possibili dello stesso poligono

In questo problema sono dati i vertici q 1,q 2,…,q n di un poligono convesso P presi in ordine antiorario. Ad ogni triangolo T è attribuito un costo c(T). Ad esempio c(T) potrebbe essere la lunghezza del perimetro, la somma delle altezze, il prodotto delle lunghezze dei lati, (l’area ?), ecc. Si vuole trovare una triangolazione del poligono P tale che la somma dei costi dei triangoli sia minima.

In quanti modi possiamo suddividere in triangoli un poligono convesso di n vertici? Ogni lato del poligono P appartiene ad un solo triangolo della triangolazione. q1q1 qnqn qkqk T Siano q 1 q k q n i vertici del triangolo T a cui appartiene il lato q 1 q n

Il vertice q k può essere scelto in n-2 modi diversi e i due poligoni hanno rispettivamente n 1 = k ed n 2 = n-k+1 vertici. q1q1 qnqn qkqk P1P1 P2P2 T Il triangolo T suddivide il poligono P nel triangolo T stesso e nei due poligoni P 1 e P 2 di vertici q 1,…,q k e q k,…,q n P 1 quando k = 2 e P 2 quando k = n-1 sono poligoni degeneri, ossia sono un segmento.

Il numero T(n) di triangolazioni possibili di un poligono di n vertici si esprime ricorsivamente come segue E’ facile verificare che T(n) = P(n-1) dove P(n) sono le parentesizzazioni del prodotto di n matrici. Quindi T(n) cresce esponenzialmente.

Primo passo: struttura di una triangolazione ottima. Supponiamo che una triangolazione ottima suddivida il poligono convesso P di vertici q 1 q 2...q n nel triangolo T di vertici q 1 q k q n e nei due poligoni P 1 e P 2 di vertici q 1 …q k e q k …q n rispettivamente. Le triangolazioni subordinate di P 1 e di P 2 sono triangolazioni ottime. Perché?

Secondo passo: soluzione ricorsiva Se j = i+1 allora P i..j è degenere e c i,j = 0. I sottoproblemi sono le triangolazioni dei poligoni P i..j di vertici q i …q j. Sia c i,j la somma dei costi dei triangoli di una triangolazione ottima di P i..j. Se j > i+1 allora P i..j si può scomporre in un triangolo T di vertici q i q k q j e nei due poligoni P 1 e P 2 di vertici q i …q k e q k …q j con i < k < j

Triangulation-Cost(q, n) for i = 1 to n-1 c[i, i+1] = 0 for j = 3 to n for i = j-2 downto 1 c[i, j] =  for k = i+1 to j-1 q = c[i, k]+c[k, j]+c(q i q k q j ) if q < c[i, j] c[i, j] = q s[i, j] = k return c,s Terzo passo: calcolo costo minimo Complessità: O(n 3 )

Print-Triangulation(s, i, j) if j > i+1 k = s[i, j] Print-Triangulation(s, i, k) print “triangolo:”, i, j, k Print-Triangulation(s, k, j) Quarto passo: Stampa triangolazione Complessità: O(n)