• Non ci sono risultati.

Il problema dello zaino Il problema dello zaino

N/A
N/A
Protected

Academic year: 2021

Condividi "Il problema dello zaino Il problema dello zaino"

Copied!
17
0
0

Testo completo

(1)

Il problema dello zaino Il problema dello zaino

(knapsack problem) (knapsack problem)

Damiano Macedonio mace@unive.it

(2)

Copyright © 2010—2012 Moreno Marzolla, Università di Bologna (http://www.moreno.marzolla.name/teaching/ASD2011B/)

This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/ or send a letter to Creative Commons, 543 Howard Street, 5th Floor, San Francisco, California, 94105, USA.

(3)

Algoritmi e Strutture Dati 3

Problema dello zaino 0-1

Supponiamo di avere un insieme X composto da n oggetti etichettati con gli interi da 1 a n: {1, 2, ..., n}

L'oggetto i-esimo ha peso p[i] e valore v[i]

Esiste una unica istanza di ciascun oggetto

Disponiamo un contenitore in grado di trasportare al massimo un peso pari a P

Vogliamo determinare un sottoinsieme Y⊆X di oggetti, tale che

Il peso complessivo degli oggetti in Y sia ≤ P

Il valore complessivo degli oggetti in Y sia il massimo possibile

(4)

Definizione formale

Vogliamo determinare un sottoinsieme Y⊆X di oggetti tale che:

e tale da massimizzare il valore complessivo:

x∈Y

p x≤P

x∈Y

v  x

(5)

Algoritmi e Strutture Dati 5

Approccio greedy #1

Ad ogni passo, scelgo tra gli oggetti non ancora nello zaino quello di valore massimo, tra tutti quelli che

hanno un peso minore o uguale alla capacità residua dello zaino

(6)

Esempio

20Kg

15€ / 10Kg 20€ / 8Kg

28€ / 20Kg

15€ / 10Kg 20€ / 8Kg

28€ / 20Kg

La soluzione calcolata in questo esempio non è la soluzione ottima!

Nota: questo algoritmo non fornisce sempre la soluzione ottima

(7)

Algoritmi e Strutture Dati 7

Approccio greedy #2

Ad ogni passo, scelgo tra gli oggetti non ancora nello zaino quello di valore specifico massimo, tra tutti quelli che hanno un peso minore o uguale alla capacità

residua dello zaino

Il valore specifico è definito come il valore di un oggetto diviso il suo peso

(8)

Esempio

20Kg 15€ / 10Kg

20€ / 8Kg

28€ / 20Kg

1.5

2.5

1.4 28€ / 20Kg 1.4

20€ / 8Kg 15€ / 10Kg

In questo esempio, l'algoritmo greedy #2 calcola la soluzione ottima, ma...

(9)

Algoritmi e Strutture Dati 9

Esempio

20Kg 15€ / 10Kg

20€ / 10Kg 33€ / 11Kg

1.5 2.0

3.0

15€ / 10Kg 20€ / 10Kg

1.5 2.0 33€ / 11Kg

...in questo altro esempio anche l'algoritmo greedy #2 non produce la soluzione ottima

9Kg

(10)

Soluzione ottima basata sulla Programmazione Dinamica

Questa soluzione funziona esclusivamente se i pesi sono numeri interi

Sia V[i, j] il massimo valore ottenibile da un

sottoinsieme degli oggetti {1, 2, ... i} in uno zaino che ha capacità massima j

i=1, 2, ...n

j=0, 1, ...P

(11)

Algoritmi e Strutture Dati 11

Soluzione ottima basata sulla Programmazione Dinamica

Sia V[i, j] il massimo valore ottenibile da un

sottoinsieme degli oggetti {1, 2, ..., i} in uno zaino che ha capacità massima j

V[i, 0] = 0 per ogni i=1..n

Se il peso massimo è zero, il valore è sempre zero

V[1, j] = v[1] se j ≥ p[1]

C'è abbastanza spazio per l'oggetto numero 1

V[1, j] = 0 se j < p[1]

Non c'è abbastanza spazio per l'oggetto numero 1

(12)

Soluzione ottima basata sulla Programmazione Dinamica

Per calcolare V[i, j] distinguiamo due casi

Se j<p[i] significa che l'i-esimo oggetto è troppo pesante per essere contenuto nello zaino. In tal caso V[i, j] = V[i-1, j]

Se j≥p[i] possiamo scegliere la migliore tra le seguenti possibilità

Inserire l'oggetto i-esimo nello zaino. Lo spazio residuo è j-p[i], il valore massimo ottenibile in questa ipotesi è V[i-1, j-p[i] ]+v[i]

Non inserire l'oggetto i-esimo nello zaino. Il valore massimo ottenibile in questa ipotesi è V[i-1, j]

Scegliendo la migliore delle possibilià, possiamo dire V[i, j] = max{ V[i-1, j], V[i-1, j-p[i] ]+v[i] }

(13)

Algoritmi e Strutture Dati 13

Soluzione ottima basata sulla Programmazione Dinamica

Riassumendo

V i , j =

{

V [i−1, j ] se j p [i]

max

{

V [i−1, j ] ,V [i−1, j− p[i]]v [i ]

}

se j≥ p [i]

j-p[i] Kg p[i] Kg

V[i-1, j-p[i] ] v[i]

(14)

Tabella di programmazione dinamica / matrice V

0.0 12.7

0.0

0.0 0.0 0.0

0.0

0.0 0.0

12.7 12.7 12.7

12.7 12.7 12.7 12.7

12.7 12.7 12.7 12.7

12.7 12.7 12.7 12.7

12.7 12.7 12.7 13.0

12.7 12.7

12.7 12.7

12.7 13.0

14.4 12.7

14.4

19.1

19.1 19.1 19.1 19.1 19.1 12.7

0 1 2 3 4 5 6 7 8 9 10

1 2 3 4

j

i

p =[ 2, 7, 6, 4 ] v = [ 12. 7, 6.4, 1.7, 0.3]

(15)

Algoritmi e Strutture Dati 15

Tabella di programmazione dinamica / matrice V

0.0 12.7

0.0

0.0 0.0 0.0

0.0

0.0 0.0

12.7 12.7 12.7

12.7 12.7 12.7 12.7

12.7 12.7 12.7 12.7

12.7 12.7 12.7 12.7

12.7 12.7 12.7 13.0

12.7 12.7

12.7 12.7

12.7 13.0

14.4 12.7

14.4

19.1

19.1 19.1 19.1 19.1 19.1 12.7

0 1 2 3 4 5 6 7 8 9 10

1 2 3 4

p =[ 2, 7, 6, 4 ] v = [ 12. 7, 6.4, 1.7, 0.3]

j

i

V 3,8=max { V 2,8 ,V 2, 8− p[3]v [3] }

= max { 12.7,14.4 }

(16)

Stampare la soluzione

Il massimo valore che è possibile inserire nello zaino rispettando il vincolo di peso massimo è contenuto nella cella V[n, P] della tabella di programmazione dinamica

Come facciamo a sapere quali oggetti fanno parte della soluzione ottima?

Usiamo una tabella ausiliaria booleana K[i, j] che ha le stesse dimensioni di V[i, j]

K[i, j] = true se e solo se l'oggetto i-esimo fa parte della soluzione ottima che ha valore complessivo V[i, j]

(17)

Algoritmi e Strutture Dati 17

Tabella di programmazione

dinamica / stampa soluzione ottima

d := P;

i := n;

while( i>0 ) do

if ( K[i,d] == true ) then

stampa “Seleziono oggetto “ i d := d-p[i];

endif

i := i-1;

endwhile

F

0 1 2 3 4 5 6 7 8 9 10

1 2 3 4

F T T T T T T

T T

T

T T

F F F F F F F F F

T F F

F F F F F F F F

F F

F

T T

F F F F F F

p =[ 2, 7, 6, 4 ] v = [ 12. 7, 6.4, 1.7, 0.3 ]

Riferimenti

Documenti correlati

Ma la novità assoluta dello zaino SUPER sono le fasce anteriori porta-skate, che fanno di questo zaino.. l’accessorio più ricercato dagli studenti di oggi, tecnologici

Entrambe le ditte offrono un prodotto che rispecchia le caratteristiche richieste dalla sede Inail di Livorno, la Frangi srl ha in catalogo lo zaino modello Kensington K60380WW

Trattasi di seminario che rientra tra quelli di formazione continua specialistica e obbligatoria, accreditati dall’Ordine Professionale Regionale degli Assistenti

ed uno zaino di capacità W (tutti gli input sono &gt;0), trovare il massimo valore di un sottoinsieme degli oggetti il cui peso totale è al massimo W, con la

Osserva il disegno con attenzione e coloralo con cura usando colori appropriati, così come.. potrebbero trovarsi

A questo punto l’algoritmo di taglio prescrive di aggiungere il taglio ai vincoli precedenti e risolvere il problema ottenuto in questo modo.. Quindi devo intro- durre un nuovo

messi nello zaino e la soluzione ottima del problema è proprio quella di mettere tutti gli oggetti nello

Per ognuna delle seguenti istanze del problema dello zaino, de- terminare una soluzione approssimata data dal FPTAS eseguito con t