Parte III: Algoritmo di Branch-and-Bound
Divide et Impera Sia z * max {c T x : 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 1. ogni nuovo sottoproblema sia facile da risolvere, e 2. le informazioni ottenute risolvendo la collezione di sottoproblemi ci guidino nella ricerca della soluzione ottima di (1)?
Divide et Impera Proposizione: Sia S S 1 S 2 S K una decomposizione della regione ammissibile S in K sottoinsiemi, e sia z h max {c T x : x S h }, per h 1,,K. Allora z* max h z 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.
Un esempio Se S {0,1} 3, possiamo costruire il seguente albero di enumerazione x 1 0 S x 1 1 x 2 0 S 0 x 2 1 x 2 0 S 1 x 2 1 S 00 S 01 S 10 S 11 x 3 0 x 3 1 x 3 0 x 3 1 x 3 0 x 3 1 x 3 0 x 3 1 S 000 S 001 S 010 S 011 S 100 S 101 S 110 S 111 Le foglie dell albero corrispondono esattamente ai punti che andremmo a esaminare se potessimo fare un enumerazione completa.
Divide et Impera 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 K una decomposizione della regione ammissibile S in K sottoinsiemi, e siano z h max {c T x : x S h }, z h LB un lower bound per zh, e z h UB un upper bound per zh per h 1,, K. Allora z UB max h z h UB è un upper bound per z*, e z LB max h z h LB è un lower bound per z*.
Potatura per ottimalità 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. S 0 z 0 UB 27 z 0 LB 13 x 1 0 x 1 1 S 1 z 1 UB 20 z 1 LB 20 S 2 z 2 UB 25 z 2 LB 15 Poiché z 1 LB z1 UB 20, sicuramente z1 20. Pertanto, non c è bisogno di esplorare ulteriormente il nodo S 1 che può essere potato per ottimalità.
Potatura per ottimalità Ad ogni passo teniamo traccia di un lower bound globale z LB. Per il nodo S 0, z LB z 0 LB (alternativamente, z LB - ). Per ciascun nodo di ogni livello dell albero, aggiorniamo il valore di z LB se in corrispondenza di quel nodo abbiamo calcolato un lower bound MIGLIORE (ossia maggiore) di quello corrente. z 0 UB 27 S 0 z 0 LB 13 z LB x 1 0 x 1 1 S 1 z 1 UB 20 z 1 LB 20 z LB 20 S 2 z 2 UB 25 z 2 LB 15
Potatura per bound z 0 UB 27 S 0 z 0 LB 13 z LB x 1 0 x 1 1 S 1 z 1 UB 20 z 1 LB 18 S 2 z 2 UB 26 z 2 LB 21 z LB 21 Poiché z LB 21, la soluzione ottima del problema iniziale ha valore almeno pari a 21. Dal momento che z 1 UB 20, sicuramente non è possibile ottenere l ottimo esplorando il nodo S 1. Pertanto, S 1 può essere potato per bound.
Potatura per inammissibilità z 0 UB 27 S 0 z 0 LB 13 z LB x 1 0 x 1 1 S 1 z 0 UB 20 z 0 LB 18 z LB 21 S 2 S 2 Poiché il sottoproblema associato al nodo S 2 è inammissibile, non è possibile ottenere l ottimo esplorando il nodo S 2. Pertanto S 2 può essere potato per inammissibilità.
Nessuna potatura z 0 UB 40 S 0 z 0 LB 0 z LB x 1 0 x 1 1 S 1 z 1 UB 20 z 1 LB 18 z LB 18 S 2 z 2 UB 37 z 2 LB 0 In questo caso non possiamo fare nessuna osservazione che permetta di potare uno dei due nodi in esame e quindi è necessario esplorare sia S 1 che S 2.
Procedura di Branch-and-Bound Tramite l albero di enumerazione, enumeriamo un insieme di soluzioni implicitamente perché alcuni rami dell albero vengono potati per: 1. ottimalità, oppure 2. bound, oppure 3. inammissibilità. 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:
Branch-and-Bound Inizializzazione LS, z LB - count 0; Test: L? Scegli un problema S i dalla lista Risolvi il Rilassamento Lineare RL i su P i Caso 1: Inammissibilità Se P i elimina S i per inammissibilità, vai a Test Caso 2: Bound Se P i, sia z i UB il valore della soluzione ottima x i UB di RL i. Se z i UB < z LB elimina S i per bound, vai a Test Caso 3: Ottimalità Se P i e la soluzione ottima x i UB di RL i è intera, allora elimina S i. Se z i LB > z LB allora z LB z i LB, vai a Test Individua una componente frazionaria k di x i UB e ramifica S i aggiungendo ad L S count+1 S i {x k 0} S count+2 S i {x k 1} count count + 2
Esempio Consideriamo il problema di knapsack max 30 x 1 + 36 x 2 + 15 x 3 + 11 x 4 + 5 x 5 + 3 x 6 9 x 1 + 12 x 2 + 6 x 3 + 5 x 4 + 3 x 5 + 2 x 6 < 17 (1) x {0,1} 6 La soluzione ottima del Knapsack continuo è x 0 UB (1, 2/3, 0, 0, 0, 0) di valore 54 (z0 UB ) Inizializziamo il valore del lower bound uguale al valore di una soluzione ammissibile del problema x 0 LB (1, 0, 0, 0, 0, 0) di valore 30 (z0 LB ) z LB 30 Osservazione: Poiché la funzione obiettivo ha coefficienti interi, possiamo scrivere la condizione di potatura per bound (caso 2) come z i UB < z LB.
Esercizio 1 z 0 UB 54 S 0 z 0 LB 30 z LB x 2 0 x 2 1 z 1 49.4 UB z 1 LB 45 S 1 z LB 45 S 2 z 2 UB 52.6 z 2 LB 36 x 4 0 x 4 1 x 1 0 x 1 1 z 3 48.33 UB z4 48.5 UB z 5 48.5 UB z 3 S 3 S LB 45 z 4 LB 41 4 S 5 S z 5 36 6 LB inammissibilità x 5 0 x 5 1 S 7 S 8 S z 7 UB 48 z 8 UB 47.5 z 7 LB 48 z LB 48 OPT. z 8 LB 35 bound. x 3 0 x 3 1 9 S 10 S z 9 UB 46 z 10 UB 36 z 9 LB 46 bound. z 10 LB 36 bound. x 3 0 x 3 1 11 S 12 inammissibilità z 11 UB 47 z 11 LB 47 OPT.
Algoritmo di programmazione dinamica
Programmazione Dinamica Schema di principio: Dato un problema di OC, P, la Programmazione Dinamica (PD): 1. Risolve un sottoproblema di P all ottimo. 2. 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 3 x 1 + 2x 2 + 3 x 3 < 5 (1) x {0,1} 3 La 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 3 x 1 + 3 x 3 < 5 2 3 (2) x {0,1} 2 La 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: r max Σ c j x j j 1 r Σ a j x j < d j 1 x {0, 1} r KP (r, d) è un sottoproblema di KP, avente soluzione ottima di valore z r (d).
Programmazione dinamica Con questo formalismo, il valore della soluzione ottima di KP vale z n (b). Calcolo di z n (b): 1. Calcolo z r (d) per r {1,, n}. 2. Per ogni r, calcolo z r (d) per d {0,, b}. Osservazione: z r (d) si calcola in modo ricorsivo se conosco i valori z r-1 (d) per d {0,, b}.
Formula ricorsiva Condizione iniziale di ricorsione: z 1 ( d ) 0 c 1 per per d d < a a 1 1 Questa condizione implica: Se z 1 (d) 0 x 1 0 Se z 1 (d) c 1 x 1 1
Formula ricorsiva Formula di ricorsione: z r (d) z r 1 (d) max{z r 1 (d), z r 1 (d a r )+c r } se d < a r se d > a r La formula implica Se z r (d) z r-1 (d) x r 0 [l oggetto r NON è stato scelto] Se z r (d) z r-1 (d a r )+c r x r 1 [l oggetto r E stato scelto]
Algoritmo e complessità DP for for for -KP(n, for z for if(z z m m d d return m d (d) then d else (d) a 2 z 0 1 m 1 0 z a (d) max max n b, to m max; (b) to to m 1 to (d) > a, z n to z z c) a b 1 a m 1 m 1 m 1 z b (d 1 m 1 (d) 1 (d); (bˆ z(d) Osservazione: La complessità dell algoritmo è O(nb), ovvero dipende dall intero b (dimensione dello zaino). In questo caso si dice che l algoritmo ha complessità pseudo polinomiale. a a 1 m c ) + m ) + 1 c ; c m m 0; ) ;