Modelli e algoritmi di ottimizzazione

Transcript

Modelli e algoritmi di ottimizzazione
Algoritmo basato su cancellazione di cicli
Dato un flusso ammissibile iniziale,
si costruisce una sequenza di flussi ammissibili di costo decrescente.
Ciascun flusso è ottenuto dal precedente flusso ammissibile x
ridistribuendo il flusso (che soddisfa i bilanci ai nodi)
mediante un ciclo aumentante C di costo negativo :
la quantità di flusso ridistribuita è pari alla capacità θ(C, x) del ciclo
rispetto al flusso ammissibile x :
il nuovo flusso determinato è un flusso ammissibile di costo inferiore.
L’operazione di far circolare sugli archi di C un flusso pari a θ(C, x)
(= saturare un ciclo aumentante C) è detta “cancellazione del ciclo”
perché tale ciclo non è più aumentante per il flusso x(θ) ;
tale ciclo può però tornare ad essere aumentante
per flussi generati successivamente.
L’algoritmo termina quando non esistono più cicli aumentanti
di costo negativo: il flusso ammissibile corrente è di costo minimo.
Procedure Cancella-Cicli (G, c, b, u, x, caso) :
begin
if Flusso -Ammissibile(G, c, b, u, x)
then begin
while Trova-Ciclo (G, c, u, x, C, θ) do
Cambia-Flusso (x, C, θ) ;
caso := “ottimo”
end
else caso := “vuoto”
end.
Determinazione di un flusso ammissibile iniziale
(procedura Flusso-Ammissibile)
Si risolve un problema di
flusso massimo
con più sorgenti j ∈ S e più pozzi i ∈ T
aventi capacità finita uj = − bj , j ∈ S , e ui = bi , i ∈ T
si determina cioè la massima quantità di flusso
che può essere immessa nella (prelevata dalla) rete
Ciò è fatto determinando il MF sul grafo ampliato G’ = (N’, A’)
• N’ = N ∪ {s, t}
s e t sono la “super-sorgente” ed il “super-pozzo”
• A’ = A ∪ {(s, j) : j ∈ S} ∪ {(i, t) : i ∈ T}
gli archi che collegano la “super-sorgente” ai nodi di S = {j : bj < 0}
hanno capacità usj = – bj ;
gli archi che collegano i nodi di T = {i : bi > 0} al “super-pozzo”
hanno capacità uit = bi ;
Se il flusso massimo “satura” tutte le sorgenti (tutti gli archi (s, j))
e, di conseguenza, tutti i pozzi (tutti gli archi (i, t)),
allora il flusso è ammissibile per il problema del flusso di costo minimo ;
altrimenti non esistono flussi ammissibili
La procedura Flusso-Ammissibile restituisce
vero ed il flusso x , se esiste un flusso ammissibile
falso ,
altrimenti
Determinazione di un ciclo di costo negativo
aumentante rispetto al flusso ammissibile x
(procedura Trova-Ciclo)
Determinare un ciclo aumentante di costo negativo in G rispetto ad x
è equivalente
a determinare un ciclo orientato e di costo negativo nel grafo residuo G(x)
Si utilizza l’algoritmo SPT.L in cui Q è implementato come fila
per determinare sul grafo residuo G(x)
l’albero dei cammini minimi con insieme di radici R = N :
si considera, cioè, il grafo residuo ampliato G’(x), ottenuto aggiungendo
• una radice fittizia r
• un arco (r, j), di costo crj = 0, per ogni nodo j ∈ N
In assenza di cicli negativi, l’algoritmo SPT.L con Q gestito come fila
non può estrarre lo stesso nodo da Q più di n – 1 volte :
si conta perciò il numero di estrazioni da Q di ciascun nodo.
Se un nodo viene estratto per l’n-esima volta,
quel nodo appartiene ad un ciclo negativo,
che viene individuato per mezzo del vettore p dei predecessori ,
percorrendo il ciclo all’indietro a partire dal nodo estratto n volte.
Se, invece, SPT.L con Q implementato come fila
determina un albero dei cammini minimi,
si ha la prova che il flusso x è ottimo.
Determinazione di un ciclo di costo negativo
aumentante rispetto al flusso ammissibile x
(procedura Trova-Ciclo)
in questo caso restituisce vero ed il ciclo individuato C,
con il suo verso e la sua capacità θ = θ(C, x),
altrimenti restituisce falso.
È dimostrato che il problema di determinare
un ciclo aumentante di costo negativo in G rispetto ad x
è equivalente al problema di determinare
un ciclo orientato e di costo negativo in Gx.
Il problema diventa:
come determinare un ciclo orientato e di costo negativo in Gx ?
La procedura Trova-Ciclo restituisce
vero e il ciclo C con il suo verso e la sua capacità θ = θ(C, x),
se il ciclo negativo aumentante esiste
falso , altrimenti
Una volta determinato il ciclo C ed il valore θ,
la procedura Cambia-Flusso costruisce il nuovo flusso x(θ) = x ⊕ θ C.
L’algoritmo basato sulla cancellazione di cicli
è un algoritmo di ricerca locale :
l’intorno di x è dato da tutti i flussi ottenibili da x
inviando flusso lungo un ciclo aumentante semplice.
Risolvere il seguente problema di flusso di costo minimo
con l’algoritmo per cancellazione di cicli
(2
,3
)
2
b1 = – 10
,
(2
1)
bi
i
j
3
(10, 10)
(4, 3)
4
(uij ,cij)
5)
(7, 1)
(10, 10)
1
(6,
)
6
,
(5
b2 = b3 = b4 = 0
5
b5 = 10
0,
(
2,
3)
Una soluzione ammissibile iniziale, facilmente individuabile,
è il seguente flusso ammissibile x1
xij, (uij, cij)
bi i
2
0, (
6, 5
)
0, (7, 1)
b1 = – 10
1
10, (10, 10)
0,
,
(2
0, (4, 3)
1)
4
3
10, (10, 10)
)
6
,
5
(
,
0
Costo del flusso x1 : c13 x13 + c35 x35 = 200
5
b5 = 10
j
determinare un ciclo aumentante di costo negativo in G rispetto ad x1
è equivalente a
determinare un ciclo orientato di costo negativo nel grafo residuo G(x1) :
bi
(2
,3
)
2
b1 = – 10
1
(6,
(uij’, cij’)
i
5)
(7, 1)
(10, –10)
3
(10, –10)
,
(2
1)
(4, 3)
4
)
6
,
(5
5
b5 = 10
j
(2
,3
)
2
b1 = – 10
1
(6,
5)
bi
i
(uij’, cij’)
j
(7, 1)
(10, –10)
3
(10, –10)
5
b5 = 10
,
(2
1)
(4, 3)
)
6
,
(5
4
Costo c(C) del ciclo C : costo dell’invio di un’unità di flusso lungo C
c(C ) =
c
∑
( )
i , j ∈C
ij
= 1 + 6 − 10 − 10 = −13
Capacità θ(C, x1) del ciclo C rispetto al flusso x1 :
min {2, 5, 10, 10} = 2
Il nuovo flusso ammissibile x2 è
0,
(
2,
3)
2
b1 = – 10
1
0, (7, 1)
8, (10, 10)
2,
,
(2
0, (4, 3)
1)
4
0, (
6, 5
)
3
bi
8, (10, 10)
)
5
,
5
(
,
2
Costo del flusso x2 : 200 – 13 · 2 = 174
xij, (uij, cij)
i
5
b5 = 10
j
? = esiste in G un ciclo aumentante rispetto ad x2 di costo negativo ?
Per rispondere a questa domanda cerchiamo
un ciclo orientato di costo negativo nel grafo residuo G(x2) :
(2
,3
)
2
b1 = – 10
(6,
i
5)
(7, 1)
(2, 10)
(8, –10)
1
bi
(uij’, cij’)
(2
,–
(4, 3)
1)
4
3
(2, 10)
(8, –10)
)
6
,
(3 6)
–
,
2
(
5
b5 = 10
j
(2
,3
)
2
b1 = – 10
5)
bi
i
j
(7, 1)
(2, 10)
(8, –10)
1
(6,
(uij’, cij’)
(2
,–
(4, 3)
1)
4
3
(2, 10)
(8, –10)
5
b5 = 10
)
6
,
(3
)
6
–
(2,
Costo c(C) del ciclo C : costo dell’invio di un’unità di flusso lungo C
c(C ) =
c
∑
( )
i , j ∈C
ij
= 3 + 6 − 10 = −1
Capacità θ(C, x2) del ciclo C rispetto al flusso x2 :
min {8, 4, 3} = 3
Il nuovo flusso ammissibile x3 è
0,
(
2,
3)
2
b1 = – 10
1
0, (7, 1)
8, (10, 10)
2,
,
(2
3, (4, 3)
1)
4
0, (
6, 5
)
3
bi
5, (10, 10)
)
6
,
5
(
,
5
Costo del flusso x3 : 174 – 1 · 3 = 171
xij, (uij, cij)
i
5
b5 = 10
j
? = esiste in G un ciclo aumentante rispetto ad x3 di costo negativo ?
Cerchiamo un ciclo orientato di costo negativo nel grafo residuo G(x3) :
bi
(2
,3
)
2
(2, 10)
(8, –10)
(2
1)
(3,
,–
–3
)
3
3)
1
i
5)
(7, 1)
(1,
b1 = – 10
(6,
(uij’, cij’)
4
(5, 10)
(5, –10)
)
6
–
(5,
5
b5 = 10
j
(2
,3
)
2
(2, 10)
(8, –10)
(5, 10)
(5, –10)
3
(2
(3,
1)
(1,
,–
–3
)
1
5)
bi
i
(uij’, cij’)
j
(7, 1)
3)
b1 = – 10
(6,
4
5
b5 = 10
)
6
–
(5,
Costo c(C) del ciclo C : costo dell’invio di un’unità di flusso lungo C
c(C ) =
c
∑
( )
i , j ∈C
ij
= 3 + 5 − 10 − 10 = −12
Capacità θ(C, x3) del ciclo C rispetto al flusso x3 :
min {2, 6, 5, 8} = 2
Il nuovo flusso ammissibile x4 è
2,
(
2,
3)
2
b1 = – 10
1
0, (7, 1)
6, (10, 10)
2,
,
(2
3, (4, 3)
1)
4
2, (
6, 5
)
3
bi
3, (10, 10)
)
6
,
5
(
,
5
Costo del flusso x4 : 171 – 12 · 2 = 147
xij, (uij, cij)
i
5
b5 = 10
j
? = esiste in G un ciclo aumentante rispetto ad x4 di costo negativo ?
Cerchiamo un ciclo orientato di costo negativo nel grafo residuo G(x4) :
(2
,–
3)
2
(7, 1)
(4, 10)
(6, –10)
1)
(3,
,–
–3
)
(2
4
–5)
3
3)
1
(1,
b1 = – 10
(2 ,
(4,
5)
(7, 10)
(3, –10)
)
6
–
(5,
bi
5
i
(uij’, cij’)
b5 = 10
j
(2
,–
3)
2
(7, 1)
(4, 10)
(6, –10)
–5)
3
1)
(3,
,–
(1,
(2
–3
)
1
3)
b1 = – 10
(2 ,
(4,
4
5)
(7, 10)
(3, –10)
bi
5
i
(uij’, cij’)
j
b5 = 10
)
6
–
(5,
Costo c(C) del ciclo C : costo dell’invio di un’unità di flusso lungo C
c(C ) =
c
∑
( )
i , j ∈C
ij
= −10 + 1 + 5 = −4
Capacità θ(C, x4) del ciclo C rispetto al flusso x4 :
min {4, 3, 7} = 3
Il nuovo flusso ammissibile x5 è
2,
(
2,
3)
2
b1 = – 10
1
3, (7, 1)
6, (10, 10)
2,
,
(2
3, (4, 3)
1)
4
5, (
6, 5
)
3
bi
0, (10, 10)
)
6
,
5
(
,
5
Costo del flusso x5 : 147 – 4 · 3 = 135
xij, (uij, cij)
i
5
b5 = 10
j
? = esiste in G un ciclo aumentante rispetto ad x5 di costo negativo ?
Cerchiamo un ciclo orientato di costo negativo nel grafo residuo G(x5) :
(2
,–
(4, 10)
(6, –10)
(2
1)
(3,
,–
–3
)
3
3)
1
(1,
(5 ,
(1,
b1 = – 10
–1)
(3,
1)
(4,
3)
2
4
5)
bi
i
(uij’, cij’)
–5)
(10, 10)
)
6
–
(5,
5
b5 = 10
j
(4, 10)
(6, –10)
1)
(3,
,–
(1,
(2
4
5)
bi
i
(uij’, cij’)
–5)
(10, 10)
3
–3
)
1
(1,
(5 ,
3)
b1 = – 10
–1)
(3,
1)
(4,
(2
,–
3)
2
5
b5 = 10
)
6
–
(5,
Costo c(C) del ciclo C : costo dell’invio di un’unità di flusso lungo C
c(C ) =
c
∑
( )
i , j ∈C
ij
= 5 − 6 − 3 + 1 = −3
Capacità θ(C, x5) del ciclo C rispetto al flusso x5 :
min {1, 5, 3, 4} = 1
j
Il nuovo flusso ammissibile x6 è
2,
(
2,
3)
2
b1 = – 10
1
4, (7, 1)
6, (10, 10)
2,
,
(2
2, (4, 3)
1)
4
6, (
6, 5
)
3
bi
0, (10, 10)
)
6
,
5
(
,
4
Costo del flusso x6 : 135 – 3 · 1 = 132
xij, (uij, cij)
i
5
b5 = 10
j
? = esiste in G un ciclo aumentante rispetto ad x6 di costo negativo ?
Cerchiamo un ciclo orientato di costo negativo nel grafo residuo G(x6) :
(2
,–
(6 ,
(4, 10)
(6, –10)
(2
1)
(2,
,–
–3
)
3
3)
1
(2,
b1 = – 10
bi
–1)
(4,
1)
(3,
3)
2
4
i
(uij’, cij’)
–5)
(10, 10)
)
6
,
(1 6)
–
,
4
(
5
b5 = 10
j
L’algoritmo di Bellman determina su G(x) un albero dei cammini minimi,
anziché un ciclo orientato di costo negativo :
2
d2 = – 8
–1
–3
1
d1 = – 19
10
–10
1
–5
d3 = – 9
3
10
5
d5 = 0
–1
–3
3
6
d4 = – 6 4
–6
Non esistendo cicli orientati di costo negativo su G(x),
non esistono cicli aumentanti rispetto ad x di costo negativo su G,
quindi il flusso x è un flusso di costo minimo.
Problemi di accoppiamento
Dati :
G = ( O ∪ D , A ) : grafo bipartito non orientato
bipartito: l’insieme dei nodi è partizionato in due sottoinsiemi
•
O = { 1,…, n } : insieme dei nodi origine
D = { n + 1,…, n + d } : insieme dei nodi destinazione
si può supporre, senza perdita di generalità, che n ≤ d :
infatti, essendo il grafo non orientato, se n > d
è sufficiente scambiare tra loro i ruoli dei nodi.
•
A ⊆ O × D, con | A | = m : insieme degli archi
cij : costo di attraversamento dell’arco (i, j) ∈ A
(non presente nel problema di accoppiamento di massima cardinalità)
Esempio
O = {1,…, 4}
D = {5,…, 8}
A = { (1, 5), (1, 6), (1, 8), (2, 5), (2, 8), (3, 6), (4, 6), (4, 7), (4, 8) }
1
5
2
6
3
7
4
8
Convenzione: nell’arco non orientato (i, j) i ∈ O e j ∈ D
Accoppiamento (matching) M :
sottoinsieme di archi (M ⊆ A) che non hanno nodi in comune
(su ogni nodo incide al più un arco di M )
Rispetto ad un accoppiamento M
•
l’arco (i, j) è detto interno se (i, j) ∈ M
•
l’arco (i, j) è detto esterno se (i, j) ∈ A \ M
•
un nodo si dice accoppiato se su esso incide un arco di M
•
un nodo si dice esposto se su esso non incide alcun arco di M
OM ( ⊆ O) : insieme dei nodi origine esposti
DM ( ⊆ D) : insieme dei nodi destinazione esposti
Cardinalità dell’accoppiamento M ( | M | ) :
è il numero degli archi appartenenti a M
Se | O | = | D | (n = d),
si dice accoppiamento perfetto (o assegnamento)
l’accoppiamento M in cui nessun nodo è esposto (| M | = n)
Accoppiamento :
M = { (1, 5), (3, 6), (4, 7) }
1
5
2
6
3
7
4
8
OM = { 2 }
DM = { 8 }
1
5
2
6
3
7
4
8
Assegnamento (accoppiamento perfetto)
M = {(1, 8), (2, 5), (3, 6), (4, 7) }
OM = DM = ∅
In presenza di costi di attraversamento degli agli archi, si definisce
Costo C(M) dell’accoppiamento M : somma dei costi degli archi di M
Se M = ∅ , si pone per definizione C(M) = 0
In un accoppiamento M (≠ ∅ ) :
arco bottleneck di M : arco (i, j) ∈ M di costo massimo
valore bottleneck di M : valore V(M) = max { cij : (i, j) ∈ M }
Considereremo i seguenti problemi:
•
accoppiamento di massima cardinalità :
determinare un accoppiamento di massima cardinalità in G
•
assegnamento di costo minimo :
determinare un accoppiamento perfetto di costo minimo
in G con | O | = | D |
•
accoppiamento di massima cardinalità bottleneck :
determinare un accoppiamento di massima cardinalità in G
che abbia valore bottleneck minimo
(ossia che minimizzi il valore bottleneck di M)
Accoppiamento di massima cardinalità
Equivalente al problema di flusso massimo con più sorgenti e più pozzi
r
r
sul grafo orientato G = N , A ottenuto da G
(
)
assegnando l’orientamento da i a j
all’arco non orientato (i, j) ∈ A (i ∈O e j ∈D)
(
r
r
grafo G = N , A
grafo G = (N, A)
)
1
5
1
5
2
6
2
6
3
7
3
7
4
8
4
8
r
Dati del problema di flusso massimo con più sorgenti e pozzi su G
• sorgenti: nodi dell’insieme O ( bi = –1 , i ∈ O )
• pozzi: nodi dell’insieme D ( bj = 1 , j ∈ D )
• ogni arco (i, j) ha capacità superiore uij = 1
–1
–1
–1
1
1
2
1
1
1
1
6
1
7
1
8
1
1
1
3
1
1
–1
5
4
1
Equivalente al problema di flusso massimo da s a t
r
r
sul grafo orientato ampliato G ' = N ' , A' dove
(
N ' = N U { s, t
(
}
e
)
)
r r
A' = A U { (s, i ) ∀i ∈ O,
( j, t ) ∀j ∈ D }
(
)
r
r
r
r
ossia G ' = N ' , A' è ottenuto dal grafo orientato G = N , A aggiungendo
• una “super sorgente” s,
collegata a tutti i nodi i di O da archi di capacità unitaria usi = 1
• un “super pozzo” t
collegato a tutti i nodi di D da archi di capacità unitaria ujt = 1
(
r
r
grafo G ' = N ' , A'
)
1
5
2
6
s
uij = 1
∀(i, j) ∈ A
usi = 1
∀i ∈ O
ujt = 1
∀j ∈ D
t
3
7
4
8
Il problema dell’accoppiamento di massima cardinalità in G
r
può essere risolto calcolando il MF (con più sorgenti e pozzi) in G
perché
•
r
l’insieme degli archi saturi in un flusso ammissibile (intero) x in G
forma un accoppiamento M in G
di cardinalità pari al valore v del flusso
•
da un accoppiamento M si costruisce un flusso ammissibile
r
grafo G '
grafo G
con flusso ammissibile di valore v = 3
con accoppiamento M, | M | = 3
1
5
1
5
2
6
2
6
s
t
3
7
3
7
4
8
4
8
r
Corrispondenza biunivoca tra cammini aumentanti su G
e cammini alternanti aumentanti su G
Un cammino alternante aumentante su G è un cammino che
• parte da un’origine esposta
• termina in una destinazione esposta
Poiché in G non esistono archi che collegano
coppie di nodi origine o coppie di nodi destinazione,
i nodi di un cammino su G appartengono alternativamente a O e a D :
r
per andare da un nodo in O ad un nodo in D si percorre un arco vuoto in G
(non appartenente ad M in G)
r
per andare da un nodo in D ad un nodo in O si percorre un arco saturo inG
(appartenente ad M in G)
r
Quindi un cammino aumentante su G rispetto al flusso x
corrisponde ad un cammino
formato da archi esterni ed archi interni rispetto all’accoppiamento M,
detto cammino alternante aumentante su G rispetto ad M.
Un cammino alternante P su G è aumentante se, detti
• PE = P \ M l’insieme degli archi esterni di P
• PI = M ∩ P l’insieme degli archi interni di P
si ha | PE | − | PI | = 1,
ossia gli archi esterni sono esattamente uno in più di quelli interni.
grafo G
con accoppiamento M
1
5
r
Grafo G con flusso x
1
1
5
1
2
6
2
6
3
7
3
7
4
8
4
origine esposta : nodo 3
destinazione esposta : nodo 7
1
8
archi sottili : vuoti (xij = 0)
archi in grassetto : saturi (xij = 1)
r
Grafo G con flusso x
1
r
Grafo residuo G ( x )
associato al flusso x
5
1
5
2
6
2
6
3
7
3
7
8
4
8
1
1
4
1
archi sottili : vuoti (xij = 0)
archi in grassetto : saturi (xij = 1)
cammino aumentante
r
sul grafo residuo G ( x )
associato al flusso x
1
2
3
4
5
6
7
8
cammino alternante aumentante su G
rispetto all’accoppiamento M
1
5
2
6
3
7
4
8
La capacità di un cammino (alternante) aumentante è sempre 1
(non deve essere calcolata)
r
Detti P’ un cammino aumentante su G
e P il corrispondente cammino alternante aumentante su G
l’operazione di composizione x’ = x ⊕ P’
corrisponde a M’ := M ⊕ P = (M \ PI) ∪ PE
ossia a togliere da M gli archi interni di P ed aggiungere quelli esterni di P
Siccome |PE| = |PI | + 1, si ha che | M ⊕ P | = | M | + 1
(e ciò corrisponde al fatto che il nuovo flusso x’ ha valore v’ = v + 1)
Applicando l’operazione di composizione M ⊕ P all’accoppiamento
M = {(1, 6), (2, 5), (4, 8)}
e al cammino alternante aumentante
P = {(3, 6), (6, 1), (1, 5), (5, 2), (2, 8), (8, 4), (4, 7) }
si ottiene il nuovo accoppiamento M’ = {(1, 5), (2, 8), (3, 6), (4, 7)}
che corrisponde al flusso che si ottiene dal flusso x associato ad M
inviando un’unità di flusso lungo il cammino aumentante P’
corrispondente a P
Sulla base di queste osservazioni si costruisce una versione specializzata
dell’algoritmo Cammini-Aumentanti
per risolvere il problema dell’accoppiamento di massima cardinalità
Algoritmo Accoppiamento-MaxCard
Procedure Accoppiamento-MaxCard(O, D, A, M) :
begin
M := ∅ ;
while Cammino-Aumentante(O, D, A, M, P) do
Cambia-Accoppiamento(M, P)
end.
Inizializzazione : M := ∅ (corrisponde al flusso iniziale x = 0)
Procedura Cammino-Aumentante :
determina, se esiste, un cammino alternante aumentante su G
rispetto all’accoppiamento M
si effettua una visita del grafo bipartito G che parte dai nodi di OM
e visita alternativamente archi esterni e interni :
alla fine della visita
• non si è raggiunto alcun nodo in DM :
non esistono cammini aumentanti
e l’accoppiamento M è di massima cardinalità:
(ciò accade sicuramente quando OM = ∅ , ossia
un accoppiamento di massima cardinalità è già stato prodotto)
Se invece viene determinato un cammino alternante aumentante P,
viene invocata la procedura Cambia-Accoppiamento
che realizza l’operazione di composizione M ⊕ P;
tale operazione è analoga alla Aumenta-Flusso
dell’algoritmo Cammini-Aumentanti, anche se più semplice.
Complessità di Accoppiamento-MaxCard
È O(mn), qualunque sia il modo in cui è implementata la visita : infatti
• complessità della generica procedura Cammini-Aumentanti : O(mnU)
• in questo caso U = 1
In effetti, è immediato verificare
che la procedura termina dopo al più n iterazioni,
ognuna delle quali richiede una visita del grafo e quindi costa O(m).
Assegnamento a costo minimo
r
Equivalente al problema di flusso di costo minimo sul grafo orientato G
con i seguenti dati :
• ogni nodo in O immette un’unità di flusso
• ogni nodo in D preleva un’unità di flusso
• le capacità degli archi sono unitarie
• i costi degli archi sono quelli del problema di assegnamento
Trasformazione in un problema di MCF
1
2
6
1
3
−1
1
−1
4
1,
2 1,
6
1,
1
6
7
−1
8
−1
5
1
6
1
3 1
,7
7
1
8
1
1,
5
4
1, 2
1, 3
5
7
5
2
1,
4
2
3
2
4
4
1, 4
È possibile specializzare gli algoritmi per il problema MCF
al caso particolare del problema dell’assegnamento di costo minimo.
Il cammino di costo minimo, aumentante rispetto allo pseudoflusso x,
da un nodo con eccesso di flusso ad un nodo con difetto di flusso
determinato dall’algoritmo dei cammini minimi successivi
corrisponde, nel problema dell’assegnamento di costo minimo,
a determinare il cammino alternante aumentante di costo minimo
rispetto all’accoppiamento corrente M
Per fare questo si utilizza il grafo ausiliario GM = (N, AM) con
AM = { (j, i) : (i, j) ∈ M } ∪ { (i, j) : (i, j) ∈ A\M }
dove agli archi di GM sono associati i costi
⎧ cij
cij′ = ⎨
⎩− cij
se (i, j ) ∈ A \ M
se ( j , i ) ∈ M
r
GM è il grafo residuo G ( x )
per lo pseudoflusso x corrispondente all’accoppiamento M
Un cammino orientato Pst da un nodo s ∈ OM ad un nodo t ∈ DM
corrisponde ad un cammino alternante aumentante P e viceversa;
per costruzione, il costo C’(Pst) di Pst in GM è uguale al costo C(P) di P
C (P ) =
c
∑
( )
i , j ∈PE
ij
−
c
∑
( )
i , j ∈PI
ij
Inviare un’unità di flusso lungo un cammino aumentante
corrisponde ad applicare l’operazione di composizione M’ = M ⊕ P :
è facile verificare che risulta C(M’) = C(M) + C(P).
Procedure Assegnamento-MinCost(O, D, A, c, M) :
begin
M=∅ ;
while Cammino-AA-Minimo(GM, P) do
Cambia-Accoppiamento(M, P, OM, DM, GM)
end.
Inizializzazione : M = ∅ (accoppiamento iniziale vuoto)
corrisponde al flusso iniziale x = 0 che è sicuramente minimale
perché il grafo residuo, essendo bipartito,
non contiene cicli orientati nemmeno in presenza di costi negativi.
Procedura Cammino-AA-Minimo :
cerca di determinare un cammino alternante aumentante di costo minimo
tra un nodo s ∈ OM ed un nodo t ∈ DM :
costruisce un albero di cammini minimi
con insieme di nodi radice OM per GM,
col relativo vettore di etichette d
e seleziona un nodo t ∈ DM
(ad esempio, quello con etichetta dt minore)
Cammino-AA-Minimo restituisce
vero se ha determinato il cammino desiderato
falso se OM = ∅ (non esistono nodi esposti in O)
se ∀t ∈ OM dt = ∞ (t non è connesso ad alcun nodo di OM )
Procedura Cambia-Accoppiamento :
•
esegue l’operazione di composizione
tra l’accoppiamento M corrente ed il cammino P
•
aggiorna gli insiemi dei nodi esposti, OM e DM ,
ed il grafo ausiliario GM associato al nuovo accoppiamento.
Quando l’algoritmo termina, se | M | = | O | = | D |
allora si è determinato un assegnamento di costo minimo,
altrimenti non esistono accoppiamenti perfetti in G.
accoppiamento M corrente
1
4
2
2
3
2
6
1
3
7
5
corrispondente grafo ausiliario GM
1
4
6
2
5
6
6
−1
7
3
7
7
5
5
4
−2
3
2
4
8
4
4
8
L’albero dei cammini minimi con insieme di radici R = OM = { 3, 4 },
con le relative etichette ottime ai nodi, è
5
1
4
3
2
−2
3
2
5
cammini minimi :
6
6
7
5
{ (4, 6) }
−1
0
3
7
{ (4, 8), (8, 2), (2, 5) }
7
7
{ (4, 8), (8, 2), (2, 5), (5, 1), (1, 7) }
{ (4, 8) }
5
0
4
4
8
4
Essendo DM = {6, 7}, si pone t = 6 poiché d(6) = 5 < 7 = d(7),
selezionando così il cammino alternante aumentante P = { (4, 6) }
Nuovo accoppiamento M’ = M ⊕ P = {(1, 5), (2, 8), (4, 6)},
di cardinalità 3
e costo C(M’) = C(M) + C(P) = 3 + 5 = 8
1
4
2
2
3
2
6
1
3
7
5
6
7
5
4
4
8
grafo ausiliario GM’ corrispondente all’accoppiamento M’
−2
3
2
1
4
2
5
6
6
−1
3
7
7
−5
4
4
8
Albero dei cammini minimi
8
1
4
6
2
−2
3
2
5
cammini minimi :
6
6
10
11 { (3, 8), (8, 2), (2, 5) }
−1
0
3
7
{ (3, 8), (8, 2), (2, 5), (5, 1), (1, 6) }
7
10 { (3, 8), (8, 2), (2, 5), (5, 1), (1, 7) }
{ (3, 8) }
5
6
4
4
8
7
Essendo DM = { 7 }, il cammino alternante aumentante di costo minimo è
P’ = {(3, 8), (2, 8), (2, 5), (1, 5), (1, 7)}, con C(P’) = d(7) = 10
M” = M’ ⊕ P’ =
= {(1, 5), (2, 8), (4, 6)} \ {(2, 8), (1, 5)} ∪ {(3, 8), (2, 5), (1, 7)}
= {(1, 7), (2, 5), (3, 8), (4, 6)}
di costo C(M”) = C(M’) + c(P’) = 8 +10 = 18
1
4
2
2
3
2
6
1
3
7
5
6
7
5
4
4
Assegnamento ottimo
8
Correttezza di Assegnamento-MinCost :
deriva direttamente dalla correttezza
della procedura Cammini-Minimi-Successivi
per il problema del flusso di costo minimo
Complessità di Assegnamento-MinCost :
O(mn2), dove n è il massimo numero di iterazioni,
se Cammino-AA-Minimo è implementata utilizzando
l’algoritmo SPT.L in cui Q è implementato come fila