03.01.2015 Views

Problemi di Network Flow - Massimo Paolucci

Problemi di Network Flow - Massimo Paolucci

Problemi di Network Flow - Massimo Paolucci

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!