Sunteți pe pagina 1din 19

Aplicaţia FT 3: Problema fluxului maxim – algoritmul Ford-Fulkerson

Un graf orientat poate fi utilizat pentru modelarea unui proces de transport într-o rețea
între un producător s și un consumator t. Destinația nu poate consuma mai mult decât se
produce, iar cantitatea trimisă pe o cale nu poate depăși capacitatea sa de transport.
O problemă des întâlnită într-o rețea de transport este cea a găsirii fluxului maxim
posibil prin arcele rețelei astfel încât:
1 - să nu fie depășite capacitățile arcelor;
2 - fluxul să se conserve în drumul său de la sursă către destinaţie.
Această grupă de probleme, cunoscută şi sub numele de “grupa problemelor de flux
maxim”, se rezolvă cu ajutorul algoritmului Ford-Fulkerson. Problemele de acest gen apar în
transportul aerian, feroviar, auto şi mai puţin în cel naval.
În continuare se vor prezenta etapele algoritmului Ford-Fulkerson.

Aplicaţia 1. Fie următorul graf orientat:

4
A B 10
10

8
S 4 6
10 D

9
C D 10

În acest graf, nodul „S‟ este sursa iar nodul „D‟ este destinaţia.
În căsuţele corespunzătoare arcelor, sunt definite capacităţile arcelor (cij), exprimate
în tone.
Algoritmul Ford-Fulkerson ajută să se găsească fluxurile maxime care pot fi
transportate de la origine către destinaţie, ţinând cont de capacităţile arcelor din reţea.

Etapa 1: Se notează cu φij fluxurile care sunt trimise către destinaţie, care la
momentul iniţial sunt 0.

44
0/4
1 2 0/10
0/10

0/8
S 0/4 0/6
0/10 D

0/9
3 4 0/10
Flux [φij]

Capacitate [cij]

Etapa 2. Se caută succesiv drumuri de la S la D astfel încât fiecare din aceste drumuri
să fie format numai din arce nesaturate (arcul saturat este arcul al cărui flux este egal cu
capacitatea sa). Pentru fiecare drum astfel format se determină cantitatea θ = min {cij- φij},
unde:
φij = fluxul arcului;
cij = capacitatea arcului.
Această cantitate se adună ca valoare de flux pe toate arcele drumului „i”, celelalte arce
rămânând neschimbate.
Fluxul total ce străbate reţeaua este dat de suma fluxurilor drumurilor construite:

Primul drum d1 care se alege este cel care trece prin nodurile: d1 = S,1,4,D.
Se determină cantitatea care poate fi transportată:

θ1 = min {cij - φij} = min{10 - 0; 8 - 0; 10 - 0} = min{10, 8, 10} = 8 tone

0/4

1 2 0/10
8/10

8/8
S 0/4 0/6
0/10 D

0/9
3 4 8/10

45
După transportarea a 8 tone pe ruta S-1-4-D, se observă că arcul 1-4 devine un arc
saturat. Pentru o identificare mai uşoară a arcelor saturate, acestea vor fi tăiate cu 2 liniuţe.
Rezerva de capacitate pe arcele S-1, respectiv 4-D, devine 10 – 8 = 2 tone.
Următorul drum ales este: d2 = S,3,4,D.
Se determină cantitatea care poate fi transportată:

θ2 = min {cij - φij} = min{10 - 0; 9 - 0; 10 - 8} = min{10, 9, 2} = 2 tone

Pe acest drum, fluxul maxim care poate fi transportat este de 2 tone.

0/4

1 2 0/10
8/10

8/8
S 0/4 0/6
2/10 D

2/9
3 4 10/10

Se observă, de asemenea, că şi arcul 4-D devine arc saturat.


Cel de-al 3-lea drum ales este drumul: d3 = S,3,4,2,D.
Se determină cantitatea care poate fi transportată:

θ3 = min{cij - φij} = min{10 - 2; 9 - 2; 6 - 0; 10 - 0} = min{8, 7, 6, 10} = 6 tone

Pe acest drum, fluxul maxim care poate fi transportat este de 6 tone, valorile fluxurilor
transportate devenind:

0/4

1 2 6/10
8/10

8/8
S 0/4 6/6
8/10 D

8/9
3 4 10/10

46
Arcul 4-2 devine arc saturat.
Cel de-al 4-lea drum ales este drumul: d4 = S,1,2,D
Se determină cantitatea care poate fi transportată:

θ4 = min {cij - φij} = min{10 - 8; 4 - 0; 10 - 6} = min{2, 4, 4} = 2 tone

Pe acest drum fluxul maxim care poate fi transportat este de 2 tone, valorile fluxurilor
transportate devenind:

2/4

1 2 8/10
10/10

8/8
S 0/4 6/6
8/10 D

8/9
3 4 10/10

Arcul S-1 devine arc saturat.


Se observă că nu mai sunt drumuri de la sursă către destinaţie care pot fi parcurse în
sens de mers spre înainte; în aceste condiţii, se calculează fluxul total:

Etapa 3. Se verifică dacă fluxul obţinut este şi fluxul maxim. Acest lucru se realizează
în felul următor:
Se caută un lanţ de la S către D care să conţină arce cu sens de mers spre înainte
nesaturate (să aibă o rezervă de capacitate cij - φij ≠ 0) şi arce cu sens invers direcţiei de mers
care sa aibă fluxul alocat diferit de 0 (φij ≠ 0).
În cazul nostru, există un lanţ care să îndeplinească aceste criterii, şi anume:

47
2/4

1 2 8/10
10/10

8/8
S 0/4 6/6
8/10 D

8/9
3 4 10/10

Se observă că arcele cu sens de mers spre înainte S-3, 3-4, 1-2 şi 2-D au rezervă de
capacitate (cij - φij ≠ 0), iar arcul 1-4, care este în sens opus direcţiei de deplasare, de
asemenea îndeplineşte condiţia φij ≠ 0.
În caz că în graf există un astfel de lanţ, se calculează fluxul cu care poate fi încărcat
lanţul, acesta fiind egal cu δ1 = min {cij - φij}, valorile introduse în ecuaţii fiind acelea ale
arcelor cu sensul de mers spre înainte:

δ1 = min{cij - φij} = min{10 - 8; 9 - 8; 4 - 2; 10 - 8} = {2; 1; 2; 2} = 1 tone

Cu această valoare se încarcă arcele cu sensul de mers spre înainte şi se descarcă arcul
ce are sens invers direcţiei de mers.

3/4

1 2 9/10
10/10

7/8
S 0/4 6/6
9/10 D

9/9
3 4 10/10

Se mai caută un alt lanţ care să îndeplinească condiţiile prezentate anterior. În cazul
de faţă, se observă că nu mai există un astfel de lanţ. Se trece la etapa finală.
Etapa 4. Calculul fluxului maxim care poate fi trimis de la S către D, acesta
calculându-se cu următoarea formulă:

Θmax = ∑ θ ∑ δ =θ θ θ θ δ

48
Aplicaţia 2. Fie reţeaua de transport prezentată în figura următoare. Să se determine
fluxul maxim care poate fi trimis de la sursă către destinaţie, folosind algoritmul Ford-
Fulkerson.

5
X X 15
10
1 5 4
6 15 8
S X X D
2 2 5
5 4

10 7 12
X X
3 6

În acest graf, nodul „S‟ este sursa iar nodul „D‟ este destinaţia.
În căsuţele corespunzătoare arcelor sunt definite capacităţile arcelor (cij), exprimate în
tone.
Etapa 1: Se notează cu φij fluxurile care sunt trimise către destinaţie care la momentul
iniţial sunt 0.

0/5
X X 0/15
0/10
1 0/5 4
0/6 0/15 0/8
S X X D
2 0/2 5
0/5 0/4

0/10 0/7 0/12


X X
3 6

Etapa 2. Se caută succesiv drumuri de la S la D astfel încât fiecare din aceste drumuri
să fie format numai din arce nesaturate (arcul saturat este arcul al cărui flux este egal cu
capacitatea sa). Pentru fiecare drum astfel format se determină cantitatea θ = min {cij - φij},
unde:
• φij = fluxul arcului;
• cij = capacitatea arcului.
Această cantitate se adună ca valoare de flux pe toate arcele drumului „i”, celelalte
arce rămânând neschimbate.

49
Fluxul total ce străbate reţeaua este dat de suma fluxurilor drumurilor construite:

Primul drum care se alege:

d1 = S,X1,X4,D

Se determină cantitatea care poate fi transportată:

θ1 = min{cij - φij} = min{10 - 0; 5 - 0; 15 - 0} = min{10, 5, 15} = 5 tone

5/5

X X 5/15
5/10
1 0/5 4
0/6 0/15 0/8
S X X D
2 0/2 5
0/5 0/4

0/10 0/7 0/12


X X
3 6

După transportarea a 5 tone pe ruta S-X1-X4-D se observă că arcul X1-X4 devine un


arc saturat. Pentru o identificare mai uşoară a arcelor saturate, acestea vor fi tăiate cu 2
liniuţe.
Se alege un alt drum pe care să se transporte marfa de la S la D:

d2 = S,X2,X5,D

Se determină cantitatea care poate fi transportată:

θ2 = min{cij - φij} = min{6 - 0; 15 - 0; 8 - 0} = min{6, 15, 8} = 6 tone

Graful devine:

50
5/5

X X 5/15
5/10
1 0/5 4
6/6 6/15 6/8
S X X D
2 0/2 5
0/5 0/4

0/10 0/7 0/12


X X
3 6

Arcul S-X2 devine arc saturat.


Se alege al 3-lea drum:

d3 = S,X1,X2,X5,D

Se determină cantitatea care poate fi transportată:

θ3 = min{cij - φij} = min{10 - 5; 5 - 0; 15 - 6; 8 - 6} = min{5, 5, 9, 2} = 2 tone

5/5

X X 5/15
7/10
1 2/5 4
6/6 8/15 8/8
S X X D
2 0/2 5
0/5 0/4

0/10 0/7 0/12


X X
3 6

Arcul S-X2 devine arc saturat.


Se alege următorul drum:

d4 = S,X3,X6,D

51
Se determină cantitatea care poate fi transportată:

θ4 = min{cij - φij} = min{10 - 0; 7 - 0; 12 - 0} = min{10, 7, 12} = 7 tone

Graful devine:

5/5

X X 5/15
7/10
1 2/5 4
6/6 8/15 8/8
S X X D
2 0/2 5
0/5 0/4

7/10 7/7 7/12


X X
3 6

Arcul X3-X6 devine arc saturat.


Se caută un alt drum de la S către D:

d5 = S,X3,X5,X6,D

Se determină cantitatea care poate fi transportată:

θ5 = min{cij - φij} = min{10 - 7; 2 - 0; 4 - 0; 12 - 7} = min{3, 2, 4, 5} = 2 tone

Graful devine:

5/5

X X 5/15
7/10
1 2/5 4
6/6 8/15 8/8
S X X D
2 2/2 5
0/5 2/4

9/10 7/7 9/12


X X
3 6

52
Arcul X3-X5 devine saturat.
Următorul drum care se alege este :

d6 = S,X1,X2,X5,X6,D

Se determină cantitatea care poate fi transportată:

θ6 = min{cij - φij} = min{10 - 7; 5 - 2; 15 - 8; 4 - 2; 12 - 9} = min{3, 3, 7, 2, 3}= 2 tone

Graful devine:

5/5

X X 5/15
9/10
1 4/5 4
6/6 10/15 8/8
S X X D
2 2/2 5
0/5 4/4

9/10 7/7 11/12


X X
3 6

Arcul X5-X6 devine saturat.


Se observă că nu mai există un alt drum care să meargă de la S către D care să treacă
numai prin arcuri nesaturate. În acest caz, se calculează fluxul total:

Etapa 3. Se verifică dacă fluxul obţinut este şi fluxul maxim. Acest lucru se realizează
în felul următor:
Se caută un lanţ de la S către D care să conţină arce cu sens de mers spre înainte
nesaturate (să aibă o rezervă de capacitate cij - φij ≠ 0) şi arce cu sens invers direcţiei de mers
care să aibă fluxul alocat diferit de 0 (φij ≠ 0).
În cazul de faţă nu există un lanţ care să îndeplinească aceste criterii, rezultă că fluxul
obţinut în etapa anterioară este şi fluxul maxim.

53
Aplicatia 3. În trei depozite D1, D2 şi D3 se găsesc la un moment dat următoarele
cantităţi de marfă: D1 = 200 tone, D2 = 150 tone şi D3 = 240 tone. Aceste cantităţi urmează
să fie transportate la trei beneficiari - şi anume B1, B2, B3 - în următoarele condiţii: B1 = 220
tone, B2 = 170 tone şi B3 = 200 tone. Posibilităţile de transport sunt limitate de capacitatea
arcelor pe care se desfăşoară transportul. Să se determine cantitatea maximă de mărfuri
(fluxul maxim de mărfuri) ce poate fi transportată de la centrele de distribuţie la beneficiari
(făcandu-se abstracţie de costuri).

B1 B2 B3
D1 100 70 30
D2 130 - 20
D3 150 180

Rezolvare:
În funcţie de datele din tabel se construieşte următorul graf:

100
D B
1 1

70

130

30
D B
2 2
20

150

180
D B
3 3

Pentru a putea aplica algoritmul Ford-Fulkerson, trebuie ca reţeaua să aibă un singur


punct de intrare şi un singur punct de ieşire. Pentru aceasta, vom introduce în reţea un punct S
(sursa) ce reprezintă cantităţile de mărfuri aflate la nivelul celor 3 depozite, cantităţi ce urmează a
fi transportate la beneficiari, şi un punct D (destinaţie) – ce reprezintă cantităţile cu care urmează
a fi aprovizionaţi cei 3 beneficiari.

54
100
D B
1 1
70

200 220

130
150 170
30
S D B D
2 2
20

240
200
150

180
D B
3 3
În continuare, vom aplica algoritmul Ford-Fulkerson:
Pasul 1: Se notează cu φij fluxurile care sunt trimise către destinaţie, care la
momentul iniţial sunt 0.
0/100

D B
1 1
0/70

0/200 0/220

0/130
0/150 0/170
0/30
S D B D
2 2
0/20

0/240
0/200
0/150

0/180
D B
3 3
55
Pasul 2. Se caută succesiv drumuri de la S la D astfel încât fiecare din aceste drumuri
să fie format numai din arce nesaturate (arcul saturat este arcul al cărui flux este egal cu
capacitatea sa). Pentru fiecare drum astfel format se determină cantitatea θ = min{cij - φij},
unde:
• φij = fluxul arcului;
• cij = capacitatea arcului.
Această cantitate se adună ca valoare de flux pe toate arcele drumului „i”, celelalte
arce rămânând neschimbate.
Fluxul total ce străbate reţeaua este dat de suma fluxurilor drumurilor construite:

Drumurile alese sunt:

d1 = S-D1-B1-D

Se determină cantitatea care poate fi transportată:

θ1 = min{cij - φij} = min{200 - 0; 100 - 0; 220 - 0} = min{200, 100, 220} = 100 tone

Graful devine:

100/100
D B
1 1
0/70

100/200 100/220

0/130
0/150 0/170
0/30
S D B D
2 2
0/20

0/240
0/200
0/150

0/180
D B
3 3
56
Arcul D1-B1 devine arc saturat.
Următorul drum ales este:

d2 = S-D2-B1-D

Se determină cantitatea care poate fi transportată:

θ2 = min{cij - φij}= min{150 -0; 130 - 0; 220 - 100} = min{150, 130, 120} = 120 tone

Graful devine:

100/100
D B
1 1
0/70

100/200 220/220

120/130
120/150 0/170
0/30
S D B D
2 2
0/20

0/240
0/200
0/150

0/180
D B
3 3

Arcul B1-D devine arc saturat.


Al 3-lea drum ales este:

d3 = S-D1-B3-D

Se determină cantitatea care poate fi transportată:

θ3 = min{cij - φij} = min{200 - 100; 30 - 0; 200 - 0} = min{100, 30, 200} = 30 tone

57
Graful devine:

100/100
D B
1 1
0/70

130/200 220/220

120/130
120/150 0/170
30/30
S D B D
2 2
0/20

0/240
30/200
0/150

0/180
D B
3 3

Arcul D1-B3 devine arc saturat.


Următorul drum ales este:

d4 = S-D1-B2-D

Se determină cantitatea care poate fi transportată:

θ4 = min{cij - φij} = min{200 - 120; 70 - 0; 170 - 0} = min{80, 70, 170} = 70 tone

58
Graful devine:

100/100
D B
1 1
70/70

200/200 220/220

120/130
120/150 70/170
30/30
S D B D
2 2
0/20

0/240
30/200
0/150

0/180
D B
3 3

Arcele S-D1 şi D1-B3 devin arce saturate.


Următorul drum ales este:

d5 = S-D2-B3-D

Se determină cantitatea care poate fi transportată:

θ5 = min{cij - φij} = min{150 - 120; 20 - 0; 200 - 30} = min{30, 20, 170} = 20 tone

59
Graful devine:

100/100
D B
1 1
70/70

200/200 220/220

120/130
140/150 70/170
30/30
S D B D
2 2
20/20

0/240
50/200
0/150

0/180
D B
3 3

Arcul D2-B3 devine arc saturat.


Următorul drum ales este:

d6 = S-D3-B2-D

Se determină cantitatea care poate fi transportată:

θ6 = min{cij - φij} = min{240 -0; 150 - 0; 170 - 70} = min{240, 180, 100} = 100 tone

60
Graful devine:

100/100
D B
1 1
70/70

200/200 220/220

120/130
140/150 170/170
30/30
S D B D
2 2
20/20
100/240

50/200
100/150

0/180
D B
3 3

Arcul B2-D devine arc saturat.


Următorul drum ales este:

d7 = S-D3-B3-D

Se determină cantitatea care poate fi transportată:

θ7 = min{cij - φij} = min{240 - 100; 180 - 0; 200 - 50} = min{140, 180, 150} = 140 tone

61
Graful devine:
100/100
D B
1 1
70/70

200/200 220/220

120/130
140/150 170/170
30/30
S D B D
2 2
20/20
240/240

190/200
100/150

140/180
D B
3 3

Arcul B2-D devine arc saturat.


Se observă că nu mai există un alt drum care să meargă de la S către D care să treacă
numai prin arcuri nesaturate. În acest caz, se calculează fluxul total:

Pasul 3. Se verifică dacă fluxul obţinut este şi fluxul maxim. Acest lucru se realizează
în felul următor:
Se caută un lanţ de la S către D care să conţină arce cu sens de mers spre înainte
nesaturate (să aibă o rezervă de capacitate cij - φij ≠ 0) şi arce cu sens invers direcţiei de mers
care să aibă fluxul alocat diferit de 0 (φij ≠ 0).
În cazul de faţă nu există un lanţ care să îndeplinească aceste criterii, rezultă că fluxul
obţinut în etapa anterioară este şi fluxul maxim.
Se observă din graful efectuat că B1 şi B2 au reuşit să-şi satisfacă cerererea, însă B3
are un deficit de:

200(necesarul) - 140(D3-B3) - 20(D2-B3) - 30(D1-B3) = 10 tone.

62

S-ar putea să vă placă și