Sunteți pe pagina 1din 36

Problema fluxului maximal.

1. Taitura in retea
2. Teorema Ford-Fulkerson Algoritmi de soluţionare
a problemei fluxului maxim – algoritmul Ford-
Fulkerson
1. Metoda grafică
2. Metoda matricială.
1. Taitura in retea

Fie G=(X,U) – un graf orientat cu o singură sursă xs şi o singură


destinaţie xd.
xs -este sursă dacă gradul interior a varfului este este zero.
xd - este destinație (stoc) dacă gradul a varfului exterior este este zero
1. Taitura in retea
Vom împărţi mulţimea de vârfuri X în două submulţimi care nu se
intersectează:
𝑅 şi 𝑅 în aşa mod încât 𝑥𝑠 ∈ 𝑅 iar 𝑥𝑑 ∈ 𝑅.

Definiție. Tăietura în reţea, ce delimitează sursa xs de destinaţia xd, se va


numi mulţimea de arce (xi,xj) pentru care 𝑥𝑖 ∈ 𝑅, 𝑥𝑗 ∈ 𝑅 și posedă
proprietatea 𝑥𝑠 ∈ 𝑅 iar 𝑥𝑑 ∈ 𝑅.
Tăitura se notează (𝑅 𝑅) .

Observație Tăieturii aparţin numai şi numai acele arce (xi,xj), pentru care
𝑥𝑖 ∈ 𝑅, 𝑥𝑗 ∈ 𝑅 , (în acelaşi timp, condiţiile 𝑥𝑠 ∈ 𝑅 iar 𝑥𝑑 ∈ 𝑅 fiind
obligatorii).
1. Taitura in retea

Definiție Valoarea tăieturii sau capacitatea ei de transport C(𝑅 𝑅) este


egală cu suma capacităţilor de transport ale arcelor tăieturii:
1. Taitura in retea

În orice graf finit întotdeauna se poate construi un număr


finit de tăieturi, de regulă, de diferite valori.

Definiție. Tăietura în graf, care are capacitatea minimă de


transport, se numeşte tăietură minimă.
Exemplu:
1) Fie R1 ={x1, x2}; 𝑅1 ={ x3, x4, x5},
(𝑅1 𝑅1 )={(x1, x3), (x1, x4), (x2, x4), (x2, x5)} şi
𝐶(𝑅1 𝑅1 )=c13+c14+c24+c25=17+4+2+2=25.
Remarcăm, că arcul (x4, x2) nu se include în tăietură, deoarece extremitatea
lui iniţială se află în 𝑅1 şi nu în R1 unde se află sursa.
Exemplu:

2) R2 ={x1, x2, x3}.Rezultă că 𝑅2 ={x4, x5},


(𝑅2 𝑅2 )={(x1, x4), (x2, x4), (x2, x5), (x3, x4), (x3, x5)},
𝐶(𝑅2 𝑅2 )={(c14+c24+c25+c34+c35=4+2+2+10+5=23.
Exemplu:

3) R3 ={x1, x2, x3, x4}. Rezultă că 𝑅3 ={x5},


(𝑅3 𝑅3 )={(x2, x5), (x3,x5), (x4,x5)} şi 𝐶(𝑅3 𝑅3 ) =c25+c35+c45=2+5+8=15.
Este evident, că tăietura (𝑅3 𝑅3 )reprezintă tăietura minimă.
2. Teorema Ford-Fulkerson Algoritmi de soluţionare a problemei
fluxului maxim – algoritmul Ford-Fulkerson
Teorema Ford-Fulkerson. În orice graf valoarea fluxului maxim din xs în
xd coincide cu capacitatea de transport a tăieturii minime, ce desparte
xs de xd.
Vom nota prin * - valoarea fluxului maxim în graful G=(X,U) cu o
singură sursă s şi o singură destinaţie d. Teorema afirmă că se poate de
construit o asemenea tăietură (𝑅 ∗ , 𝑅 ∗ ), astfel încât C(𝑅 ∗ , 𝑅 ∗ )= *.
Vom nota 𝑓𝑖𝑗 (𝑓𝑖𝑗 ≤ 𝑐𝑖𝑗 ) – valoarea fluxului de-a lungul arcului (𝑥𝑖 , 𝑥𝑗 )

Vom spune, că arcul (xi, xj) este saturat, dacă fij =cij.
2. Teorema Ford-Fulkerson Algoritmi de soluţionare a problemei
fluxului maxim – algoritmul Ford-Fulkerson

Din demonstrația teoremei rezultă că pentru toate arcele (xi,xj), pentru


care 𝑥𝑖 ∈ 𝑅 ∗ , 𝑥𝑗 ∈ 𝑅 ∗ se îndeplineşte condiţia 𝑓𝑖𝑗 = 𝑐𝑖𝑗 . Astfel
Аlgoritmul Ford-Fulkerson. Metoda Grafică

Pasul 1: Se consideră, că la începutul calculelor, graful este parcurs de


un flux nul: {fij}=0. Totuşi, de regulă, este uşor de a găsi un flux iniţial
nenul. Pentru a realiza acest lucru, de exemplu, se găsesc în graf
drumurile care nu au arce comune şi leagă sursa cu destinaţia. Se
determină fluxurile ce parcurg aceste drumuri. Suma acestor fluxuri
este valoarea 0 a fluxului iniţial în graf. Se marchează valorile
iniţiale a fluxurilor tuturor arcelor grafului prin fij.
Pasul 2: Vârful xs (sursa) al grafului se marchează cu (x0, εs) = (x0,
∞). Se alege oricare vârf marcat xi.
- nodurile pot fi marcate în direcția arcului, dacă arcul nu este
saturat: fij <cij. Nodul xj se marchează cu (𝑥𝑖+ , εj ), unde εj= min(εi,
cij-fij).
- nodurile pot fi marcate în direcția inversă arcului, pentru care
fij >0, se marchează cu (𝑥𝑖− , εj), εj = min(εi, fij).
Nodurile grafului se vor marca în aşa mod, până când sau se va
marca vârful xd, sau nu se va mai putea marca nici un nod. Dacă
vârful xd, s-a marcat, atunci fluxul în graf poate fi majorat şi în
acest caz trecem la pasul 3 al algoritmului. Dacă vârful xd nu poate
fi marcat, atunci fluxul în graf este maxim.
Pasul 3: Nodul xd este marcat cu (𝑥𝑗+ , εd ) sau (𝑥𝑗− , εd ). Deci fluxul în
graf poate fi majorat cu εd. Dacă nodul este marcat cu (𝑥𝑗+ , εd ), atunci
fluxul pe arcul (xj, xd) se majorează cu εd, deci valoarea nouă a fluxului

va fi egală cu: 𝑓𝑗𝑑 = 𝑓𝑗𝑑 + 𝜀𝑑 . Dacă vârful este marcat cu (𝑥𝑗− , εd ),
atunci fluxul pe arcul indirect (xd, xj) se micşorează cu εd, deci valoarea

nouă a fluxului va fi egală cu: 𝑓𝑗𝑑 = 𝑓𝑗𝑑 − 𝜀𝑑 .
Se trece la nodul j. Se procedează analogic, dacă nodul xj este marcat cu
(𝑥𝑖+ , εj ), atunci valoarea fluxului nou pe arcul (xi, xj) va fi:
𝑓𝑖𝑗ℎ = 𝑓𝑖𝑗 + 𝜀𝑑 , iar dacă vârful este marcat cu (𝑥𝑖− , εj ), atunci valoarea
fluxul nou pe arcul indirect (xj, xi) va fi : 𝑓𝑖𝑗ℎ = 𝑓𝑖𝑗 − 𝜀𝑑 . Se trece la
nodul xi. Se procedează analogic până când se ajunge la sursa xs.
Valoarea fluxului în graf, în rezultatul acestor acţiuni, se majorează cu
εd, :𝛷 1= 𝛷 0 +εd.
Pas de verificare. Dacă destinația xd nu poate fi marcată, atunci fluxul
curent este deja maxim. Vom include vârfurile care pot fi marcate în
mulțimea R, iar cele care nu pot fi marcate în 𝑅. Taitura (R, 𝑅 ) este
tăietura minimă. Conform teoremei lui Ford-Fulkerson capacitatea
tăieturii minime este fluxul maxim în graf.
Exemplul. Să se determine fluxul maxim în graful.
8
x2 x5
5
16

x1 4 2 2 x 6 xd
8 7
x3 10
x4
Pasul 1. Se examinează în calitate de drumuri iniţiale drumurile
L1(x1, x6)=( x1, x2, x3, x4, x6) şi L2 (x1, x6)=( x1, x3, x2, x5, x6).
Pe drumul L1 se poate pune în circulaţie fluxul Φ𝐿1 = 4, iar pe drumul L2–
fluxul Φ𝐿2 = 2. Fluxul iniţial Φ0=Φ𝐿1 +Φ𝐿2 =2+4=6.
Exemplul. Să se determine fluxul maxim în graful.
8-2 x5
x2
5-2
16-4

x1 4-4 2-2 2-0 x6


8-2 7-4
x3 x4
10-4

Valoarea fluxului, care circulă pe fiecare arc, se va înscrie în dreapta valorii


capacităţii de transport, delimitându-se prin cratimă.
( x1 ,12 )
8-2 x5
x2
5-2
16-4

( x0 ,  ) x1 4-4 2-2 2-0 x6 ( x 4 , 2 )

8-2 7-4
x3 x4
10-4

( x ,2 )
2
( x 3 , 2 )

Iteratia 1 Pasul 2. Vârful x1 se marchează cu (x0, ∞). Din vârful x1 se poate


marca vârful x2, deoarece fluxul care trece pe arcului (x1 x2)= 4 < c12=16.
Vârful x2 se va marca cu: [x1+, min (∞, 16-4)] = (x1+ ,12).
Din vârful x2 se poate marca vârful x3 pe arcul indirect (x3, x2), deoarece
f32=2>0. Vârful x3 nu poate fi marcat din vârful x2 prin arcul direct (x2, x3),
deoarece acest arc este saturat: f23=C23=4.
Vârful x3 se va marca cu: [x2-, min (12, 2)] = (x2- ,2).
( x1 ,12 )
8-2 x5
x2
5-2
16-4

( x0 ,  ) x1 4-4 2-2 2-0 x6 ( x 4 , 2 )

8-2 7-4
x3 x4
10-4

( x ,2 )
2
( x 3 , 2 )

Din vârful x3 se va marca vârful x4 cu [x3+, min(2, 10-4)] = (x3+, 2),


iar din vârful x4 se va marca destinaţia, vârful x6 cu:
[x4+, min (2, 7-4)] = (x4+, 2).
Iteratia 1 Pasul 3. Nodul x6 este marcat cu (x4+, 2), deci fluxul în graf poate fi
majorat cu 2 unităţi. Mișcându-ne conform marcajelor plasate, de la vârful x6
la vârful x4, de la vârful x4 la vârful x3, de la vârful x3 la vârful x2 şi de la vârful
x2 la vârful x1, majorăm fluxurile cu 2 unităţi pe arcele directe (x4, x6), (x3, x4)
şi (x1, x2) şi îl micşorăm cu 2 unităţi pe arcul indirect (x3, x2). Valorile noi ale
fluxurilor sunt: f46=6,f34=6,f32=0,f12=6.
Valoarea nouă a fluxului în graf Φ1=Φ0+ε6=6+2=8.

8-2 x5
x2
5-2
16-6

x1 4-4 2-0 2-0 x6


8-2
x3 x4 7-6
10-6
Iteratia 2 Pasul 2. Pornind de la sursa x1 (ea este marcată cu (x0, ∞)), se
marchează consecutiv vârfurile x2, x5, x6.
Vârful x6 se va marca cu (x5+, 3). prin urmare, fluxul în graf poate fi majorat
cu 3 unităţi. Valoarea nouă a fluxului este: Φ2= Φ1+3=8+3=11.

( x ,10 )
1
( x 2 , 6 )
8-2 x5
x2
5-2
16-6

( x0 ,  ) x1 4-4 2-0 2-0 x6 ( x 5 , 3 )

8-2
x3 x4 7-6
10-6
Iteratia 2 Pasul 3. Fluxul în graf poate fi majorat cu 3 unităţi. Valoarea nouă a
fluxului este: Φ2= Φ1+3=8+3=11

8-5
x2 x5
5-5
16-9

x1 4-4 2-0 2-0 x6


8-2
x3 x4 7-6
10-6
Iteratia 3. Pasul 2 Se marchează consecutiv vârfurile x1, x2, x5, x4, x6.
Destinaţia iarăşi a fost marcată, deci fluxul se majorează cu o unitate.

( x 1 , 7 ) ( x 2 , 3 )
8-5
x2 x5
5-5
16-9

( x0 ,  ) x1 4-4 2-0 2-0 x 6 ( x 4 ,1 )


8-2
x3 x4 7-6
10-6
( x 5 , 2 )
Iteratia 3. Pasul 3 Valoarea nouă a fluxului este: Φ3=Φ2+1=12. Acest
flux se va reprezenta în figura.

8-6 x5
x2
5-5
16-10
4-4 2-0 2-1
x1 x6
8-2
x3 x4 7-7
10-6
Iteratia 4. Pasul 2 Se marchează consecutiv vârfurile x1, x3, x2, x5, x4, se
observă că vârful x6 nu poate fi marcat (arcele (x5, x6) şi (x4, x6) sunt
saturate). Prin urmare, valoarea maximă a fluxului în graf este
Φmax=Φ3=12.
( x 3 , 2 ) ( x 2 , 2 )
8-6 x5
x2
5-5
16-10
2-0 2-1
( x0 ,  ) x1 4-4 x6
8-2
x3 x4 7-7
10-6
(x 1

,6) ( x 5 ,1 )
Etapa de verificare. Includem toate varfurile marcate in mulțimea R , iar cele
nemarcate în mulțimea 𝑅. Astfel tăietura minimă R, 𝑅 ={(x4,x6), (x5,x6)}.
Capacitatea ei de transport C R, 𝑅 =7+5=12 şi este echivalentă cu valoarea
fluxului maxim.

( x 3 , 2 ) ( x 2 , 2 )
8-6 x5
x2
5-5
16-10
2-0 2-1
( x0 ,  ) x1 4-4 x6
8-2
x3 x4 7-7
10-6
(x 1

,6) ( x 5 ,1 )
Algoritmul Ford-Fulkerson. Metoda matricеală
Se va utiliza matricea de adiacență în care sunt prezentate
capacităţile de transport cij ale grafului.

Pentru a determina fluxul maxim de la sursa 𝑥𝑠 la destinația 𝑥𝑑


se vor parcurge următorii paşi.

Pasul 1. Se determină un drum de la 𝑥𝑠 spre 𝑥𝑑 , pe care fluxul


are valoare pozitivă în direcţia 𝑥𝑠 → 𝑥𝑑 . Dacă un aşa drum nu
există, atunci trecem la pasul 3. În caz contrar trecem la pasul 2.
Algoritmul Ford-Fulkerson. Metoda matricеală
Pasul 2 Se realizează următoarele trei acţiuni:
1) Se marchează cu ”-” toate elementele cij ale matricei C ce are
aceiași direcție cu drumul construit la pasul 1 (xs→xd) şi cu „+” toate
elementele cij ale matricei C care au direcţie opusă acestui drum, adică
direcția xd→ xs.

2) Se determină cu 𝜃 = min 𝑐𝑖𝑗
3) Toate elementele cij ale matricei C se modifică în felul următor:
a) la elementelor cij marcate cu „+” se adună 𝜃;
b) din elementele cij marcate cu „-” se scade 𝜃;
Se trece la pasul 1. Admitem că drumuri nu mai există 𝐶 (𝑘) = 𝐶 ∗ , atunci
trecem la pasul 3.
Algoritmul Ford-Fulkerson. Metoda matricеală
Pasul 3. Se găseşte fluxul maxim în graf.
Fie că C=||cij|| - matricea iniţială a capacităţilor de transport şi fie că

𝐶 ∗ = 𝑐𝑖𝑗 - matricea finală, obţinută în rezultatul modificărilor matricei
iniţiale (pasul 1 şi pasul 2). Fluxul optim 𝑓𝑖𝑗 se calculează după formula
∗ ∗
𝑐𝑖𝑗 − 𝑐𝑖𝑗 , 𝑐𝑖𝑗 > 𝑐𝑖𝑗
𝑓𝑖𝑗 = ∗
0 𝑐𝑖𝑗 < 𝑐𝑖𝑗
Fluxul maxim din 𝑥𝑠 în 𝑥𝑑 este egal cu
𝛷 = ෍ 𝑓𝑠𝑖 = ෍ 𝑓𝑗𝑑
𝑖 𝑗

.
Exemplu. Pentru exemplu deja analizat sa se determine fluxul
maxim prin metoda matriciala.
0) Determinăm matricea de adiacentă.

1 2 3 4 5 6
8
x2 x5 1 0 16 8 0 0 0
5
16
2 0 0 4 0 8 0
x1 4 2 2 x 6 xd 3 0 2 0 10 0 0
C=
8 7 4 0 0 0 0 0 7
x3 x4
10 5 0 0 0 2 0 5

6 0 0 0 0 0 0
1) În calitate de drum iniţial, care leagă
sursa cu destinaţia, se poate alege
x1 → x3 → x4 → x6.
2)Căsuțele (1,3), (3,4) şi (4,6) se
marchează cu semnul “−”.
Căsuțele (3,1), (4,3) şi (6,4) se 1 2 3 4 5 6
marchează cu semnul “+”. 1 0 16 8- 0 0 0
Pentru drumul dat fluxul maxim se 2 0 0 4 0 8 0
determină în modul următor:
C= 3 0+ 2 0 10- 0 0
 = min{c13, c34, c46} = min{8, 10, 7}=7.
4 0 0 0+ 0 0 7-
Remarcăm că s-ar putea alege şi alte 5 0 0 0 2 0 5
drumuri iniţiale. 6 0 0 0 0+ 0 0
3) In rezultatul scăderii valorii 7 din
casutele notate cu ”-” și adunării valorii
7 la cele marcate cu ”+”, se va obține
matricea.
1 2 3 4 5 6
1 0 16 1 0 0 0
2 0 0 4 0 8 0
C1= 3 7 2 0 3 0 0
4 0 0 7 0 0 0
5 0 0 0 2 0 5
6 0 0 0 7 0 0
1)Drumul 𝒙𝟏 → 𝒙𝟐 → 𝒙𝟓 → 𝒙𝟔 .

𝜽 =min 𝟏𝟔, 𝟖, 𝟓 = 𝟓

1 2 3 4 5 6
1 0 16 1 0 0 0
2 0 0 4 0 8 0
C1= 3 7 2 0 3 0 0
4 0 0 7 0 0 0
5 0 0 0 2 0 5
6 0 0 0 7 0 0
Drumul
𝒙𝟏 → 𝒙𝟐 → 𝒙𝟓 → 𝒙𝟔 .

𝜽 =min 𝟏𝟔, 𝟖, 𝟓 = 𝟓

1 2 3 4 5 6
1 0 16- 1 0 0 0
2 0+ 0 4 0 8- 0
C2= 3 7 2 0 3 0 0
4 0 0 7 0 0 0
5 0 0+ 0 2 0 5-
6 0 0 0 7 0+ 0
1 2 3 4 5 6 1 2 3 4 5 6
1 0 16- 1 0 0 0 1 0 11 1 0 0 0
2 0+ 0 4 0 8- 0 2 5 0 4 0 3 0
C2= 3 7 2 0 3 0 0 C3= 3 7 2 0 3 0 0
4 0 0 7 0 0 0 4 0 0 7 0 0 0
5 0 0+ 0 2 0 5- 5 0 5 0 2 0 0
6 0 0 0 7 0+ 0 6 0 0 0 7 5 0

In matricea C3 nu mai este posibil de de a determina un


drum către varful x6. Matricea C*= C3
0 16 8 0 0 0 0 11 1 0 0 0
0 0 4 0 8 0 5 0 4 0 3 0
C= 0 2 0 10 0 0 C* = 7 2 0 3 0 0
0 0 0 0 0 7 0 0 7 0 0 0
0 0 0 2 0 5 0 5 0 2 0 0
0 0 0 0 0 0 0 0 0 7 5 0
Obținem matricea X prin scăderea X=CC* şi modificarea valorilor
negative în valori nule.
0 5 7 0 0 0
0 0 0 0 5 0
X= 0 0 0 7 0 0
0 0 0 0 0 7
0 0 0 0 0 5
0 0 0 0 0 0
Φ∗ = ෍ 𝑥𝑠𝑗 + ෍ 𝑥𝑖𝑑 = 5 + 7 = 7 + 5 = 12
(𝑠,𝑗) (𝑖,𝑑)

x2 5 x 5
0 5 7 0 0 0 5 5
0 0 0 0 5 0
X= 0 0 0 7 0 0 x1 x6
0 0 0 0 0 7
7
0 0 0 0 0 5 x3
7
x 4
7
0 0 0 0 0 0

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