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

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

Transcript of Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Page 1: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Algoritmi e Strutture Dati (Mod. B)

Programmazione Dinamica

(Parte I)

Page 2: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Numeri di Fibonacci

Definizione ricorsiva (o induttiva)• F(1) = F(0) = 1• F(n) = F(n-1) + F(n-2)

Fib(n: intero) if n = 0 or n = 1 then return 1 else return Fib(n-1) + Fib(n-2)

Algoritmo ricorsivo

Page 3: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

F(5)

F(4) F(3)

F(1) F(0)

F(3) F(2) F(2) F(1)

F(2) F(1) F(1) F(0) F(1) F(0)

Tempo di esecuzione è O(2n)

Tempo di esecuzione dell’algoritmo

2)2()1(

1,0)1()(

nnTnT

nOnT

se

se

Page 4: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Algoritmo II

Fib(n:intero) f[0] = 1 f[1] = 1for i=2 to n

f[i] = f[i-1] + f[i-2] return f[n]

21

7

13

6

8

5

53211f [ ]

43210n

La complessità in tempo è O(n).

Un array f [] di dimensione n.

La complessità in spazio è O(n).

Page 5: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Algoritmo II

21

7

13

6

8

5

53211f [ ]

43210n

La complessità in tempo è O(n).

Un array f [] di dimensione n.

La complessità in spazio è O(n).

Fib(n:intero) f[0] = 1 f[1] = 1for i=2 to n

f[i] = f[i-1] + f[i-2] return f[n]

Page 6: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Algoritmo II

21

7

13

6

8

5

53211f [ ]

43210n

La complessità in tempo è O(n).

Un array f [] di dimensione n.

La complessità in spazio è O(n).

Fib(n:intero) f[0] = 1 f[1] = 1for i=2 to n

f[i] = f[i-1] + f[i-2] return f[n]

Page 7: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Algoritmo II

Fib(n:intero) f[1] = f[2] = 1for i=2 to n

f[0] = f[1] f[1] = f[2] f[2] = f[0] + f[1] return f[2]

La complessità in tempo è O(n).

21

7

13

6

8

5

53211f [2]

43210n

f [1]

f [0]

138532111

853211--

La complessità in spazio è O(1).

Un array f [] di dimensione 2.

Page 8: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Programmazione Dinamica

• Strategia sviluppata intorno agli anno ‘50 nel campo dei problemi di ottimizzazione

• Applicazione nei casi in cui:• ci sia più di una soluzione al problema• alle soluzioni è associabile un indice di “bontà” (ad

esempio: costo, preferenza, etc.)• si vuole determinare la soluzione con indice ottimo

(la soluzione ottima del problema, rispetto all’indice di “bontà”)

Page 9: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Programmazione Dinamica

Caratterizzare la struttura di una soluzione ottimaDefinire ricorsivamente il valore di una soluzione otti-

ma• La soluzione ottima ad un problema contiene le soluzioni

ottime ai sottoproblemi

Calcolare il valore di una soluzione ottima “bottom-up” (cioè calcolando prima le soluzioni ai casi più semplici)• Si usa una tabella per memorizzare le soluzioni dei

sottoproblemi

• Evitare di ripetere il lavoro più volte: non ricalcolare le soluzioni di sottoproblemi già calcolate.

Cotruire la (una) soluzione ottima.

Page 10: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Catena di moltiplcazione tra matrici

Problema: Data una sequenza di matrici compat-ibili 2 a 2 al prodotto A1, A2, A3, …, An, vogliamo calcolare il loro prodotto.

La moltiplicazione di matrici si basa sulla molti-plicazione scalare come operazione elementare.

Vogliamo calcolare il prodotto impiegando il numero minore possibile di moltiplicazioni

Il prodotto di matrici non è commutativo...

...ma è associativo [ (A1 A2) A3 = A1 (A2 A3) ]

Page 11: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Moltiplicazione tra matrici

A: r c B: p q (ma deve valere che c = p )

A B: r q : richiede r c q (r p q) moltiplicazioni scalari

c

kjkBkiAjiP

1],[],[],[

73 35A: B:

=75P:

Page 12: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Moltiplicazione tra 2 matriciProd-Matrici(A[r,c],B[p,q],P[r,q]: matrice) if c p then ERRORE “dimensioni non compatibili” return else for i = 1 to r do for j = 1 to q do sum = 0 for k = 1 to c do sum = sum + A[i,k] B[k,j] P[i,j] = sum

Tempo di esecuzione = (r c q)

c

kjkBkiAjiP

1],[],[],[

(n3)

Page 13: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Catena di moltiplcazione tra matrici

• 3 matrici: A B C

• Dimensioni: 1001 , 1100 , 1001

• (( A B ) C ) Num Moltiplicazioni Memoria

(A B ) 1001100 = 10000 10000 ((A B ) C ) 1001001 = 10000 100 ------------------------ ------- 20000 10100

• (A ( B C ))

(B C ) 11001 = 100 1(A (B C )) 10011 = 100 100 ------------------- ------- 200 101

Page 14: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Catena di moltiplcazione tra matrici

• 4 matrici: A B C D

• Dimensioni: 5010, 1040, 4030, 305

• ((( A B ) C ) D ) : 87500 moltiplicazioni

( A B ) 501040 = 20000(( A B ) C ) 504030 = 60000(( A B ) C ) D 5030 5 = 7500 ----------------------- 87500

Page 15: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Catena di moltiplcazione tra matrici

• ((( A B ) C ) D ) : 87500 moltiplicazioni

• (( A ( B C )) D ) : 34500 moltiplicazioni

• (( A B )( C D )) : 36000 moltiplicazioni

• ( A (( B C ) D )) : 16000 moltiplicazioni

• ( A ( B ( C D ))) : 10500 moltiplicazioni

• 4 matrici: A B C D

• Dimensioni: 5010, 1040, 4030, 305

Page 16: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Criterio di scelta

Determinare il numero di moltiplicazioni scalari necessari per i prodotti tra le matrici in ogni parentesizzazione

Scegliere la parentesizzazione che richiede il numero minimo di moltiplicazioni (criterio di otti-malità)

• Ma quante sono le parentesizzazioni possibili?per n = 3 sono 2

per n = 4 sono 5

per n > 4 quante sono?

Page 17: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Definizione di parentesizzazione

Definizione: Un prodotto di matrici A1A2A3…An si dice completamente parentesizzato se:consiste di una unica matrice (n = 1) oppureper qualche 1 k n, è il prodotto, delimitato da

pare-ntesi, tra i prodotti completamente parentesizzati

A1A2A3…Ak e Ak+1A2A3…An

A B C DA B

C

A B C

D

((A B) C ) (((A B ) C ) D)(A B)

Page 18: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Definizione di parentesizzazione

Definizione: Un prodotto di matrici A1A2A3…An si dice completamente parentesizzato se:consiste di una unica matrice (n = 1) oppureper qualche 1 k n, è il prodotto, delimitato da

pare-ntesi, tra i prodotti completamente parentesizzati

A1A2A3…Ak e Ak+1A2A3…An

A B C DC D

B

B C D

A

(B (C D)) (A (B (C D) ) )(C D)

Page 19: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Definizione di parentesizzazioneDefinizione: Un prodotto di matrici A1A2A3…An si

dice completamente parentesizzato se:consiste di una unica matrice (n = 1) oppureper qualche 1 k n, è il prodotto, delimitato da pare-ntesi, tra i

prodotti completamente parentesizzati

A1A2A3…Ak e Ak+1A2A3…An

A B C D

((A B ) (C D) )(C D)

C D

A B

(A B)

Page 20: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Quanti modi ci sono di parentesizzare?

• A1, A2, A3, …, An

• Sia P(n) il numero di modi di calcolare il pro-dotto di n matrici.

• Supponiamo che l’ultima moltiplicazione sia

• (A1, A2, …, Ak ) (Ak+1, …, An) 1 k n-1

per ogni scelta di parentesizzazione di (A1,A2,…,Ak ) ci sono P(n-k) possibili parentesizzazioni dell’altra porzione (Ak+1,…,An) e

per ogni scelta di parentesizzazione di (Ak+1,…,An) ci sono P(k) possibili parentesizzazioni dell’altra porzione (A1,A2 ,…, Ak).

Page 21: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Quanti modi ci sono di parentesizzare?

• Allora ci sono P(k) P(n-k) modi per un k fissato

• P(n) = 1kn-1 P(k) P(n-k) P(1) = 1

4862143042913242145211P(n)

10987654321n

• A1, A2, A3, …, An

• Sia P(n) il numero di modi di calcolare il pro-dotto di n matrici.

• Supponiamo che l’ultima moltiplicazione sia

• (A1, A2, …, Ak ) (Ak+1, …, An) 1 k n-1

Page 22: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Quanti modi ci sono di parentesizzare?

• Allora ci sono P(k) P(n-k) modi per un k fissato

4862143042913242145211P(n)

10987654321n

altrimenti

se1

1)()(

11)( n

kknPkP

nnP

Questa è una equazione di ricorrenza

Page 23: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Quanti modi ci sono di parentesizzare?

• Allora ci sono P(k) P(n-k) modi per un k fissato

altrimenti

se1

1)()(

11)( n

kknPkP

nnP

Questa è una equazione di ricorrenza...

… la cui soluzione è la sequenza dei numeri catalani

)1()( nCnP

23

42

1

1)(

nn

n

nnC

n

Page 24: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Quanti modi ci sono di parentesizzare?

altrimenti

se1

1)()(

11)( n

kknPkP

nnP

Questa è una equazione di ricorrenza...

… la cui soluzione è la sequenza dei numeri catalani

)1()( nCnP

23

42

1

1)(

nn

n

nnC

n

Quindi: enumerare tutte le possibilità, calcolare il nu-mero di moltiplicazioni e scegliere la parentesizza-zione a costo minore non è praticabile (perché il numero di possibilità è esponenziale)!

Page 25: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Soluzione con programmazione dinamica

Caratterizzare la struttura di una soluzione ottima

Definire ricorsivamente il valore di una soluzione ottima

Calcolare il valore di una soluzione ottima “bottom-up” (dal basso verso l’alto)

Cotruzione di una soluzione ottima.

Vediamo ora una ad una le 4 fasi del processo di sviluppo

Page 26: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Notazione

Denoteremo nel seguito con:

c0 : numero di righe della matrice A1

ci-1 : numero di righe della prima matrice Ai

ci : numero di colonne della matrice Ai

A1…n : sia una parentesizzazione che il risultato del prodotto A1A2…An

Al…r : sia una parentesizzazione che il risultato del prodotto Al…Ar

Page 27: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Caratterizzare della soluzione ottima

• Una soluzione al problema della prentesizzazione ottima di n matrici divide il problema nei due sottoproblemi: • quello del prodotto delle prime k matrici A1…k e

• quello delle rimanenti n-k Ak+1…n(per qualche k).

• La soluzione finale (A1…n) è il risultato del prodotto delle due matrici A1…k e Ak+1…n.

• Il costo del prodotto A1…n è la somma del costo del prodotto di A1…k più il costo di Ak+1…n, più il costo del prodotto finale tra le due matrici risultanti, cioè c0ckcn.

Page 28: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Caratterizzare della soluzione ottima

• La soluzione finale (A1…n) è il risultato del prodotto delle due matrici A1…k e Ak+1…n.

• Il costo del prodotto A1…n è la somma del costo del prodotto di A1…k più il costo di Ak+1…n, più il costo del prodotto finale tra le due matrici risultanti, cioè c0ckcn.

Ma come devono essere fatte le soluzioni ai due sottoproblemi A1…k e Ak+1…n per garantire che la soluzione complessiva (A1…n = A1…k Ak+1…n) sia anch’essa ottima?

Page 29: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Caratterizzare della soluzione ottima

• Quello che ci serve che valga è che la struttura delle soluzioni ai sottoproblemi sia analoga a quella del problema complessivo.

• Cioè che soluzioni ottime ai sottoproblemi permettano di costruire la soluzione ottima al problema complessivo.

Teorema: Se A1…n = A1…k Ak+1…n è una parentesizzazione ottima del prodotto A1A2…An, allora A1…k e Ak+1…n

sono parentesizzazioni ottime dei prodotti A1…Ak e

Ak+1…An, rispettivamente.

Page 30: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Caratterizzare della soluzione ottima

Dimostrazione: Supponiamo che A1…n = A1…k Ak+1…n sia una parentesizzazione ottima di A1A2…An ma che almeno uno tra A1…k e Ak+1…n non sia una parentesizzazione ottima del rispettivo prodotto.

Il costo c[A1…n] = c[A1…k] + c[Ak+1…n] + c0ckcn

Supponiamo che esista una parentesizzazione migliore A’1…k delle prime k matrici (cioè c[A’1…k] < c[A1…k]).

Allora basterebbe sostiture A’1…k al posto A1…k per ottene-re anche una parentesizzazione migliore per A1…n .

Teorema: Se A1…n = A1…k Ak+1…n è una parentesizzazione ottima del prodotto A1A2…An, allora A1…k e Ak+1…n

sono parentesizzazioni ottime dei prodotti A1…Ak e

Ak+1…An, rispettivamente.

Page 31: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Caratterizzare della soluzione ottima

Questo teorema fornisce la caratterizzazione della struttura della soluzione ottima.

Ci dice che ogni soluzione ottima al problema della parentesizzazione contiene al suo interno le soluzioni ottime dei due sottoproblemi.

L’esistenza di sottostrutture ottime nella soluzione ottima di un problema è una delle caratteristiche che vanno ricercate per decidere se la tecnica di Programmazione Dinamica è applicabile.

Teorema: Se A1…n = A1…k Ak+1…n è una parentesizzazione ottima del prodotto A1A2…An, allora A1…k e Ak+1…n

sono parentesizzazioni ottime dei prodotti A1…Ak e

Ak+1…An, rispettivamente.

Page 32: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Definizione del valore di una soluzione ottima

Il secondo passo consiste nel definire ricorsi-vamente il valore della soluzione ottima (alla parentesizzazione) in termini delle soluzioni ottime (alle parentesizzazioni) dei sottopro-blemi.

Page 33: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Notazione

• Sia m(l,r) il numero ottimo di moltiplicazioni necessario calcolare il prodotto

Al …r dove 1 l r n

• Definiamo m(1,n) ricorsivamente cone segue:• Caso Base:

m(l,r) = 0 se l = r

Page 34: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Definizione del valore di una soluzione ottima

• Definiamo m(1,n) ricorsivamente cone segue:• Caso Base:

m(l,r) = 0 se l = r• Caso Induttivo

Supponiamo che l’ultima moltiplicazione sia

Al…k Ak+1…l dove l k r-1

m(l,r) = m(l,k) + m(k+1,r) + cl-1 ck cr

Page 35: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Definizione del valore di una soluzione ottima

• Caso Base: m(l,r) = 0 se l = r

• Caso InduttivoAl…k Ak+1…l dove l k r-1

m(l,r) = m(l,k) + m(k+1,r) + cl-1 ck cr

• Ma per risolvere il nostro problema ci interessa sapere per quale valore di k si ottiene il valore minimo per m(l,r)

Page 36: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Definizione del valore di una soluzione ottima

• Caso Base: m(l,r) = 0 se l = r

• Caso InduttivoAl…k Ak+1…l dove l k r-1

m(l,r) = m(l,k) + m(k+1,r) + cl-1 ck cr

Ma non conosciamo il valore di k...… quindi dobbiamo tentarli tutti!

}),1(),({min),( 1 rklrkl

cccrkmklmrlm

Page 37: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

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.

Page 38: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

Calcolo del valore di una soluzione ottima

A partire dall’equazione sotto, sarebbe facile definire un algoritmo ricorsivo che calcola il costo minimo m(1,n) di A1…n

Purtroppo vedremo che tale approccio porta ad un algoritmo di costo esponenziale, non migliore dell’enumerazione esaustiva.

rlcccrkmklm

rlrlm

rklrkl

se

se

}),1(),({min

0),(

1

Page 39: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

6

5

4

3

2

1

654321L R

-----6

----5

---4

--3

-2

1

654321L R

m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti

06

05

04

03

02

01

654321L R

m(1,2) = min1 k < 2{ m(1,k) + m(k+1,2) + c1ckc2 }= m(1,1) + m(2,2) + c0c1c2

Page 40: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

6

5

4

3

2

1

654321L R

-----6

----5

---4

--3

-2

1

654321L R

m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti

06

05

04

03

02

01

654321L R

m(2,4) = min2k<4{ m(2,k) + m(k+1,4) + c1ckc4 }= min { m(2,2) + m(3,4) + c1c2c4 ,

m(2,3) + m(4,4) + c1c3c4 }

Page 41: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

6

5

4

3

2

1

654321L R

-----6

----5

---4

--3

-2

1

654321L R

m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti

06

05

04

03

02

01

654321L R

m(2,5) = min2k<5{ m(2,k) + m(k+1,5) + c1ckc5 }= min { m(2,2) + m(3,5) + c1c2c5 ,

m(2,3) + m(4,5) + c1c3c5 , m(2,4) + m(5,5) + c1c4c5 }

Page 42: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

6

5

4

3

2

1

654321L R

-----6

----5

---4

--3

-2

1

654321L R

m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti

06

05

04

03

02

01

654321L R

m(1,5) = min1k<5{ m(1,k) + m(k+1,5) + c0ckc5 }= min { m(1,1) + m(2,5) + c0c1c5 ,

m(1,2) + m(3,5) + c0c2c5 , m(1,3) + m(4,5) + c0c3c5 , m(1,4) + m(5,5) + c0c4c5 }

Page 43: Algoritmi e Strutture Dati (Mod. B) Programmazione Dinamica (Parte I)

6

5

4

3

2

1

654321L R

-----6

----5

---4

--3

-2

1

654321L R

m(l,r) = 0 se l = r, m(l,r) = minlk<r{ m(l,k) + m(k+1,r) + cl-1ckcr } altrimenti

06

05

04

03

02

01

654321L R

m(1,6) = min1k<6{ m(1,k) + m(k+1,6) + c0ckc6 }= min { m(1,1) + m(2,6) + c0c1c6 ,

m(1,2) + m(3,6) + c0c2c6 , m(1,3) + m(4,6) + c0c3c6 , m(1,4) + m(5,6) + c0c4c6 , m(1,5) + m(6,6) + c0c5c6 }