Sunteți pe pagina 1din 16

Reţele de transport

Algoritmul Ford-Fulkerson
(şi nu numai)
Reţea de transport
(6,3) 6
4

(6,5)
(2,1)
(9,8)

(4,4) (3,2)

(7,6) (7,5)
S 3 V

5
(7,2)

(4,3)
(3,1)

(6,3)

1 2

O reţea de transport G=(U,E), cu sursa s şi destinaţia v, este un graf


orientat în care fiecare muchie (x,y) are o capacitate pozitivă
c(x,y)>0. Dacă (x,y) nu aparţine lui E, vom considera c(x,y)=0.
Noţiunea de flux(6,3) 6
4

(6,5)
(2,1)
(9,8)
(4,4) (3,2)

(7,6) (7,5)
S 3 V
5
(7,2)
(4,3)
(3,1)

c(1, 2)=6
(6,3)
f(1, 2)=3
1 2

• Un flux în G este o funcţie f:UxU→R care are următoarele proprietăţi:


• 0 ≤ f(i,j) ≤ c(i,j) , adică fluxul transportat pe orice arc trebuie să fie
nenegativ şi subcapacitar;
• Σ f(j,i) = Σ f(i,j) , pentru orice nod mai puţin s şi v, adică conservarea
fluxului
Problema fluxului maxim
4 (6,3) 6
Se dă reţeaua G=(U,E) cu
sursa s şi destinaţia v, şi (2,1) (6,5)
(9,8)
funcţia capacitară c. Se (4,4) (3,2)
cere să se determine un
flux de valoare maximă. (7,6) (7,5)
S 3 V
5
(7,2)
(4,3)
(3,1)
Fie un drum în graful suport :
s, 4, 6, 5, v (6,3)

1 2
Arcul 4→6 este arc direct
Arcul 5→6 este arc invers

Fie P un drum şi (i,j) o muchie în P. Se numeşte capacitate reziduală a muchiei


(i, j) numărul:
r(i, j)=c(i, j)-f(i, j) dacă (i, j) este arc direct în P
r(i, j)=f(j, i) dacă (i,j) este arc invers în P
4 (6,3) 6

(2,1) (6,5)
(9,8)
Fie un drum în graful suport : (3,2)
(4,4)
s, 4, 6, 5, v
(7,5)
r(s, 4)=1 , r(4,6)=3 S 3
(7,6)
V
5
r(6, 5)=2 , r(5, v)=2 (7,2)
(4,3)
Capacitatea reziduală e 1 (3,1)

(6,3)

1 2

Se numeşte drum de creştere a fluxului f în reţeaua G, un drum de la s la v care


are capacitatea reziduală mai mare ca zero.

Teorema 1: Un flux f este de valoare maximă într-o reţea G, dacă şi numai dacă,
nu există drumuri de creştere a fluxului f în reţeaua G.

Teorema 2: Dacă toate capacităţile sunt întregi, atunci există un flux de valoare
maximă cu toate componentele întregi.
Istoric
Autor An Complexitate
• Ford Fulkerson 1956
• Edmonds, Karp 1969 O(E2V)
• Dinic 1970 O(EV2)
• Karzanov 1973 O(V3)
• Cherkassky 1976 O(√EV2)
• Malhotra (MPM) 1978 O(V3)
• Galil 1978 O(V5/3E2/3)
• Galil & Naamad 1979 O(EV log2V)
• Sleator &Tarjan 1980 O(EV logV)
• Goldberg & Tarjan 1985 O(EV log(V2/E))

Unde V este numărul de vârfuri, iar E este numărul de


muchii
Algoritmul Ford-Fulkerson
(6,0)
(6, ?) 6
4

(6,0)
(6, ?)
(2,0)
(2, ?)
(9,0)
(9, ?)
(4,0)
(4, ?) (3, ?)
(3,0)

(7,0) (7,0)
(7, ?)
S 3 (7, ?) V

5
(7,0)
(7, ?)
(4,0)
(4, ?)
(3,0)
(3, ?)

(6,0)
(6, ?)

1 2

Primul pas al algoritmului constă în determinarea unui flux iniţial admisibil,


adică fixarea valorilor lui f pentru fiecare arc astfel încât să se respecte
proprietăţile fluxului (cele din definiţie).
Un astfel de flux admisibil este şi cel care are flux 0 pe fiecare arc.
Algoritmul Ford-Fulkerson
La pasul doi se va determina un drum de creştere P. Acesta se poate găsi
printr-o parcurgere în adâncime, mergând întotdeauna doar pe arcele care au
capacitatea reziduală mai mare ca zero(neluând în seamă sensul arcelor).
Pornind de la fluxul anterior şi folosind drumul de creştere găsit se va obţine un
nou flux, f1 de valoare mai mare decât f, astfel: fie r(P) capacitatea reziduală a
drumului găsit; pentru fiecare arc direct din P se va mări fluxul cu r(P), iar pentru
arcele inverse fluxul va fi scăzut tot cu r(P) .
Faptul că r(P) este egal cu minimul dintre capacităţile reziduale ale arcelor din
P, ne asigură că pentru arcele directe se mai poate adăuga r(P) flux fără a
depăşi capacitatea arcului, iar pentru arcele inverse se poate scădea r(P) fără a
obţine un flux negativ.
Deci noul flux f1 va respecta prima proprietate a fluxului;

Acest pas se va repeta atâta timp cât exista un drum de creştere; în final,
conform teoremei 1, fluxul găsit va fi maxim.
Finalitatea algoritmului este asigurată de faptul că la fiecare iteraţie valoarea
fluxului creşte cu o cantitate mai mare decât zero; cum valoarea fluxului maxim
este finită rezultă că este necesar un număr finit de iteraţii ale pasului 2.
Algoritmul Ford-Fulkerson

Sens de
parcurgere

Deoarece arcele pot fi de două tipuri, vom întâlni patru cazuri. Să le analizăm pe rând:
a) ambele arce sunt arce directe, deci fluxul va creşte pe ambele cu aceeaşi cantitate
r(P); analog d, în acest caz se va scădea aceeaşi cantitate

b) primul arc este invers, iar cel de-al doilea este direct, deci pe primul arc fluxul va
scădea, iar pe al doilea va creşte; deoarece ambele arce “ies” din nod, iar fluxul de
pe unul creşte, iar de pe celălalt scade cu aceeaşi cantitate, rezultă că suma a tot ce
“iese” din nod va rămâne constantă şi deci fluxul se va conserva; analog c;
Complexitatea algoritmului Ford-Fulkerson
• fiecare iteraţie a pasului doi necesită O(K) operaţii (K=|E|, numărul de
muchii din reţea);
• numărul de iteraţii nu poate fi precizat cu exactitate, dar trebuie considerat
că, pentru cazul cel mai defavorabil când la fiecare iteraţie fluxul creşte cu o
unitate, acesta este limitat de valoarea fluxului maxim X

Se poate ca algoritmul să aleagă


alternativ drumurile 1, 2, 3, 4 şi 1, 3, 2, 4
În acest caz creşterea fluxului la fiecare
iteraţie va fi 1, fiind necesare 2*M iteraţii
pentru atingerea fluxului maxim.

Acest dezavantaj poate fi remediat prin îmbunătăţirea adusă algoritmului Ford-


Fulkerson de către Edmonds şi Karp. Aceasta constă în simpla înlocuire a
parcurgerii în adâncime cu o parcurgere în lăţime, asigurând astfel că la fiecare
pas se alege drumul de creştere care are cel mai mic număr de muchii.Numărul
de iteraţii al pasului doi nu poate fi mai mare decât K× N/2. Astfel se obţine o
complexitate de O(N× K2).
Algoritmul Dinic
• Avantajul acestui algoritm este complexitatea mai mică decât a
algoritmului Ford-Fulkerson: O(K× N2) faţă de O(N× K2).
• Descriere algoritm:
1. Se construieşte o reţea stratificată ce foloseşte muchiile utile
(cu capacitate reziduală nenulă) dintre s şi v.
2. Dacă reţeaua nu poate fi construită (nu putem ajunge de la s
la v construind reţeaua) înseamnă că s-a atins fluxul maxim
=> stop
3. Valorile fluxului muchiilor sunt modificate astfel încât să se
obţină un flux maxim în reţeaua stratificată
4. Valorile determinate în reţeaua stratificată sunt folosite pentru
modificarea valorilor din reţeaua “principală”.
5. Se reia de la punctul 1
Algoritmul Dinic – construirea reţelei stratificate
În V(i) reţinem toate nodurile stratului i care sunt legate direct de nodurile stratului
i+1.
1. Iniţial V(0) va conţine doar pe s, iar i=0. Se marchează s ca fiind vizitat, iar
celelalte noduri ca fiind nevizitate.
2. Vom lua rând pe rând nodurile x din V(i) şi pentru toate muchiile utile (x, y),
unde y este un nod nevizitat vom adăuga pe y în V(i+1), marcându-l ca fiind
vizitat.
Pentru fiecare muchie utilă e, muchia directă (x, y) adăugată în reţeaua
stratificată se asociază o capacitate c1(e)=r(x, y) şi un flux f1(e)=0. Pentru
muchia (x, y) avem un pointer copy ce indică către e şi un câmp boolean
reverse care ne indică direcţia lui e.
3. Incrementăm i.
4. Dacă V(i) e gol atunci fluxul e maxim => stop
5. Dacă V(i) conţine nodul final v atunci => am terminat de construit reţeaua
stratificată => stop
6. Reluăm de la punctul 2.
1 (3,0)
(6,3) 6
4

2
(2,1) (6,5)
(9,8) (1,0) (1,0)
(1,0) (3,2)
(4,4)

S (7,6) (7,5)
(2,0)
3 V
2
0 2 5 3
(7,2)
(5,0) (4,3)
(1,0)
(3,1)

(6,3)
(3,0)
1 2
1 2
Algoritmul Dinic- căutarea drumurilor de creştere
În descrierea de mai jos d1(e)=c1(e)-f1(e), St- stiva
1. Iniţial toate muchiile sunt notate ca fiind nebocate, iar stiva St e goală
2. x=s
3. Parcurgem muchiile neblocate cu originea în x
4. Dacă nu există muchii neblocate atunci
4.1 Dacă St e goală atunci avem flux maxim =>stop
4.2 Extragem muchia e=(k,p) din St şi marcăm e ca blocată
4.3 Continuăm cu pasul 3 pentru x=k
5. Else
5.1 Pune muchia neblocată e=(x, y) în St şi x=y
5.2 Dacă x e diferit de v atunci continuăm cu pasul 3
6. Pentru x=v avem un drum de creştere în St şi fluxul trebuie crescut :
6.1 p=min(d1(e1), …, d1(ek)) unde e1,…, ek sunt muchiile drumului
6.2 Pentru fiecare muchie e din drum f1(e)=f1(e)+p şi dacă f1(e)=c1(e) atunci
marcăm pe e ca fiind blocat
Algoritmul Dinic - update reţea “principală”
Odată determinat fluxul maxim în reţeaua stratificată va trebui să modificăm fluxul
pe fiecare muchie a reţelei “principale” după cum urmează:
Pentru fiecare muchie e a reţelei stratificate
Dacă e->reverse este true atunci
f(e->copy)=f(e->copy) – f1(e)
altfel f(e->copy)=f(e->copy) + f1(e)
1 (3,0) 6
4

(1,0) (1,0)
(1,0)

S 3 (2,0) V
2
0 2 5 3

(5,0) (1,0)

(3,0)
1 2
1 2