La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte II)

Presentazioni simili


Presentazione sul tema: "Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte II)"— Transcript della presentazione:

1 Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte II)

2 Calcolo del valore di una soluzione ottima Il terzo passo consiste nel calcolare il valore della soluzione ottima (alla parentesizza- zione) in termini delle soluzioni ottime (alle parentesizzazioni) dei sottoproblemi.

3 Calcolo del valore di una soluzione ottima A partire dallequazione sotto, sarebbe facile definire un algoritmo ricorsivo che calcola il costo minimo m(1,n) di A 1…n Purtroppo vedremo che tale approccio porta ad un algoritmo di costo esponenziale, non migliore dellenumerazione esaustiva.

4 L R m(l,r) = 0 se l = r, m(l,r) = min l k

5 L R m(l,r) = 0 se l = r, m(l,r) = min l k

6 L R m(l,r) = 0 se l = r, m(l,r) = min l k

7 L R m(l,r) = 0 se l = r, m(l,r) = min l k

8 L R m(l,r) = 0 se l = r, m(l,r) = min l k

9 Limportante osservazione è che ci sono un numero limitato di sottoproblemi, uno per ogni scelta di l e r (con 1 l r n), quindi in totale Calcolo del valore di una soluzione ottima Sottoproblemi con l r corrispondenti alle celle riempite di una matrice n n. Utilizzando quindi una matrice m[n n] possiamo risolvere facilmente il problema in tempo polinomiale. Sottoproblemi con l = r

10 Utilizzando quindi una matrice m[n,n] possiamo risolvere facilmente il problema in tempo polinomiale. Ogni sottoproblema è risolvibile utilizzando solo le soluzioni di sottoproblemi ricorrenti più volte che possono essere calcolati prima e memorizzati nella matrice m[n,n]. In tal modo non si calcola mai più di una volta la soluzione ad un sottoproblema. Questa è lidea chiave della programmazione dinamica. Calcolo del valore di una soluzione ottima

11 Lalgoritmo MCO (Matrix-Chain-Order) prende in ingresso un array c[] contenente i le dimensioni delle matrici (c[0] è il numero di righe della prima matrice, c[i] è il numero di colonne della matrice A i utilizza (e ritorna) due matrici n n ausiliarie: m[l,r] che contiene i costi minimi dei sottoproblemi A l…r s[l,r] che contiene il valore di k che minimizza il costo per il sottoproblema Calcolo del valore di una soluzione ottima

12 MCO(c[]: array di intero) n = lunghezza[c] - 1 for i = 1 to n do m[i,i] = 0 for l = 2 to n do for i = 1 to n - l + 1 do j = i + l - 1 m[i,j] = for k = i to j - 1 do q = m[i,k] + m[k+1,j] + c[i-1]c[k]c[j] if q < m[i,j] then m[i,j] = q s[i,j] = k return m[] e s[] Il costo è zero nel caso di una sola matrice Calcola tutti i possibili valori e conserva solo il più piccolo l varia sulle diagonali sopra quella principale i e j assumono i valori delle celle nella diagonale l

13 L R L R m(1,4) = min 1 k 3 { m(1,k) + m(k+1,4) + c 0 c k c 4 } = min { m(1,1) + m(2,4) + c 0 c 1 c 4, m(1,2) + m(3,4) + c 0 c 2 c 4, m(1,3) + m(4,4) + c 0 c 3 c 4 } = min { * 8 * 3, * 4 * 3, * 2 * 3 } = min { 280, 332, 218 } = L R L R L R TempoO(n 3 ) cici i L R L R m[ ]

14 m(1,4) = min 1 k 3 { m(1,k) + m(k+1,4) + c 0 c k c 4 } = min { m(1,1) + m(2,4) + c 0 c 1 c 4, m(1,2) + m(3,4) + c 0 c 2 c 4, m(1,3) + m(4,4) + c 0 c 3 c 4 } = min { * 8 * 3, * 4 * 3, * 2 * 3 } = min { 280, 332, 218 } = cici i L R s[ ] L R

15 Calcolo del valore di una soluzione ottima Lalgoritmo MCO calcola i costi minimi riempiendo le matrici partendo dalla diagonale principale (tutti 0) e proseguendo in ordine con le diagonali successive alla principale. Ad ogni passo il valore di m[i,j] dipende solo dai valori, calcolati precedentemente, delle celle m[i,k] e m[k+1,j], che infatti stanno nelle diagonali sottostanti a quella di m[i,j] Il valore di ogni cella m[i,j] viene calcolato una sola volta durante la processazione della diagonale (indicata dallindice l) in cui compare.

16 Costruzione della soluzione ottima Il quarto passo consiste nel costruire il la soluzione ottima (al prodotto delle n matrici), cioè quello il cui costo ottimo è stato calcolato al terzo passo. Infatti terzo passo calcola il costo (e gli indici k ottimali) della soluzione ottima ma non ci calcola il prodotto corrispondente.

17 Costruzione della soluzione ottima Possiamo definire un algoritmo che costruisce la soluzione a partire dalla informazione calcolata da MCO. La matrice s[ ] ci permette di determinare il modo migliore di moltiplicare le matrici. s[i,j] contiene infatti il valore di k su cui dobbiamo spezzare il prodotto A i…j... … ci dice cioè che per calcolare A i…j dobbiamo prima calcolare A i…k e A k+1…j e poi moltiplicarle tra loro. Ma questo è un processo facilmente realizzabile tra- mite un algoritmo ricorsivo

18 Costruzione della soluzione ottima MCM(A[]:array ; s[]: matrici; i,j: intero) if j > i then k = s[i,j] X = MCM(A,s,i,k) Y = MCM(A,s,k + 1,j) return Prod-Matrici(X,Y) else return A[i] A[] un array di lunghezza n che contiene le matrici [A 1, A 2,…, A n ] s[] la matrice n n che contiene il valore di k ottimo per ogni coppia di indici (l,r)

19 Costruzione della soluzione ottima L R A 1…6 = A 1…k A k+1…6 = A 1…3 A 4…6 A 1…3 = A 1…k A k+1…3 =A 1 A 2…3 A 4…6 = A 4…k A k+1…6 =A 4..5 A 6 A 2…3 = A 2…k A k+1…3 = A 2 A 3 A 4…5 = A 4…k A k+1…5 =A 4 A 5 A 1…6 = ( ( A 1 (A 2 A 3 ) ) ( (A 4 A 5 ) A 6 ) ) s[ ]

20 Versione ricorsiva di MCO R-MCO(c[]: array di intero; i,j:intero) if i = j then return 0 else m[i,j] = for k = i to j-1 do Costo = R-MCO(c,i,k) + R-MCO(c,k+1,j) + + c[i-1]c[k]c[j] if Costo < m[i,j] then m[i,j] = Costo return m[i,j]

21 Versione ricorsiva di MCO Definiamo lequazione di ricorrenza per m[1,n] dellalgoritmo ricorsivo appena visto: assumendo che i due if abbiano costo almeno unitario (comunque costante).

22 Versione ricorsiva di MCO Definiamo lequazione di ricorrenza per m[1,n] dellalgoritmo ricorsivo appena visto:

23 Versione ricorsiva di MCO Dimostriamo per sostituzione che lequazoine di ri- correnza ha soluzione esponenziale (2 n ) [T(n) 2 n-1 ] : Caso Base: T(1) 1 = 2 0 = Caso Induttivo:

24 Versione ricorsiva di MCO Caso Base: T(1) 1 = 2 0 Caso Induttivo: per n 2 Dimostriamo per sostituzione che lequazoine di ri- correnza ha soluzione esponenziale (2 n ) [T(n) 2 n-1 ] :

25 Versione ricorsiva di MCO Quindi il tempo di esecuzione di R-MCO è almeno esponenziale nel numero di matrici da moltiplicare, cioè: Cerchiamo di capire da dove deriva questa ineficienza dellalgoritmo ricorsivo.

26 Versione ricorsiva di MCO 1…4 1…1 2…4 1…2 3…4 1…3 4…4 1…1 2…2 3…4 2…3 4…4 3…3 4…4 1…1 2…3 1…2 3…3 4…42…23…32…23…3 1…12…2

27 Ricorsione e Programmazione Dinamica Ancora una volta, linefficienza della versione ricorsiva deriva dal fatto che i sottoproblemi non danno luogo a computazioni indipendenti. cioè, molti sottoproblemi ricorrono più volte e devono quindi essere risolti ogni volta. Questo fenomeno viene anche indicato con: sovrapposizione dei sottoproblemi.

28 Programmazione Dinamica La Programmazione Dinamica evita di ripetere la computazione per i sottoproblemi che si ripetono. col supporto di memoria aggiuntiva (tabella) risolve i sottoproblemi al più una sola volta. La sovrapposizione di sottoproblemi è uno degli indicatori che la Programmazione Dinamica potrebbe fornire una soluzione efficiente.

29 Programmazione Dinamica Prima di tentare di definire lalgoritmo, si deve però dimostrare la proprietà per il problema dato. Una tecnica standard per dimostrare la proprietà si assume che esista una soluzione migliore per un sottoproblema arbitraro e si dimostra che da tale assunzione segue una contrad- dizione con lipotesi di ottimalità La sovrapposizione di sottoproblemi è uno degli indicatori che la Programmazione Dinamica potrebbe fornire una soluzione efficiente.

30 Programmazione Dinamica La Programmazione Dinamica sfurtta la proprietà della struttura della soluzione ottima. Affinché la Programmazione Dinamica sia appli- cabile, è necessario che la soluzione ottima del problema esibisca la proprietà della sottostruttura ottima La sottostruttura ottima è il secondo indicatore che la Programmazione Dinamica potrebbe fornire una soluzione efficiente.

31 Ricorsione con memorizzazione É una variante della Programmazione Dinamica. Lidea è quella di fondere la memorizzazione in tabella tipico della Progr. Dinamica con lapproc- cio ricorsivo tipico del Divede-et-Impera. Quando un sottoproblema viene risolto per la prima volta, viene memorizzto in una tabella: ogni volta che si deve risolvere un sotto- problema, si controlla nella tabella se è già stato risolto precedentemente se lo è già stato, si usa il risultato della tabella altrimenti lo si calcola e si memorizza il risultato

32 Ricorsione con memorizzazione Quando un sottoproblema viene risolto per la prima volta, viene memorizzto in una tabella: ogni volta che si deve risolvere un sotto- problema, si controlla nella tabella se è già stato risolto precedentemente se lo è già stato, si usa il risultato della tabella altrimenti lo si calcola e si memorizza il risultato In tal modo, ogni sottoproblema viene calcolato una sola volta e memorizzato come nel caso precedente. Dal momento che abbiamo solo (n 2 ) sottopro- blemi, il tempo di esecuzione sarà identico.

33 Versione ricorsiva con memorizzazione Mem-MCO(c[]: array di intero) n = lunghezza[c] - 1 for i = 1 to n do for j = i to n do m[i,j] = return Cerca-MC(c,1,n) Cerca-MC(c[]: array of intero; i,j:intero) if m[i,j] < then return m[i,j] if i = j then m[i,j] = 0 else for k = i to j-1 do Costo = Cerca-MC(c,i,k) + Cerca-MC(c,k+1,j) + c[i-1]c[k]c[j] if Costo < m[i,j] then m[i,j] = Costo return m[i,j]

34 Confronto tra i due approcci Iterativo Bottom-up : quando tutti i sottoproblemi devono essere risolti almeno una volta, è più efficiente, non avendo il problema di gestire le chiamate ricorsive. in alcuni casi, la regolarità degli accessi alla tabella può essere sfruttata per ridurre ulteriormente tempo e/o spazio (come per Numeri di Fibonacci) Ricrsione con memorizzazione: quando alcuni sottoproblemi possono non essere risolti affatto, può essere vantaggiosa, perché risolve solo i sottoproblemi richiesti per ottenere la soluzione finale.

35 Confronto con Divide-et-Impera La soluzione dei problemi è costruita a partire dalle soluzione dei sottoproblemi. Divide-et-Impera : Merge Sort Ogni suddivisione del problema in sottoproglemi porta alla stessa soluzione I sottoproblemi sono disgiunti Il calcolo avviene in maniera top-down

36 Confronto con Divide-et-Impera Programmazione Dinamica : Moltiplicazioni tra Matrici Differenti suddivisioni del problema portano a differenti soluzioni. La maggior parte di queste non porta ad una soluzione ottima. I sottoproblemi si sovrappongono (non sono indipende- nti) Il calcolo avviene in maniera bottom-up La soluzione dei problemi è costruita a partire dalle soluzione dei sottoproblemi. Divide-et-Impera : Merge Sort Ogni suddivisione del problema in sottoproglemi porta alla stessa soluzione I sottoproblemi sono disgiunti Il calcolo avviene in maniera top-down

37 Sottosequenza Una sequenza S=(a 1,…,a m ) è una sotto- sequenza della sequenza S se S è ottenuta da S rimuovendo uno o più elementi. Gli elementi rimanenti devono comparire nello sesso ordine nella sequenza risultante, anche se non devono essere necessariamente conti- gui in S. Esempio S = AAAATTGA S = AAATA

38 Sottosequenza Una sequenza S=(a 1,…,a m ) è una sotto- sequenza della sequenza S se S è ottenuta da S rimuovendo uno o più elementi. Gli elementi rimanenti devono comparire nello sesso ordine nella sequenza risultante, anche se non devono essere necessariamente conti- gui in S. La sequenza nulla (di lunghezza 0) è una sottosequenza di ogni sequenza. Una sequenza è una lista di elementi ma…. … una sottosequenza non è necessariamente una sottolista (poiché deve essere contigua).

39 Sottosequenza più lunga comune Definizione: Date due sequenze S 1 =(a 1,…,a m ) e S 2 =(b 1,…,b n ), una sottosequenza comune Z di S 1 e S 2 è una sequenza che è sottosequenza di entrambe le sequenze S 1 e S 2. Definizione: Date due sequenze S 1 =(a 1,…,a m ) e S 2 =(b 1,…,b n ), la più lunga sottosequenza comune Z (LCS) di S 1 e S 2 è la sottosequenza comune di S 1 e S 2 che ha lungezza massima.

40 Sottosequenza più lunga comune Input 2 sequenze di simboli, S 1 e S 2 Output Trovare la più lunga sottosequenza comune (LCS) di S 1 e S 2 Esempio S 1 = AAAATTGA S 2 = TAACGATA LCS[S 1,S 2 ] = AAATA

41 Soluzione esaustiva LCS-Esaustivo(X[],Y[]: array di char) l = 0 l = 0 LCS = Nil /* Enumera tutte le sottosequenza di X */ for each sottosequenza K di X do if K è una sottosequenza di Y then ls = lunghezza[K] if ls > l then l = ls LCS = K return LCS Miglioramento possibile: Se lunghezza[Y] < lunghezza[X] enumera solo le sotto- sequenze di lunghezza minore o uguale a lunghezza[Y].

42 Soluzione esaustiva Ma data una sequenza di lunghezza n, quante sono le possibili sottosequenze? Ogni sottosequenza può avere lunghezza k con 0 k n. Cioè il numero di sottosequenze è pari al numero di possibili sottoinsiemi di elementi distinti di un insieme degli n elementi nella sequenza originaria Soluzione impraticabile!

43 Carattedizzazione della soluzione ottima Iniziamo col caratterrizzare la struttura della soluzione ottima. Data una sequenza X=(x 1,…,x n ), denoteremo con X i, li-esimo prefisso di X, cioè la sotto- sequenza (x 1,…,x i ). X 0 denota la sotto- sequenza nulla. Esempio: X = ABDCCAABD X 3 = ABD X 6 = ABDCCA

44 X[1,…,m-1] Y[1,…,n-1] Z[1,…,k-1] X X X X[1,…,m] Y[1,…,n] Z[1,…,k] Y X[1,…,m] Y[1,…,n] X ? Z[1,…,k] X[1,…,m-1] Y[1,…,n] Y ? Z[1,…,k] Y X[1,…,m] Y[1,…,n] X ? Z[1,…,k] X[1,…,m] Y[1,…,n-1] X ? Z[1,…,k] 2) x m y n e z k x m 3) x m y n e z k y m 1) x m = y n

45 Carattedizzazione della soluzione ottima Teorema: Date le due sequenze X=(x 1,…,x m ) e Y=(y 1,…,y n ), sia Z=(z 1,…,z k ) una LCS di X e Y. 1se x m = y n, allora z k = x n = y n e Z k-1 è una LCS di X m-1 e Y n-1. 2se x m y n e z k x m, allora Z k è una LCS di X m-1 e Y. 3se x m y n e z k y n, allora Z k è una LCS di X e Y n-1.

46 Carattedizzazione della soluzione ottima Teorema: Date le due sequenze X=(x 1,…,x m ) e Y=(y 1,…,y n ), sia Z=(z 1,…,z k ) una LCS di X e Y. 1se 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. 2se x m y n e z k x m, allora Z k è una LCS di X m-1 e Y. 3se x m y n e z k y n, allora Z k è una LCS di X e Y n-1. Dimostrazione: 1Suponiamo x m = y n ma z k x m. Poiché Z è una sottosequenza comune di X e Y di lunghezza k, Ma allora concatenando x m a Z otterremmo una sotto- sequenza comune di X e Y di lunghezza k+1. Questo però contraddice lassunzione che Z sia una LCS di X e Y. Quindi deve essere z k = x m = y n

47 Carattedizzazione della soluzione ottima Teorema: Date le due sequenze X=(x 1,…,x m ) e Y=(y 1,…,y n ), sia Z=(z 1,…,z k ) una LCS di X e Y. 1se 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. 2se x m y n e z k x m, allora Z k è una LCS di X m-1 e Y. 3se x m y n e z k y n, allora Z k è una LCS di X e Y n-1. Dimostrazione: Quindi deve essere z k = x m = y n Ma allora eliminando dalle 3 sequenze lultimo carattere, otteniamo che Z k-1 deve essere una sottosequenza comune di X m-1 e Y n-1 di lunghezza k-1 Ma Z k-1 è anche una LCS di X m-1 e Y n-1 ? (Per assurdo) Supponiamo che esista una sottosequenza comune W di X m-1 e Y n-1 di lunghezza maggiore di k-1. Allora concatenando z k a W otterremmo ancora una sotto- sequenza comune più lunga di Z, contraddicendo lipotesi.

48 Carattedizzazione della soluzione ottima Teorema: Date le due sequenze X=(x 1,…,x m ) e Y=(y 1,…,y n ), sia Z=(z 1,…,z k ) una LCS di X e Y. 1se 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. 2se x m y n e z k x m, allora Z k è una LCS di X m-1 e Y. 3se x m y n e z k y n, allora Z k è una LCS di X e Y n-1. Dimostrazione: 2Se x m y n e z k x m, allora Z k è una LCS di X m-1 e Y n Infatti, se esistesse una sottosequenza comune W di X m-1 e Y di lunghezza maggiore di k, allora (essendo x m y n e z k x m ) W sarebbe pure una sottosequenza comune di X m e Y. Ma questo contraddice lipotesi che Z sia una LCS di X e Y. 3Se x m y n e z k y m, allora Z k è una LCS di X e Y n-1 La dinostrazione è simmetrica a quella del punto 2


Scaricare ppt "Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte II)"

Presentazioni simili


Annunci Google