Parte III:
Algoritmo di Branch-and-Bound
Divide et Impera
Sia
z* = max {c
Tx : x ∈ S} (1)
un problema di ottimizzazione combinatoria difficile da risolvere.
Domanda: E’ possibile decomporre il problema (1) in una collezione di sottoproblemi tali che
– ogni nuovo sottoproblema sia facile da risolvere, e
– le informazioni ottenute risolvendo la collezione di
sottoproblemi ci guidino nella ricerca della soluzione
ottima di (1)?
Proposizione: Sia S = S
1∪ S
2∪ … ∪ S
Kuna decomposizione della regione ammissibile S in K sottoinsiemi, e sia z
h= max {c
Tx : x ∈ S
h}, per h = 1,…,K. Allora z* = max
hz
h.
Osservazione: Non abbiamo richiesto che la decomposizione sia una partizione (ovvero, che S
i∩ S
j= ∅ ), ma non abbiamo nemmeno escluso che possa esserlo!
Una tipica rappresentazione dell’approccio divide et impera è tramite un albero di enumerazione.
Divide et Impera
Un esempio
Se S ⊆ {0,1}
3, possiamo costruire il seguente albero di enumerazione S
S
0x
1=0
S
1x
1=1
S
00x
2=0
S
01x
2=1
S
10x
2=0
S
11x
2=1
S
000x
3=0
S
001x
3=1
S
010x
3=0
S
011x
3=1
S
100x
3=0
S
101x
3=1
S
110x
3=0
S
111x
3=1
Le foglie dell’albero corrispondono esattamente ai punti che
andremmo a esaminare se potessimo fare un’enumerazione completa.
Osservazione: Costruendo in questo modo l’albero di enumerazione stiamo semplicemente enumerando TUTTI gli insiemi ammissibili!!!!
Per la maggior parte dei problemi è impossibile effettuare una enumerazione completa.
Poiché per un problema di ottimizzazione combinatoria conosciamo i bound “primali” e i bound “duali”, l’idea è quella di utilizzare tali bound per enumerare gli insiemi ammissibili in modo più efficace.
Divide et Impera
Proposizione: Sia S = S
1∪ S
2∪ .. ∪ S
Kuna decomposizione della regione ammissibile S in K sottoinsiemi, e siano
• z
h= max {c
Tx : x ∈ S
h},
• z
h LBun lower bound per z
h, e
• z
hUBun upper bound per z
hper h = 1, …, K. Allora
• z
UB= max
hz
hUBè un upper bound per z
*, e
• z
LB= max
hz
hLBè un lower bound per z
*.
Divide et Impera
Potatura per ottimalità
S
0z
0UB= 27 z
0LB=13
Le informazioni su upper e lower bound per il valore ottimo z* permettono di decidere quali nodi dell’albero ha senso continuare ad esaminare per trovare la soluzione ottima.
Poiché z
1LB= z
1UB= 20, sicuramente z
1= 20. Pertanto, non c’è bisogno di esplorare ulteriormente il nodo S che può essere potato per ottimalità.
S
2x
1=1
z
2UB= 25 z
2LB= 15
S
1x
1= 0
z
1UB= 20
z
1LB=20
Potatura per ottimalità
S
0z
0UB= 27 z
0LB=13
z
LB= 20
Ad ogni passo teniamo traccia di un lower bound globale z
LB. Per il nodo S
0, z
LB= z
0LB(alternativamente, z
LB= - ∞ ).
Per ciascun nodo di ogni livello dell’albero, aggiorniamo il valore di z
LBse in corrispondenza di quel nodo abbiamo calcolato un lower bound MIGLIORE (ossia maggiore) di quello corrente.
S
2x
1=1
z
2UB= 25 z
2LB= 15
S
1x
1= 0
z
1UB= 20 z
1LB=20
= z
LBPotatura per bound
S
0z
0UB= 27 z
0LB=13
S
2x
1=1
z
2UB= 26 z
2LB= 21
S
1x
1= 0
z
1UB= 20 z
1LB= 18
Poiché z
LB= 21, la soluzione ottima del problema iniziale ha valore almeno pari a 21. Dal momento che z
1UB= 20, sicuramente non è possibile ottenere l’ottimo esplorando il nodo S
1. Pertanto, S
1può essere potato per bound.
z
LB= 21
= z
LBPotatura per inammissibilità
S
0z
0UB= 27 z
0LB=13
S
2x
1=1
S
2= ∅
S
1x
1= 0
z
0UB= 20 z
0LB= 18
Poiché il sottoproblema associato al nodo S
2è inammissibile, non è possibile ottenere l’ottimo esplorando il nodo S
2. Pertanto S
2può essere potato per inammissibilità.
= z
LBz
LB= 18
Nessuna potatura
In questo caso non possiamo fare nessuna osservazione che permetta di potare uno dei due nodi in esame e quindi è necessario esplorare sia S
1che S .
S
0z
0UB= 40 z
0LB=0
S
2x
1=1
z
2UB= 37 z
2LB= 0
S
1x
1= 0
z
1UB= 20 z
1LB= 18
= z
LBz
LB= 18
max 4x 1 − x 2 7x 1 −2x 2 ≤14
x 2 ≤3
2x 1 −2x 2 ≤3 x 1 ≥ 0
x 2 ≥ 0 x ∈Z 2
1 2
3/2
(20/7,3)
(11/5,7/10) 3
x
2x
1Esempio
P
Problema al nodo radice S
0: Rilassamento lineare di P.
1 2
3/2
x
0UB=(20/7,3)
(11/5,7/10) 3
x
2x
1Valore dell'UB al nodo radice: z
0UB= 59/7.
Poiché non abbiamo una soluzione ammissibile, fissiamo z
0LB= - ∞
Esempio
S
1=S
0∩ { x : x
1≤ ⌊ x
1⌋ }
Esempio
z
0LB= − ∞ = z
LBS
0z
0
UB
=59/7
Consideriamo la variabile frazionaria x
1del vettore x
0UBe generiamo i sottoproblemi di S
0applicando la seguente regola di branching:
S
2=S
0∩ { x : x
1≥ x
1 }
S 1 =S 0 ∩ { x : x 1 ≤ ⌊ 20/ 7 ⌋ =2 }
S 2 =S 0 ∩ { x : x 1 ≥ 20 / 7 =3 }
Memorizziamo S
1e S
2in una lista di sottoproblemi che devono essere esplorati: L = {S
1, S
2}
Scegliamo di analizzare il sottoproblema S
1.
S
0S
1S
2Esempio
z
0LB= − ∞ = z
LBz
0UB=59/7
S 1 =S 0 ∩ { x : x 1 ≤ 2 } S 2 =S 0 ∩ { x : x 1 ≥3 }
Risolviamo il sottoproblema al nodo S
1.
max 4x 1 − x 2 7x 1 −2x 2 ≤ 14
x 2 ≤3
2x 1 −2x 2 ≤ 3 x 1 ≤2
x 1 ≥0 x 2 ≥0
1 2
3 x
2x
1Esempio
x
1UB=(2,1/2)
Valore dell'UB per il sottoproblema S
1: z
1UB= 15/2.
Poiché non possiamo applicare nessun criterio di potatura, il nodo S
1dovrà essere esplorato.
Esempio
S
0S
1S
2z
0LB= − ∞ = z
LBz
0UB=59/7
z
1UB=15/2
z
1LB= − ∞ = z
LBRisolviamo il sottoproblema al nodo S
2.
max 4x 1 − x 2 7x 1 −2x 2 ≤14
x 2 ≤3
2x 1 −2x 2 ≤3 x 1 ≤2
x 1 ≥3 x 1 ≥0 x 2 ≥0
Esempio
1 2
3 x
2x
13
Il sottoproblema al nodo S
2è inammissibile!
Il nodo S
2può essere chiuso per inammissibilità.
Esploriamo il nodo S
1Esempio
S
0S
1S
2z
0LB= − ∞ = z
LBz
0UB=59/7
z
1UB=15/2
z
1LB= − ∞ = z
LBEsempio
S 3 =S 1 ∩ { x : x 2 ≤ 0 } S 4 =S 1 ∩ { x : x 2 ≥1 }
S
0S
1S
2z
0LB= − ∞ = z
LBz
0UB=59/7
z
1UB=15/2
z
1LB= − ∞ = z
LBS
3S
4Memorizziamo S
3e S
4nella lista di sottoproblemi che devono essere esplorati: L = {S
3, S
4}
Scegliamo di analizzare il sottoproblema S
3.
Risolviamo il sottoproblema al nodo S
3.
max 4x 1 − x 2 7x 1 −2x 2 ≤14 2x 1 −2x 2 ≤3
x 1 ≤2 x 2 ≤ 0 x 1 ≥0 x 2 ≥0
1 2
3 x
2x
1Esempio
x
3UB=(3/2,0)
Valore dell'UB per il sottoproblema S
3: z
3UB= 6.
Esempio
S
0S
1S
2z
0LB= − ∞ = z
LBz
0UB=59/7
z
1UB=15/2
z
1LB= − ∞ = z
LBS
3S
4z
3UB=6
z
3LB= − ∞ = z
LBPoiché in questo momento non possiamo applicare nessun
criterio di potatura, il nodo S
3dovrà essere esplorato.
max 4x 1 − x 2 7x 1 −2x 2 ≤14
x 2 ≤3
2x 1 −2x 2 ≤3 x 1 ≤2
x 2 ≥1 x 1 ,x 2 ≥0
1 2
3 x
2x
11
Esempio
Risolviamo il sottoproblema al nodo S
4.
x
4UB=(2,1)
Valore dell'UB per il sottoproblema S
4: z
4UB= 7.
Osserviamo che la soluzione trovata è intera! Possiamo
aggiornare il valore del lower bound globale!
Il nodo S
4può essere chiuso per ottimalità.
Esempio
S
0S
1S
2z
0LB= − ∞ = z
LBz
0UB=59/7
z
1UB=15/2 z
1LB= − ∞
S
3S
4z
3UB=6
z
3LB= − ∞ z
4UB=7
z
4LB= 7 = z
LBIn seguito all'aggiornamento del valore del lower bound possiamo chiudere anche il nodo S
3per bound. Infatti: z
3UB= 6 < z
4LB.
Esempio
S
0S
1S
2z
0LB= − ∞ = z
LBz
0UB=59/7
z
1UB=15/2 z
1LB= − ∞
S
3S
4z
3UB=6
z
3LB= − ∞ z
4UB=7
z
4LB= 7 = z
LBPoiché non ci sono altri nodi da esplorare nella lista L, l'algoritmo di Branch & Bound termina con la soluzione ottima intera x* = (2, 1) di valore z* = 7.
Esempio
S
0S
1S
2z
0LB= − ∞ = z
LBz
0UB=59/7
z
1UB=15/2 z
1LB= − ∞
S
3S
4z
3UB=6
z
3LB= − ∞ z
4UB=7
z
4LB= 7 = z
LBProcedura di Branch-and-Bound
Tramite l’albero di enumerazione, enumeriamo un insieme di soluzioni
“implicitamente” perché alcuni rami dell’albero vengono potati per:
– ottimalità, oppure – bound, oppure – inammissibilità.
Nella procedura di Branch & Bound è importante
• Scegliere la strategia per il calcolo del bound duale.
• Scegliere la variabile su cui applicare la procedura di branching.
• Scegliere la strategia di esplorazione dell'albero di enumerazione.
Procedura di Branch-and-Bound
Scelta della strategia per il calcolo del bound duale:
EFFICIENZA vs QUALITA' DEL BOUND
Scelta della variabile su cui fare branching:
VARIABILE “PIU' FRAZIONARIA”
(nell'insieme di variabili frazionarie C si sceglie di fare branching sulla variabile j ∈ C in corrispondenza di arg max
j∈Cmin{f
j, 1 – f
j,}, con f
j= x
j- x
j )
Scelta della strategia di esplorazione dell'albero di enumerazione
VISITA IN PROFONDITA' (genera rapidamente una soluzione ammissibile, facile riottimizzazione)
VISITA DEL NODO CON MAX z
UB(minimizza il numero di sottoproblemi
analizzati)
Procedura di Branch-and-Bound
Siano
• L = lista dei sottoproblemi che devono essere risolti
• P
i= formulazione del sottoproblema associato al nodo S
i.
L’algoritmo di Branch-and-Bound ha il seguente diagramma di
flusso
Inizializzazione
L=S, z
LB= - ∞; x* void;
count = 0;
Test: L = ∅ ?
Scegli un problema S
idalla lista
Risolvi il Rilassamento Lineare RL
isu P
iCaso 2: Bound
P
i≠ ∅ , z
iUBvalore della soluzione ottima x
iUBdi RL
i. Se z
iUB< z
LBelimina S
iper bound, vai a Test
Caso 3: Ottimalità
Se P
i≠ ∅ e x
iUBè una soluzione ottima intera di Rl
ielimina S
iper ottimalità.
Se z
iLB> z
LBallora z
LB=z
iLB,vai a Test Individua una componente frazionaria k di x
iUBe ramifica S
iaggiungendo ad L S
count+1= S
i∩ {x
k= 0}
S
count+2= S
i∩ { x
k= 1}
count = count + 2
Caso 1: Inammissibilità Se P
i= ∅ elimina S
iper inammissibilità, vai a Test
Branch-and-Bound
Esempio
Consideriamo il problema di knapsack
max 30 x
1+ 36 x
2+ 15 x
3+ 11 x
4+ 5 x
5+ 3 x
69 x
1+ 12 x
2+ 6 x
3+ 5 x
4+ 3 x
5+ 2 x
6< 17 (1) x ∈ {0,1}
6La soluzione ottima del Knapsack continuo è
x
0UB= (1, 2/3, 0, 0, 0, 0) di valore 54 (z
0UB)
Inizializziamo il valore del lower bound uguale al valore di una soluzione ammissibile del problema
x
0LB= (1, 0, 0, 0, 0, 0) di valore 30 (z
0LB) z
LB= 30
Osservazione: Poiché la funzione obiettivo ha coefficienti interi,
possiamo scrivere la condizione di potatura per bound (caso 2)
come z
iUB < z
LB.
S
0S
1S
2z1UB = 49.4 z1LB = 45
x2 = 0 x2 = 1
zLB = 45
z0UB = 54
z0LB = 30 = zLB
z2UB = 52.6 z2LB = 36
S
3S
4x4 = 0 x4 = 1
z3UB = 48.33 z3LB = 45
z4UB = 48.5
z4LB = 41
S
5S
6x1 = 0 x1 = 1
z5UB = 48.5
z5LB = 36
inammissibilità ×
S
7S
8x5 = 0 x5 = 1
S
7z7UB = 48 z7LB = 48
×
zLB = 48
OPT .
z8UB = 47.5 z8LB = 35
bound.
×
z9UBxS
= 463 = 09 xS
3 = 110z9LB = 46
bound .
×
z10UB = 36z10LB = 36
bound.
×
zx113S
UB =011 = 47S
x312 =1 z11LB = 47OPT .
× inammissibilità ×
Esercizio 1
Algoritmo di programmazione
dinamica
Programmazione Dinamica
Schema di principio: Dato un problema di OC, P, la Programmazione Dinamica (PD):
– Risolve un sottoproblema di P all’ottimo.
– Iterativamente “estende” la soluzione a P.
Proprietà fondamentale (optimal substructure)
Sia KP (N, b) un problema di knapsack con soluzione ottima x
*.
Consideriamo il problema di knapsack KP(N \ r, b – a
r) che si ottiene da KP eliminando un qualsiasi oggetto r e diminuendo la capacità dello zaino della quantità a
r.
.La soluzione ottima di KP(r, b–a
r) si ottiene da x
*semplicemente
eliminando la variabile x
r.
Esempio
Consideriamo il seguente problema di knapsack:
max 6 x
1+ 10 x
2+ 12 x
3x
1+ 2x
2+ 3 x
3< 5 (1) x ∈ {0,1}
3La soluzione ottima è x
*(1)= (0, 1, 1), di valore 22.
Consideriamo il problema che si ottiene eliminando l’oggetto 2 e diminuendo la capacità b del corrispondente ingombro a
2:
max 6 x
1+ 12 x
3x
1+ 3 x
3< 5 – 2 = 3 (2) x ∈ {0,1}
2La soluzione ottima è x
*(2)=(0, 1), di valore 12.
Osservazione: La soluzione x
*(2)= (0, 1) è una “sottosoluzione” di x
*(1)= (0, 1,
1), ovvero si ottiene da x*
(1)semplicemente eliminando la variabile x
2.
Notazione
Siano r e d due interi tali che 1 ≤ r ≤ n, 0 ≤ d ≤ b.
Sia KP (r, d) il problema di knapsack:
max Σ p
jx
jΣ a
jx
j< d
x ∈ {0, 1}
rKP (r, d) è un sottoproblema di KP, avente soluzione ottima di valore z
r(d).
j = 1 r
r
j = 1