Problemi di Network Flow - Massimo Paolucci
Problemi di Network Flow - Massimo Paolucci
Problemi di Network Flow - Massimo Paolucci
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Problemi</strong> <strong>di</strong><br />
<strong>Network</strong> <strong>Flow</strong><br />
<strong>Massimo</strong> <strong>Paolucci</strong><br />
(paolucci@<strong>di</strong>st.unige.it)<br />
DIST – Università <strong>di</strong> Genova<br />
Grafi <strong>di</strong> Flusso - <strong>Network</strong> <strong>Flow</strong><br />
2<br />
I modelli <strong>di</strong> flusso (reti <strong>di</strong> flusso) sono utilizzati per prendere<br />
decisioni in vari contesti applicativi, e.g.:<br />
• sistemi <strong>di</strong> telecomunicazioni<br />
• trasporti<br />
• sistemi idraulici e/o sistemi meccanici<br />
Attraverso modelli <strong>di</strong> network flow si possono affrontare<br />
anche problemi in cui non “esiste” un vero e proprio flusso,<br />
e.g.:<br />
• problemi <strong>di</strong> percorso minimo<br />
• problemi <strong>di</strong> assegnazione<br />
• problemi <strong>di</strong> scheduling<br />
• problemi <strong>di</strong> pianificazione
Grafi <strong>di</strong> Flusso - <strong>Network</strong> <strong>Flow</strong><br />
3<br />
Dato un grafo G=(V, E) orientato con definite le seguenti<br />
grandezze:<br />
• d ij ∀(i, j)∈E capacità dell’arco (i, j)<br />
• w ij ∀(i, j)∈E costo del flusso in (i, j)<br />
• b i ∀i∈V flusso nel nodo i, dove:<br />
– b i >0 ⇒ sorgente<br />
– b i
Grafi <strong>di</strong> Flusso - <strong>Network</strong> <strong>Flow</strong><br />
5<br />
Un flusso a costo minimo in G:<br />
x ij ∈R ∀(i, j)∈E taleche<br />
min ∑ wijxij<br />
(i,j) ∈E<br />
s.t. (1) e<br />
(2)<br />
Caso particolare:<br />
il problema del trasporto<br />
G=(V 1 ∪V 2 , E) bipartito e tale che b i >0 ∀i∈V 1 e b i
Grafi <strong>di</strong> Flusso - Max <strong>Flow</strong> e Min Cut<br />
7<br />
Il Max <strong>Flow</strong> si puo’ formulare come problema lineare<br />
• b i =0 ∀i∈V\{s,t}<br />
• w ij =0 ∀(i,j)∈E (i,j)≠(t,s)<br />
• w ts =-1<br />
• Detto v il flusso da s a t:<br />
v<br />
=<br />
∑<br />
x<br />
=<br />
∑ x =<br />
si<br />
(s,i) ∈ δ<br />
+<br />
(s) (i,t) ∈δ<br />
−<br />
(t)<br />
it<br />
x<br />
ts<br />
Grafi <strong>di</strong> Flusso - Max <strong>Flow</strong> e Min Cut<br />
8<br />
Il Max <strong>Flow</strong> si puo’ formulare come problema lineare<br />
Il problema del Max <strong>Flow</strong><br />
max v<br />
s.t.<br />
∑ xij<br />
(i,j) ∈δ<br />
+<br />
(i)<br />
0 ≤ xij<br />
≤ <strong>di</strong>j<br />
− ∑ x ji<br />
(j,i) ∈δ<br />
−<br />
(i)<br />
∀(i,j)<br />
∈E<br />
=<br />
⎧v<br />
⎪<br />
⎨0<br />
⎪<br />
⎩−<br />
v<br />
i =<br />
i ≠<br />
i =<br />
s<br />
s,i ≠<br />
t<br />
t
Grafi <strong>di</strong> Flusso - Max <strong>Flow</strong> e Min Cut<br />
9<br />
Il Max <strong>Flow</strong> è strettamente legato al Min Cut<br />
• Taglio (Cut)<br />
Un taglio (U,U’) è una partizione <strong>di</strong> V<br />
• s-t cut<br />
L’insieme degli archi δ + (U)={(i,j)∈E, i∈U, j∈U’} dove<br />
s∈U e t∈U’.<br />
Grafi <strong>di</strong> Flusso - Max <strong>Flow</strong> e Min Cut<br />
10<br />
Un esempio <strong>di</strong> s-t cut<br />
s<br />
t<br />
s-t cut<br />
• Capacità del taglio ∑ <strong>di</strong>j<br />
( i,j) ∈ δ + (U)
Grafi <strong>di</strong> Flusso - Max <strong>Flow</strong> e Min Cut<br />
11<br />
Il problema del taglio minimo<br />
Trovare il s-t cut a minima capacità.<br />
Teorema (Max <strong>Flow</strong> - Min Cut)<br />
IL valore del flusso massimo da s a t è pari al flusso che<br />
può passare per il taglio minimo che separa s da t.<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
12<br />
Si basa sul concetto <strong>di</strong> cammino aumentante (augmenting<br />
path) rispetto ad un flusso x.<br />
i<br />
(x ij , d ij )<br />
j<br />
Esempio<br />
(2,2)<br />
(1,3)<br />
2<br />
(1,4)<br />
4<br />
(1,1)<br />
s<br />
1<br />
(0,4)<br />
6<br />
t<br />
(2,8)<br />
3<br />
(2,2)<br />
5<br />
(3,5)
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
13<br />
Definiamo: Arco saturato<br />
Dato x, (i,j)∈E è saturato se x ij =d ij<br />
• Se P è un s-t path senza archi saturati allora posto:<br />
min (<strong>di</strong>j<br />
(i,j) ∈P<br />
−<br />
x ij )<br />
=<br />
∆<br />
il flusso x non è massimo ma può essere aumentato <strong>di</strong> ∆.<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
14<br />
Se non esistono s-t path senza archi saturati allora x è un<br />
blocking flow.<br />
Nota: un blocking flow può non essere massimo<br />
Esempio<br />
s<br />
1<br />
+1 +1 -1<br />
3 4<br />
+1 +1<br />
2 5 6<br />
t<br />
Un’unità <strong>di</strong> flusso è rimandata da 4 a 2 (per poi proseguire<br />
verso 5).
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
15<br />
Cammino aumentante rispetto ad un flusso x<br />
Dato x si definisce un grafo orientato D(x)=(V, E(x)) tale che<br />
E(x) = {(i,j): (i,j)∈E, x ij 0}<br />
= E f (x) ∪ E r (x)<br />
dove E f (x) è l’insieme degli archi “forward”mentre E r (x) è<br />
l’insieme degli archi “reverse”.<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
16<br />
Cammino aumentante rispetto ad un flusso x<br />
• Un s-t path in D(x) è un cammino aumentante rispetto a x<br />
• Un flusso ammissibile è massimo se non esiste un<br />
cammino aumentante rispetto a tale flusso.<br />
Esempio: D(x)<br />
2<br />
4<br />
s<br />
1<br />
6<br />
t<br />
3<br />
5<br />
cammino aumentante
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
17<br />
Labelling algorithm<br />
• L’algoritmo del cammino aumentante etichetta ogni<br />
nodo j con (p(j),∆), dove p(j) è il nodo predecessore da<br />
cui si riceve il flusso ∆.<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
18<br />
L’algoritmo del cammino aumentante<br />
1) Inizializzazione<br />
Fissare un flusso ammissibile (e.g., x=0). Etichettare s con<br />
(s, ∞).<br />
Tutti gli altri no<strong>di</strong> i∈V restano non etichettati.<br />
Porre i=s.
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
19<br />
L’algoritmo del cammino aumentante<br />
2) Esame del nodo i<br />
• ∀j∈V tale che (i,j)∈E e x ij 0, j non etichettato, etichettare<br />
j con<br />
(i, min [∆, x ji ])<br />
• marcare il nodo i come nodo esaminato.<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
20<br />
L’algoritmo del cammino aumentante<br />
3) Se il pozzo t è etichettato andare al passo 4.<br />
Scegliere un nodo i etichettato non esaminato ed andare al<br />
passo 2.<br />
Se non esistono no<strong>di</strong> non esaminati il flusso corrente è<br />
massimo.
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
21<br />
L’algoritmo del cammino aumentante<br />
4) Sia (p(j), ∆) l’etichetta <strong>di</strong> t. E’ stato trovato un cammino<br />
aumentante determinato a ritroso sino al nodo s dalla<br />
sequenza dei p(j).<br />
Il nuovo flusso è determinato aumentando <strong>di</strong> +∆ il flusso<br />
sugli archi forward del cammino e <strong>di</strong>minuendolo <strong>di</strong> -∆ sugli<br />
archi reverse.<br />
Eliminare tutte le etichette ed iterare al passo 1.<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
22<br />
L’operazione <strong>di</strong> labelling sugli archi <strong>di</strong> G.<br />
Arco forward (d ij 0)<br />
(p(i), ∆)<br />
i<br />
(x ij , d ij )<br />
j<br />
(i, min [∆, x ji ])
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
23<br />
Un esempio<br />
s<br />
1<br />
(2, 2)<br />
(1, 3)<br />
2<br />
(1, 4)<br />
(0, 4)<br />
4<br />
(1, 1)<br />
6<br />
t<br />
(2, 8)<br />
3<br />
(2, 2)<br />
5<br />
(3, 5)<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
24<br />
Un esempio<br />
esame nodo 1:<br />
(2, 2)<br />
(s,∞) 1<br />
(1, 3)<br />
2<br />
(1, 4)<br />
(0, 4)<br />
4<br />
(1, 1)<br />
6<br />
t<br />
(2, 8)<br />
3<br />
(1,6)<br />
(2, 2)<br />
5<br />
(3, 5)
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
25<br />
Un esempio<br />
esame nodo 3:<br />
(2, 2)<br />
(s,∞) 1<br />
(1, 3)<br />
2<br />
(1, 4)<br />
(0, 4)<br />
4<br />
(3,4)<br />
(1, 1)<br />
6<br />
t<br />
(2, 8)<br />
3<br />
(1,6)<br />
(2, 2)<br />
5<br />
(3, 5)<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
26<br />
Un esempio<br />
esame nodo 4:<br />
(2, 2)<br />
(s,∞) 1<br />
(4,1)<br />
(1, 3)<br />
2<br />
(1, 4)<br />
(0, 4)<br />
(3,4)<br />
4<br />
(1, 1)<br />
6<br />
t<br />
(2, 8)<br />
3<br />
(1,6)<br />
(2, 2)<br />
5<br />
(3, 5)
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
27<br />
Un esempio<br />
esame nodo 2:<br />
(2, 2)<br />
(s,∞) 1<br />
(4,1)<br />
(1, 3)<br />
2<br />
(1, 4)<br />
(0, 4)<br />
(3,4)<br />
4<br />
(1, 1)<br />
6<br />
t<br />
(2, 8)<br />
3<br />
(1,6)<br />
(2, 2)<br />
5<br />
(2,1)<br />
(3, 5)<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
28<br />
Un esempio<br />
esame nodo 5:<br />
(2, 2)<br />
(s,∞) 1<br />
(4,1)<br />
(1, 3)<br />
2<br />
(1, 4)<br />
(0, 4)<br />
(3,4)<br />
4<br />
(1, 1)<br />
6<br />
(5,1)<br />
t<br />
(2, 8)<br />
3<br />
(1,6)<br />
(2, 2)<br />
5<br />
(2,1)<br />
(3, 5)
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
29<br />
Un esempio<br />
L’iterazione termina avendo trovato un cammino<br />
aumentante<br />
Il nuovo flusso<br />
(2, 2)<br />
s 1<br />
(0, 3)<br />
2<br />
(2, 4)<br />
(1, 4)<br />
4<br />
(1, 1)<br />
6<br />
t<br />
(3, 8)<br />
3<br />
(2, 2)<br />
5<br />
(4, 5)<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
30<br />
Un esempio<br />
Inizia una nuova iterazione<br />
esame nodo 1:<br />
(2, 2)<br />
(s,∞) 1<br />
(0, 3)<br />
2<br />
(2, 4)<br />
(1, 4)<br />
4<br />
(1, 1)<br />
6<br />
t<br />
(3, 8)<br />
3<br />
(1,5)<br />
(2, 2)<br />
5<br />
(4, 5)
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
31<br />
Un esempio<br />
esame nodo 3:<br />
(s,∞)<br />
1<br />
(2, 2)<br />
(3, 8)<br />
Non è possibile etichettare alcun altro nodo.<br />
Il flusso trovato è massimo.<br />
2<br />
3<br />
(1,5)<br />
(2, 4)<br />
(1, 4)<br />
(0, 3)<br />
(2, 2)<br />
(3,3)<br />
4<br />
5<br />
(1, 1)<br />
(4, 5)<br />
6<br />
t<br />
Max <strong>Flow</strong> - Algoritmo <strong>di</strong> Ford-Fulkerson<br />
32<br />
Un esempio<br />
• Si può verificare che tale flusso corrisponde al taglio<br />
minimo:<br />
L’algoritmo determina un Min Cut:<br />
U={i∈V nodo esaminato}<br />
U’=V\U<br />
s∈U e t∈U’<br />
Ad esempio: U={1,3,4}<br />
U’={2,5,6}
Max <strong>Flow</strong> - Possibili varianti<br />
33<br />
Max <strong>Flow</strong> tra molte sorgenti e molti pozzi<br />
archi a capacità ∞<br />
archi a capacità ∞<br />
s<br />
t 1<br />
s 1<br />
...<br />
t 2<br />
s 2<br />
t<br />
t 3<br />
Ci si riconduce al caso precedente aggiungendo una<br />
sorgente ed un pozzo fittizi.<br />
Max <strong>Flow</strong> - Possibili varianti<br />
34<br />
Grafi con capacità negli archi e nei no<strong>di</strong><br />
• No<strong>di</strong> con capacità c i . Il flusso entrante deve essere<br />
inferiore della capacità:<br />
∑ xhi<br />
∀(h,i)<br />
∈δ −<br />
(i)<br />
≤<br />
ci<br />
Si aggiungono degli archi fittizi.<br />
arco a capacità c i<br />
c i<br />
i - i +
Max <strong>Flow</strong> - Possibili varianti<br />
35<br />
Grafi con capacità negli archi e nei no<strong>di</strong><br />
• Archi non orientati. Si introduce una coppia <strong>di</strong> archi<br />
orientati<br />
i j i j<br />
• Archi orientati con capacità minima negativa. Si<br />
sostituiscono con una coppia <strong>di</strong> archi orientati con<br />
capacità sempre positiva<br />
i j i j<br />
-c ij ≤ d ij ≤ q ij<br />
0 ≤ d’ ij ≤ q ij<br />
0 ≤ d” ij ≤ c ij