Parte III
Algoritmo di branch-and-bound
Divide et Impera
Sia
z* = max {cTx : x ∈ S} (1)
un problema di OC difficile da risolvere Domanda
Voglio decomporre il problema (1) in una collezione di problemi tali che
1. Ogni nuovo problema sia facile da risolvere
2. Le informazioni che ottengo risolvendo la collezione di problemi mi indicano la sol. ottima di (1)
Un semplice teoremino
Sia S = S1 ∪ S2 ∪.. ∪ Sk una decomposizione della regione ammissibile S in k insiemi
Teorema
Se zh = max {cTx : x ∈ Sh} allora z* = maxh zh Attenzione
Non ho richiesto che Si ∩ Sj = ∅, ovvero che la decomposizione sia una partizione, ma non ho escluso che possa essere una partizione!
Un esempio
Consideriamo S = {0,1}3
S S0
x1=0
S1
x1=1
S00
x2=0
S01
x2=1
S10
x2=0
S11
x2=1
S000
x3=0
S001
x3=1
S010
x3=0
S011
x3=1
S100
x3=0
S101
x3=1
S110
x3=0
S111
x3=1
Attenzione…
Stiamo semplicemente enumerando TUTTI gli insiemi ammissibili!!!!
Per un problema di OC conosciamo bound
“primali” e “duali”
Domanda
Possiamo utilizzare questi bound per enumerare
in modo più efficace?
Altro teoremino
Sia S = S1 ∪ S2 ∪.. ∪ Sk una decomposizione della regione ammissibile S in k insiemi.
Sia zk = max {cTx : x ∈ Sk}
Se zkLB e zkUB sono rispettivamente un lower e un upper bound per zk
Allora
zUB = maxk zkUB è un upper bound per z* zLB = maxk zkLB è un lower bound per z*
Potatura per ottimalità
S zzUB= 27
LB=13
S0
x1=0
z 0UB= 20 z 0LB=20
S1
x1=1
z 1UB= 25 z 1LB=15 zUB= 25
zLB=20
Potatura per bound
S zzUB= 27
LB=13
S0
x1=0
z 0UB= 20 z 0LB=18
S1
x1=1
z 1UB= 26 z 1LB=21 zUB= 26
zLB=21
Potatura per inammissibilità
S zzUB= 27
LB=13
S0
x1=0
z 0UB= 20 z 0LB=18
S1
x1=1
S1=∅
zUB= 27 zLB=18
Nessuna potatura
S zzUB= 40
LB=0
S0
x1=0
z 0UB= 20 z 0LB=18
S1
x1=1
z 1UB= 37 z 1LB= 0 zUB= 37
zLB=18
Ricapitolando…
Enumero un insieme di soluzioni “implicitamente”
perché “poto” rami dell’albero per:
1. Inammissibilità 2. Bound
3. Ottimalità
Indichiamo con L la lista dei sottoproblemi e con Pi la formulazione del sottoproblema Si.
L’algoritmo ha il seguente diagramma di flusso:
Branch-and-Bound
Caso 3: Ottimalità
Se Pi ≠ ∅ e la soluzione ottima xiUB del RL è intera, allora elimina Si.
Se ziUB> zLB allora zLB =ziUB, vai a Test Individua una componente frazionaria k di xiUBe ramifica Si aggiungendo ad L Scount+1 = Si ∩ {xk= 0}
Scount+2 = Si ∩ {xk= 1}
count = count + 2 Caso 2: Bound
Se Pi ≠ ∅, sia ziUB il valore della soluzione ottima xiUBdel RL.
Se ziUB< zLB elimina Si per bound, vai a Test
Inizializzazione L=S, zLB = - ∞ count = 0;
Test: L = ∅?
Scegli un problema Si dalla lista
Risolvi il Rilassamento Lineare su Pi
Caso 1: Inammissibilità Se Pi = ∅ elimina Si per inammissibilità, vai a Test
Esempio
Consideriamo il problema di knapsack
max 9 x1 + 15 x2 + 8 x3 + 6 x4 + 5 x5 + 4 x6 + x7
6 x1 + 11 x2 + 6 x3 + 5 x4 + 5 x5 + 4 x6 + x7 < 19 (1) x ∈ {0,1}7
La soluzione ottima del rilassamento lineare è
x 0UB = (1, 1, 1/3, 0, 0, 0, 0) di valore 26.666 (UB) Possiamo anche inizializzare il LB con la soluzione ammissibile xLB = (1, 1, 0, 0, 0, 0, 1) di valore 25 Osservazione
Poiché la f.o. ha coefficienti interi, possiamo scrivere la condizione di potatura per bound (caso 2) come ⎣ziUB⎦ < zLB
10 8
11 12
4
z 4UB= 25.91
x 4UB = (1, 0.727, 0, 1, 0, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1) z 0UB= 26.66
x 0UB = (1, 1, 0.33, 0, 0, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1) z 1UB= 26.4
x 1UB = (1, 1, 0, 0.4, 0, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1) z 2UB= 26.654
x 2UB = (1, 0.636, 1, 0, 0, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1) z 3UB= 26
x 3UB = (1, 1, 0, 0, 0.4, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1)
z 5UB= 25
x 5UB = (1, 0, 1, 1, 0.4, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1)
z 6UB= 26
x 6UB = (0.33, 1, 1, 0, 0, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1)
z 7UB= 26
x 7UB = (1, 1, 0, 0, 0, 0.5, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1) z 8UB= 24.91
x 8UB = (1, 0.727, 0, 0, 1, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1)
z 9UB= 25.4
x 9UB = (0, 1, 1, 0.4, 0, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1)
z 10UB= ∅
x 10UB = (1, 1, 1, 0, 0, 0, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1)
0
1
3 7
2
5
9 6
Esempio
z 11UB= 25
x11UB = (1, 1, 0, 0, 0, 0, 1) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1)
z 12UB= 25.27
x 12UB = (1, 0.81, 0, 0, 0, 1, 0) z LB= 25
x LB= (1, 1, 0, 0, 0, 0, 1) N.B. In rosso le variabili fissate
Parte IV:
Programmazione dinamica
Esempio
Consideriamo il problema di knapsack:
max 6 x1 + 10 x2 + 12 x3
x1 + 2x2 + 3 x3 < 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 il rhs del corrispondente ingombro:
max 6 x1 + 12 x3
x1 + 3 x3 < 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 x2
Programmazione Dinamica
Schema di principio
Dato un problema di OC, S, la Programmazione Dinamica (PD):
1. Risolve un sottoproblema di S all’ottimo
2. Iterativamente “estende” la soluzione ad S 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 - ar) che si
ottiene da KP eliminando un qualsiasi oggetto r e diminuendo la capacità dello zaino della quantità ar.
La soluzione ottima di KP(r, b - ar) è costituita da x*\xr .
Notazione
Siano m e d due interi tali che 1 ≤ m ≤ n, 0 ≤ d ≤ b Sia KP (m, d) il problema di knapsack:
KP (m, d) è un sottoproblema di KP, avente soluzione ottima di valore zm(d).
{ }
mm
j
j j
m
j
j j
x
d x
a
x c
1 , 0 max
1
1
∈
∑ ≤
∑
=
=
Programmazione dinamica
Con questo formalismo, il valore della soluzione ottima di KP vale zn(b).
Calcolo di z
n(b)
1. Calcolo zm(d) per m = {1, …, n}
2. Per ogni m, calcolo zm(d) per d = {0, …, b}
Osservazione
zm(d) si calcola in modo ricorsivo se conosco i valori zm-1(d) per d = {0, …, b}
Formula ricorsiva Condizione iniziale di ricorsione
( ) ⎩ ⎨ ⎧
≥
= <
1 1
1 1
0
a d
per c
a d
d per z
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
{ }
⎩ ⎨
⎧
≥
<
+
= −
−
−
−
m m m
m m
m
m
m
d a
a d
c a
d z
d z
d d z
z se
se )
( ),
( max
) ) (
(
1 1
1
La formula implica:
Se zm(d) = zm-1(d) ⇒ xm = 0 [l’oggetto m NON è stato scelto]
Se zm(d) = zm-1(d-am) + cm⇒ xm = 1 [l’oggetto m È stato scelto]
Esempio max
6 x1 + 10 x2 + 12 x3x1 + 2x2 + 3 x3 < 5 (KP) x ∈ {0,1}3
Calcoliamo la formula di ricorsione per m = 1 z1(0) = 0 ⇒ x1= 0
z1(1) = 6 ⇒ x1 = 1 z1(2) = 6 ⇒ x1 = 1 z1(3) = 6 ⇒ x1 = 1 z1(4) = 6 ⇒ x1 = 1 z1(5) = 6 ⇒ x1 = 1
Esempio
Rappresentiamo questi valori in una tabella di dimensione n × b, in cui ogni elemento contiene zm(d).
Il simbolo * nella soluzione indica che la variabile non è stata ancora fissata
d
m 0 1 2 3 4 5
1
(0,*,*)
0
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6 2 z2(0) z2(1) z2(2) z2(3) z2(4) z2(5) 3 z3(0) z3(1) z3(2) z3(3) z3(4) z3(5)
Esempio
Calcoliamo ora z2(d):
Per d = {0, 1}
z2(0) = z1(0) = 0 ⇒ x2= 0 z2(1) = z1(1) = 6 ⇒ x2= 0 Per d = {2, 3, 4, 5}
z2(2) = max {z1(2), z1(0) + c2} = max{6, 10} = 10 ⇒x2 = 1 z2(3) = max {z1(3), z1(1) + c2} = max{6, 16} = 16 ⇒x2 = 1 z2(4) = max {z1(4), z1(2) + c2} = max{6, 16} = 16 ⇒x2 = 1 z2(5) = max {z1(5), z1(3) + c2} = max{6, 16} = 16 ⇒x2 = 1 Riportando questi valori in tabella si ha:
Esempio
d
m 0 1 2 3 4 5
1
(0,*,*)
0
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6 2
(0,0,*)
0
(1,0,*)
6
(0,1,*)
10
(1,1,*)
16
(1,1,*)
16
(1,1,*)
16 3 z3(0) z3(1) z3(2) z3(3) z3(4) z3(5)
Esempio
Calcoliamo ora z3(d):
Per d = {0, 1, 2}
z3(0) = z2(0) ⇒ x3 = 0 z3(1) = z2(1) ⇒ x3 = 0 z3(2) = z2(2) ⇒ x3 = 0
Per d = {3, 4, 5}
z3(3) = max {z2(3), z2(0) + c3} = max{16, 12} = 16 ⇒x3 = 0 z3(4) = max {z2(4), z2(1) + c3} = max{16, 18} = 18 ⇒x3 = 1 z3(5) = max {z2(5), z2(2) + c3} = max{16, 22} = 22 ⇒x3 = 1 Riportando questi valori in tabella si ha:
Esempio
d
m 0 1 2 3 4 5
1
(0,*,*)
0
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6
(1,*,*)
6 2
(0,0,*)
0
(1,0,*)
6
(0,1,*)
10
(1,1,*)
16
(1,1,*)
16
(1,1,*)
16 3
(0,0,0)
0
(1,0,0)
6
(0,1,0)
10
(1,1,0)
16
(1,0,1)
18
(0,1,1)
22
Pertanto, la soluzione ottima è x* = (0, 1, 1) di valore 22.
Algoritmo e complessità
(b) z
max;
(d) z
; c ) a b ( z max
(d);
z max
) c ) a (d z
(d) (z
b a
d
(d) z
(d) z
1 a
0 d
n 2
m
; c (d) z
b a
d
0;
(d) z 1 a 0
d
n m
m m
1 m
1 m
m m
1 m 1
m m
1 m m
m
1 1
1
1 1
return else then if
to for
to for
to for
to for
to for
c) a, b, KP(n, -
DP
=
+
−
=
=
+
−
>
=
=
−
=
=
=
=
=
−
=
−
−
−
−
−
ˆ
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.
Parte V:
Rafforzamento di formulazioni e algoritmo del
piano di taglio
Rafforzamento di formulazioni
Il problema di knapsack max 5x1 + 2x2
3x1 + 4x2 < 6
x ∈ {0,1}2 ha come rilassamento lineare max 5x1 + 2x2
3x1 + 4x2 < 6 x1 > 0
x2 > 0 x1 < 1 x2 < 1
Indichiamo con x*LP la soluzione ottima del rilassamento.
Separazione
Domanda
Possiamo individuare una disequazione valida per conv (F) che “separa” x*LP da conv (F) ?
x2
x*LP
x1
Minimal cover
Consideriamo l’insieme
X = {
Σ
j=1, …, n aj xj < b, x ∈ {0,1}n} DefinizioneUn insieme C ⊆ N è un cover se e solo se
Σ
j ∈C aj > b.Un cover è minimale se, comunque preso j ∈ C, l’insieme C \ { j } NON è un cover
Osservazione
Un cover ha associato un vettore caratteristico non ammissibile per X
Disequazioni cover
Teorema
Se C ⊆ N è un cover, la disequazione
Σj ∈C xj < |C| - 1 (*) è valida per conv (X ).
Dimostrazione
Dimostriamo che se xR ∈ {0,1}n non soddisfa il vincolo (*) allora xR
∉ X.
Se xR è tale che Σj ∈c xj > |C| - 1, allora |R ∩ C|= |C|, quindi C ⊆ R.
Pertanto:
Σ
j ∈N ajxjR =Σ
j ∈R aj >Σ
j ∈C aj > bovvero xR ∉ X. ■
Esempio
Consideriamo il problema di knapsack
max 15 x1 + 9 x2 + 8 x3 + 6 x4 + 5 x5 + 4 x6 + x7 11 x1 + 6 x2 + 6 x3 + 5 x4 + 5 x5 + 4 x6 + x7 < 19 x ∈ [0,1]7
x*LP = (1, 1, 1/3, 0, 0, 0, 0)
Una disequazione cover violata da x*LP è la disequazione x1 + x2 + x3 < 2
Come si individua una disequazione di tipo cover violata da x*LP?
Problema di separazione
Domanda
Dato un poliedro P, formulazione di un problema di PL-{0,1}, esiste una disequazione di tipo cover che separa x*LP da conv (X)?
Risposta
a) SI la disequazione esiste e fornisce anche il cover associato C
b) NO non esiste
Un algoritmo A che risponde (correttamente) alla
domanda con una delle due risposte possibili a) o b), si chiama ORACOLO DI SEPARAZIONE
Oracolo di separazione
Riscriviamo la disequazione come
La disequazione è violata da x*LP se e solo se:
Quindi, posso massimizzare la violazione definendo
Un algoritmo per SEP è un oracolo di separazione
⎭⎬
⎫
⎩⎨
⎧ −
=
∑
∈
knapsack di
vincolo del
cover un
è ,
) 1 (
max xLP* C SEP
C j
j
∑
∈>
− +
C j
x j 1) 0 (
1 LP*
∑
∈−
≤
C j
j C
x 1
∑
∈
≤
− +
C j
j C
x | | 0 1
Difatti…
Sia z*SEP il valore della soluzione ottima y*SEP di
Se 1 + z*SEP > 0 allora esiste una disequazione cover violata associata a y*SEP
Se 1 + z*SEP < 0 allora NON esiste una disequazione cover violata
⎭⎬
⎫
⎩⎨
⎧ −
=
∑
∈
knapsack di
vincolo del
cover un
è ),
1 (
max xLP* C SEP
C j
j
Formulazione del problema di separazione
Variabili decisionali
yj = 1 se l’indice j è nel cover yj = 0 altrimenti
Funzione obiettivo
Vincoli
j n
j
j
y
x 1 ) (
max
1
*
LP
−
∑
=n j n
j
j
y
b y
a
} 1 , 0 {
1
1
∈
+
∑
≥=
Osservazione
I coefficienti in funzione obiettivo sono < 0, quindi il problema non ammette una soluzione banale
Proprietà del cover
Trasformazione …
Ponendo wj = 1 – yj il problema di separazione diventa
ovvero …
n
n
j
j j
n
j
j
j n
j
j n
j
j
w
b a
w a
w x
x
} 1 , 0 {
1 st
) 1 (
) 1 (
max
1 1
1
* LP 1
* LP
∈
+ +
−
≥
−
−
−
−
∑
∑
∑
∑
=
=
=
=
…un problema di knapsack
n n j
j j
n j
j
j n
j
j
w
b a
w a
w x
} 1 , 0 {
1 st
) 1
( max
1 1
1
* LP
∈
−
−
≤
−
∑
∑
∑
=
=
=
Esempio
max 15 x1 + 9 x2 + 8 x3 + 6 x4 + 5 x5 + 4 x6 + x7 11 x1 + 6 x2 + 6 x3 + 5 x4 + 5 x5 + 4 x6 + x7 < 19 x ∈ {0,1}7
x*LP = (1, 1, 1/3, 0, 0, 0, 0) Problema di separazione
max (1 – 1) w1 + (1 – 1) w2 + (1 - 1/3) w3 + w 4 + w5 + w6 + w7
11 w1 + 6 w2 + 6 w3 + 5 w4 + 5 w5 + 4 w6 + w7 <
38 – 19 – 1 = 18 w ∈ {0,1}7
Separazione
Problema di separazione
max 2/3 w3 + w 4 + w5 + w6 + w7
11 w1 + 6 w2 + 6 w3 + 5 w4 + 5 w5 + 4 w6 + w7 <
18
w ∈ {0,1}7
Soluzione ottima
w* = (0, 0, 0, 1, 1, 1, 1) di valore 4 Riportiamola nello spazio delle y:
y* = (1, 1, 1, 0, 0, 0, 0) di valore -2/3, ovvero < 1
Pertanto…
1. Il valore di 1 + z*SEP è > 1, ovvero esiste una disequazione cover violata
2. La disequazione è scritta in corrispondenza agli indici che hanno valore 1 in y*, ovvero
y* = (1, 1, 1, 0, 0, 0, 0) corrisponde a x1 + x2 + x3 < 2
Ricapitolando
Algoritmo del piano di taglio (CUT)
Dato il rilassamento lineare di un problema di knapsack 1. Calcola la soluzione ottima x*LP
2. Se x*LP ∈{0, 1}n STOP altrimenti vai a 3.
3. Definisci il problema di separazione 4. Risolvo il problema di separazione
5. Se esiste una disequazione cover violata la
aggiungo alla formulazione corrente e torno al punto 1, altrimenti STOP
Osservazioni
L’algoritmo del piano di taglio può arrestarsi senza aver trovato la soluzione ottima intera. Che cosa si fa in questo caso?
Algoritmo di Cut-and-branch
Il problema di separazione è un problema di knapsack avente la stessa dimensione del problema originario.
Perché non risolvere all’ottimo direttamente il problema originario?
Cosa succede se si risolve euristicamente il problema di separazione?
Cut-and-branch
Caso 3: Ottimalità
Se Pi ≠ ∅ e la soluzione ottima xiUB del RL è intera, allora elimina Si.
Se ziUB> zLB allora zLB =ziUB, vai a Test Individua una componente frazionaria k di xiUBe ramifica Si aggiungendo ad L Scount+1 = Si ∩ {xk= 0}
Scount+2 = Si ∩ {xk= 1}
count = count + 2 Caso 2: Bound
Se Pi ≠ ∅, sia ziUB il valore della soluzione ottima xiUBdel RL.
Se ziUB< zLB elimina Si per bound, vai a Test
Inizializzazione
zLB= - ∞; count = 0;
Calcola P, formulazione di S, applicando CUT
L=P
Test: L = ∅?
Scegli un problema Si dalla lista
Risolvi il Rilassamento Lineare su Pi
Caso 1: Inammissibilità Se Pi = ∅ elimina Si per inammissibilità, vai a Test
Pianificazione degli investimenti
Dati
I = {1, 2, …, n} insieme di investimenti attivabili su un orizzonte temporale T = {1, 2, …, t} di t periodi
Ad ogni investimento i è associato un indice di redditività ci
Ogni investimento i genera un flusso di cassa ai = (ai1, ai2, …, ait) (> 0 introiti, < 0 esborsi) per ogni periodo j ∈ T
Per ogni periodo j ∈ T esiste un budget bj che limita gli esborsi (flussi di cassa negativi).
Trovare
L’insieme di investimenti I*⊆I che massimizza la redditività con il vincolo che la somma dei flussi di cassa degli investimenti
attivati sia in ogni periodo non superiore al budget bj
Esempio
Investimento 1
Investimento 2
Investimento 3
Periodo 1 b1 = -4
Periodo 2 b2 = -5
Periodo 3 b3 = -1 a11=2
a21=3
a31=-6
a12=-10
a22=-3
a32=2
a13=-2
a23=5
a33=-3
Esempio
Nell’esempio precedente, se vengono attivati tutti e tre i progetti il vincolo di budget nel periodo 2 NON è
rispettato.
Formulazione
Variabili decisionali
xj = 1 se il progetto i è attivato xj = 0 altrimenti
n I
i
j i
ij I i
i i
x
T j
b x
a
x c
} 1 , 0 { max
∈
∈
∀
∑ ≥
∑
∈
∈
Rilassamento lineare
Si vuole migliorare la formulazione
Consideriamo un singolo vincolo di budget e il problema di Knapsack associato (att. al cambio di segno)
1 0
max
≤
≤
≥ x
b Ax
x c
T1 0
max
≤
≤
−
≤
−
x
b x
a
x c
j T
j T
(KP
j)
Rafforzamento
L’insieme delle soluzioni del problema di
pianificazione è costituito dall’intersezione degli insiemi delle soluzioni dei singoli
problemi di knapsack (KP
j) Pertanto
è possibile allora rafforzare ciascun problema
KP
j, ad esempio con disequazioni cover, per
ottenere un rafforzamento della formulazione
di pianificazione.
Esempio
Consideriamo il seguente problema di pianificazione:
I = {1, 2, 3, 4, 5}
T = {1, 2, 3}
c = (3, 7, 3, 5, 7) Redditività b = (-2, 0, -5) Budget
a1 = (-4, 1, -2) Flusso di Cassa I1 a2 = (2, -4, 1) Flusso di Cassa I2 a3 = (1, 3, -5) Flusso di Cassa I3 a4 = (1, -3, -2) Flusso di Cassa I4 a5 = (-3, 4, 1) Flusso di Cassa I5
Esempio
Il rilassamento lineare si scrive (att. al cambio di segno sul vincolo di budget)
1 0
5 2
5 2
0 4
3 3
4
2 3
2 4
7 5
3 7
3 max
5 4
3 2
1
5 4
3 2
1
5 4
3 2
1
5 4
3 2
1
≤
≤
≤
− +
+
−
≤
− +
− +
−
≤ +
−
−
−
+ +
+ +
x
x x
x x
x
x x
x x
x
x x
x x
x
x x
x x
x
(PL)
La soluzione ottima di (PL) è:
09 . 23
1 96
. 0 74
. 0 1
67 .
0
* * * **
5 4
3 2
1
=
=
=
=
=
= z
x x
x x
x
Esempio
Consideriamo a questo punto il primo vincolo di budget:
1 0
2 3
2 4
7 5
3 7
3 max
5 4
3 2
1
5 4
3 2
1
≤
≤
≤ +
−
−
−
+ +
+ +
x
x x
x x
x
x x
x x
x
(KP
1)
Effettuiamo un cambio di variabili per ottenere tutti coefficienti positivi nel vincolo di knapsack:
J
-= {2, 3, 4} ⇒ y
i= 1 – x
iper ogni i ∈ J
-.Si ottiene:
6 3
2
4 x
1+ y
2+ y
3+ y
4+ x
5≤
Esempio
Dobbiamo vedere se esiste una cover violata rispetto alla soluzione:
Risolvendo il problema di separazione (slide 40) si individua la cover violata x1 + x5 < 1, che si può aggiungere direttamente alla formulazione, essendo già nelle variabili x.
Osservazione
Se la cover contiene variabili y, bisogna effettuare il cambio di variabile yh = 1-xh prima di aggiungere la disequazione alla formulazione
La nuova soluzione ottima del RL (peraltro intera) è
1 04
. 0 96
. 0 1
26 . 0 74
. 0 1 0
1 1 67
. 0
*
*
*
*
*
5 4
3 2
1
=
=
−
=
=
−
=
=
−
=
=
x y
y y
x
22
1
; 1
; 1
; 1
; 0
*
*
*
* 3
* 2
*
1 4 5
=
=
=
=
=
= z
x x
x x
x
Parte VI:
Formulazioni con un numero di vincoli non
polinomiale
Metodo del Simplesso Dinamico Primale
Il metodo del simplesso può essere usato per risolvere un problema di OC qualora sia nota una
rappresentazione del tipo Ax < b (rappresentazione esterna) dell’involucro convesso dei suoi insiemi
ammissibili conv (S).
Domanda
Abbiamo realmente bisogno di una rappresentazione esterna di conv (S)?
Problema del cammino minimo
Sia G = (V, E) un grafo non orientato.
Dati
Coppia di nodi s, t ∈ V
luv ∈
R
+ ∀ uv ∈ E lunghezza dell’arco uv ProblemaDeterminare un st-cammino di lunghezza totale minima Variabili decisionali
xij = 1 se l’arco ij appartiene al cammino st xij = 0 altrimenti
st-tagli
Un st-taglio è una partizione (X, V-X) dei vertici di G tale che s ∈ X e t ∈ V-X.
L’insieme K di spigoli con un estremo in X e l’altro in V-X si dicono spigoli del taglio. Si dice peso del taglio la somma dei pesi sugli spigoli in K
Esempio
s t
1 2 3
4
5
6 X = {s, 1, 4, 5} V-X = {2, 3, 6, t} K = {12, 34, 46, 56}
Formulazione
E K uv
uv E uv
uv uv
x
taglio st
K x
x l
} 1 , 0 {
un a
ente corrispond
insieme 1
min
∈
−
∀
∑ ≥
∑
∈
∈
• Ciascun vincolo esprime la condizione che almeno uno spigolo di ogni st-taglio deve appartenere al cammino da s a t.
Osservazioni
• Il numero dei vincoli è esponenziale rispetto alla cardinalità di E.
• Sebbene la matrice dei coefficienti non sia TUM, il rilassamento lineare (PL) di (P) fornisce la soluzione ottima del problema intero.
In pratica, il numero di vincoli rende impossibile “scrivere”
le matrici del metodo del simplesso.
Simplesso Dinamico Primale
Idea
Il simplesso dinamico primale acquisisce le informazioni sulla struttura del poliedro attraverso un oracolo di separazione.
Oracolo di separazione
Dato x* ∈ Rn restituisce una disequazione aTi x ≤ bi del sistema Ax ≤ b violata da x* oppure conclude che tutte le disequazioni del sistema Ax ≤ b sono soddisfatte da x*
x
Algoritmo
Supponiamo di voler risolvere il problema (P)
1 0
max
≤
≤
≤ x
b Ax
x c
Tdove A è una matrice (m × n) e b ∈
R
m.Sia D una sottomatrice di A con q << m righe e n colonne. Definiamo il sottoproblema iniziale:
( )
1 0
max
≤
≤
≤ x
d Dx
x
c
TP ~
Algoritmo
(P) è
inammissibile Risolvere il problema ( )P~
È ammissibile? no
si
= soluzione ottima di ( )P~
x
Esiste un vincolo violato?
no soluzione ottima di (P)
x
Si aggiunge il vincolo violato atx ≤ b0 a ( )P~
si
Esempio
s t
2 3
1 4
3
2
1 1
1 1
1
1
Trovare l’st-cammino di lunghezza minima.
Partiamo dalla formulazione:
E uv
x x x
x x
x x
x x
x x
x x
uv t t
s s
t t
s s
∈
∀
≤
≤
≥
+ + ≥
+ +
+ +
+ +
+
1 0
1
1 2
3 min
4 3
2 1
3 4
34 14
23 12
2 1
( ) P ~
Esempio
La soluzione ottima:
0 1
3 34
14 23
12 1
4 2
=
=
=
=
=
=
=
=
t s
t s
x x
x x
x x
x x
Oracolo di separazione
Associamo il peso ad ogni arco uv ∈ E e cerchiamo l’st- taglio di peso minimo.
Se il peso di tale taglio è < 1 allora il vincolo relativo è violato da .
Se il peso di K* è ≥ 1 allora non ci sono disequazioni violate.
x
uvx
Esempio
s t
2 3
1 4
0
1
0 0
0 0
1
0
X = {s, 2}
K* = {s1, 12, 23}
Aggiungiamo al problema ( ) il vincolo e risolviamo di nuovo.
23
1
12
1
+ x + x ≥
x
sP ~
Esempio
La nuova soluzione ottima è:
0 1
3 34
14 23
1
4 12
2
=
=
=
=
=
=
=
=
t s
t s
x x
x x
x
x x
x
s t
2 3
1 4
0
1
0 0
0 1
1
0
X = {s, 1, 2}
K* = {14, 23}