 |
Si supponga di avere uno zaino (knapsack) di capacità C e n oggetti
ognuno dei quali ha un peso Pi e un’utilità Ui
(o valore). Il problema consiste nel riempire lo zaino,
rispettandone la capacità, con gli oggetti che danno la
maggiore utilità complessiva. |
Il problema dello zaino può essere formulato come modello
di programmazione lineare binaria booleana
max

Nella formulazione del problema si ipotizza, inoltre, che
alcuni oggetti abbiano un peso inferiore alla capacità dello zaino e che la
somma dei pesi di tutti gli oggetti sia superiore alla capienza stessa.
Il problema dello zaino può essere risolto mediante
tecniche euristiche o approssimate e tecniche esatte.
Algoritmo euristico:inserire nello zaino gli oggetti
in ordine di utilità specifica decrescente, ricercando cioè l’oggetto con
utilità specifica “max “ e inserirlo nello zaino, inserire nello spazio residuo
l’oggetto con utilità specifica immediatamente più piccola e ciò fino ad
esaurire la capacità.
La soluzione determinata non è, però, quella ottimale ma è
una approssimazione.
Esempio:
|
Oggetto |
A |
B |
C |
D |
|
Peso |
22 |
18 |
13 |
7 |
|
Valore |
43 |
32 |
26 |
12 |
|
Val/Peso |
1,955 |
1,777 |
2 |
1,714 |
|
capienza zaino 30 |
|
|
|
|
Riordinando gli oggetti in ordine decrescente del rapporto
(valore/peso) con il foglio elettronico Excel ,si
osserva che si può trasportare soltanto l'oggetto C. La soluzione ottimale secondo questo metodo è,quindi, approssimata.
Applicando, invece, il metodo
branch-and-bound
ordinano gli oggetti secondo
valori specifici decrescenti;
si crea un albero binario, dove man mano che si procede dalla radice alle
foglie vengono fissate alcune variabili( 1 significa prendere l'oggetto; 0
significa escludere l'oggetto);
si determina l'Upper bound ,selezionando gli oggetti con le variabili a 1
ed escludendo quelli con variabili a 0, e ipotizzando che gli oggetti siano
frazionabili, si determina l'elemento critico
L'Upper Bound si calcola:
essendo:
 |
= frazione dell' elemento critico
c = capacitá Knapsack
=
dimensioni degli elementi
=
valori degli elementi |
Il problema diventa:
Z=26 X1+43X2+32X3+12X4

i=1,2,3,4,,..
Siccome l’oggetto C ha il migliore
rapporto (peso/valore) si generano due sotto problemi: di portare l'oggetto C o
di non portarlo
Nodo 1
x1=1
z=26+43x2+32x3+12x4
22x2+18x3+7x4<=17
CBUB(1) = 26 + 43* (30-13)/22 ; arrotondando CBUB (1) = 59
Nodo 2
x1=0
z=43x2+32x3+12x4
22x2+18x3+7x4<=30
CBUB (0) arrotondando CBUB (0) = 57
E' più conveniente portare l'oggetto C
Si generano così altri due sottoproblemi: portare l'oggetto C e l'oggetto A
oppure portare l'oggetto C e non portare l'oggetto A.
Nodo3 (figlio nodo 1)
x1=1; x2=1
z =32x3+12x4+69
18x3+7x4<=-5
non ha soluzioni
Nodo4(figlio nodo 1)
x1=1; x2=0
z=26+32x3+12x4
18x3+7x4<=17
; arrotondando CBUB = 56
Siccome è più conveniente non portare l'oggetto C, si generano due
sottoproblemi corrispondenti a non portare l'oggetto C e portare l'oggetto A
oppure a non portare i due oggetti C e A.
Nodo5(figlio nodo 2)
x1=0 x2=1
z= 32x3+12x4+43
18x3+7x4<= 8
CBUB (01) arrotondando CBUB (01) = 57
Nodo6(figlio nodo 2)
x1 =
0 x2 = 0
z = 32x3 + 12x4
18x3 + 7x4 <= 30 CBUB(00) = 32 + 12 =
44
Essendo più conveniente non portare l'oggetto C e portare l'oggetto A, si
generano due sotto problemi corrispondenti a non portare l'oggetto C e portare
gli oggetti A e B oppure non portare gli oggetti C e B e portare l'oggetto A.
Nodo7(figlio nodo 5)
x1 = 0
x2 = 1 x3
= 1
z = 12x4 + 75
7x4 <= -10 non ha soluzioni ;
Nodo8(figlio nodo 5)
x1 = 0
x2 = 1 x3
= 1
z = 12x4 + 43
7x4 <= 8 ; CBUB (010) = 43 + 12 = 55
Essendo più conveniente portare l'oggetto C e non portare l'oggetto A si
generano due sotto problemi corrispondenti a portare gli oggetti C e B e non
portare l'oggetto A oppure portare l'oggetto C e non portare gli oggetti A e B.
Nodo9(figlio nodo 4)
x1 = 1
x2 = 0 x3
= 1
z = 12x4 + 58
7x4 <= -1 non ha soluzioni;
Nodo10(figlio nodo 4)
x1 = 1
x2 = 0 x3 = 0
z = 12x4 + 26
7x4 <= 17 ; CBUB(100)= 26 + 12 = 38
Soluzione ottimale è quella di portare gli oggetti A e D con valore
complessivo 55 e peso 29 ossia la soluzione corrispondente a (010) avendo
il valore migliore tra quelli correnti.
Albero decisionale

Il problema dello zaino può essere risolto mediante il metodo branch and
bound riempendo i campi dell'Applet seguente , cliccando sul tasto Inizia
e poi sul tasto Risolvi,apparirà l'albero decisionale e la soluzione ottimale
del problema.

IL problema knapsack trova applicazione nei progetti di investimento
finanziario.
|