p. 1/1 Branch-and-bound per KNAPSACK Rispetto allo schema generale visto in precedenza dobbiamo specificare: come si calcola un upper bound su un sottinsieme; come si effettua il branching; come si individuano soluzioni ammissibili con cui, eventualmente, aggiornare il valore del lower bound LB.
p. 2/1 Upper bound U(S) Cominciamo con il calcolare l upper bound U(S) su tutta la regione ammissibile S. L upper bound si calcola utilizzando il rilassamento lineare del problema originale: max n i=1 v ix i n i=1 p ix i b 0 x i 1 i {1,...,n} Questo è un problema di PL, ma è di forma molto semplice e non abbiamo bisogno di scomodare l algoritmo del simplesso per risolverlo.
p. 3/1 Risoluzione del rilassamento lineare Riordinare, eventualmente, gli oggetti in modo non crescente rispetto ai rapporti valore/peso v i p i, cioè si abbia che: v 1 v 2 v n. p 1 p 2 p n
p. 4/1 Si calcolino i valori b p 1 b p 1 p 2 fino ad arrivare al primo valore negativo. b r+1 se vi si arriva (se non vi si arriva vuol dire semplicemente che tutti gli oggetti possono essere messi nello zaino e la soluzione ottima del problema è proprio quella di mettere tutti gli oggetti nello zaino). j=1 p j
p. 5/1 Soluzione rilassamento lineare La soluzione ottima del rilassamento lineare è la seguente ed ha il valore ottimo x 1 = x 2 = = x r = 1 x r+1 = b r j=1 p j p r+1 x r+2 = x r+3 = = x n = 0 r j=1 v j + v r+1 b r j=1 p j p r+1.
p. 6/1 Soluzione ammissibile Notiamo anche che la soluzione x 1 = x 2 = = x r = 1 x r+1 = x r+2 = x r+3 = = x n = 0 ottenuta approssimando per difetto il valore dell unica variabile (la x r+1 ) che può avere coordinate non intere nella soluzione del rilassamento lineare, è appartenente a S (il peso dei primi r oggetti non supera la capacità dello zaino). Quindi tale soluzione può essere utilizzata per il calcolo del lower bound LB.
p. 7/1 Sottinsiemi di S di forma particolare Consideriamo sottinsiemi di S con questa forma: S(I 0,I 1 ) = {N S : l oggetto i N i I 0, l oggetto i N i I 1 } dove I 0,I 1 {1,...,n} e I 0 I 1 =. In altre parole S(I 0,I 1 ) contiene tutti gli elementi di S che non contengono gli oggetti in I 0 e contengono gli oggetti in I 1. Possono invece indifferentemente contenere o non contenere gli oggetti nell insieme con i 1 < < i k. I f = {i 1,...,i k } = {1,...,n} \ (I 0 I 1 ),
p. 8/1 Nota bene Si ha che S = S(, ), cioè la regione ammissibile del problema può essere vista come caso particolare di sottinsieme di forma S(I 0,I 1 ) con I 0 = I 1 =.
p. 9/1 Upper bound per tali sottinsiemi Il nostro originario problema KN AP SACK ristretto al sottinsieme S(I 0,I 1 ) si presenta nella seguente forma: max i I 0 v i x i + i I 1 v i x i + i I f v i x i i I 0 p i x i + i I 1 p i x i + i I f p i x i b x i {0, 1} i I f da cui: max i I 1 v i + i I f v i x i i I f p i x i b i I 1 p i x i {0, 1} i I f
p. 10/1 Continua Possiamo notare che si tratta ancora di un problema di tipo KNAPSACK dove è presente una quantità costante nell obiettivo ( i I 1 v i ), dove lo zaino ha ora capacità b i I 1 p i e dove l insieme di oggetti in esame è ora ristretto ai soli oggetti in I f. Trattandosi ancora di un problema dello zaino, possiamo applicare ad esso la stessa procedura che abbiamo adottato per trovare l upper bound U(S), ovvero si risolve il rilassamento lineare. Tale procedura darà in output oltre all upper bound U(S(I 0,I 1 )), anche una soluzione appartenente a S(I 0,I 1 ) (e quindi a S) utilizzabile per il calcolo del lower bound LB.
p. 11/1 Procedura di calcolo Passo 1 Se b i I 1 p i < 0, il nodo non contiene soluzioni ammissibili (gli oggetti in I 1 hanno già un peso superiore alla capacità b dello zaino). In tal caso ci si arresta e si pone U(S(I 0,I 1 )) =
p. 12/1 Continua Passo 2 Altrimenti, si sottraggano successivamente a b i I 1 p i i pesi degli oggetti in I f nell ordine dato arrestandoci se Caso A si arriva ad un valore negativo, ovvero esiste r {1,...,k 1} tale che b i I 1 p i p i1 p ir 0 ma b i I 1 p i p i1 p ir p ir+1 < 0. Caso B Si sono sottratti i pesi di tutti gli oggetti in I f senza mai arrivare ad un valore negativo.
p. 13/1 Soluzioni ottime Caso A: x i1 = x i2 = = x ir = 1 x ir+1 = b i I 1 p i r j=1 p i j p ir+1 x ir+2 = x ir+3 = = x ik = 0 Caso B: x i1 = x i2 = = x ik = 1
p. 14/1 Passo 3 Output caso A: U(S(I 0, I 1 )) = i I 1 v i + r h=1 v ih + v ir+1 b i I 1 p i r h=1 p i h p ir+1. Output caso B: N = I 1 {i 1,..., i r } con f(n) = r v i + i I 1 U(S(I 0, I 1 )) = k v i + v ih. i I 1 h=1 h=1 v ih N = I 1 I f, con f(n) = U(S(I 0, I 1 )) = k v i + i I 1 h=1 v ih
p. 15/1 Nota bene Nel caso B il sottinsieme S(I 0,I 1 ) verrà sicuramente cancellato. Infatti in tal caso si ha: U(S(I 0,I 1 )) = f(n) LB, da cui segue la cancellazione del sottinsieme.
p. 16/1 Branching Vediamo ora di descrivere l operazione di branching. Dapprima la descriviamo per l insieme S e poi l estendiamo agli altri sottinsiemi generati dall algoritmo. Supponiamo di trovarci, al termine dell esecuzione della procedura per il calcolo di U(S), nel caso A (il caso B è un caso banale in cui tutti gli oggetti possono essere inseriti nello zaino). Avremo quindi un indice r + 1 che è il primo oggetto per cui la sottrazione successiva dei pesi assume valore negativo.
p. 17/1 Continua La regola di branching prescrive di suddividere S nei due sottinsiemi S({r + 1}, ) e S(, {r + 1}), ovvero in un sottinsieme della partizione si aggiunge l oggetto r + 1 all insieme I 0, nell altro lo si aggiunge all insieme I 1.
p. 18/1 Estensione Quanto visto per l insieme S può essere esteso a tutti i sottinsiemi di forma S(I 0,I 1 ): dato un tale sottinsieme, l oggetto i r+1 che appare nel calcolo dell upper bound nel caso A viene aggiunto in I 0 in un sottinsieme della partizione di S(I 0,I 1 ) e in I 1 nell altro sottinsieme, ovvero la partizione di S(I 0,I 1 ) sarà data dai seguenti sottinsiemi S(I 0 {i r+1 },I 1 ) e S(I 0,I 1 {i r+1 }). Si noti che con questa regola di branching tutti i sottinsiemi che appariranno nell insieme C saranno del tipo S(I 0,I 1 ) e quindi un upper bound per essi potrà sempre essere calcolato tramite la procedura vista.