Vous êtes sur la page 1sur 12

Problme du Flot

Dans ce chapitre, le graphe est suppos orient.

I) Position du problme :
Soit G=(X,U) un graphe et lapplication c:U u R+ U {+} c(u) capacit de larc u

Soient S et P deux sommets et ur = (PS) appel arc de retour. Le problme de recherche dun flot maximum de S P dans R =(X, U, c), revient chercher un vecteur f Rm+1 (m = |U|) tel que : i) f est un flot sur R U {ur }

ii) f(u) c( u) u U iii) f(ur) maximum Si A est la matrice dincidence aux arcs associe G, alors: A*f = 0 (F) f c f 0 f(ur ) = Z (Max) Exemple 1:
a

1
S

5 2
P

4
b

ur

f(Sa) + f(Sb) f(ab) + f((aP) f(bP) f((Sb) f(ur) f(bP) f(Sa) f(Sb) f(ab) f(aP) f(bP) f(ur)

f(ur) = 0 f(Sa) = 0 f(ab) = 0 f(aP) = 0 1 f 0 4 2 5 3 = Z(Max)

II) Algorithme Ford Fulkerson (FF) :


1) Principe de lalgorithme : Initialisation : f(u) = 0 uU

Lalgorithme se base sur deux ides: 1re ide : chemin augmentant de S P : (le rel ct de chaque arc est sa capacit)

4 6

a 7

3 4

d 8

9 5

f ur

C 1 = (S, a, b, c, d, e, P) C 2 = (S, f, c, d, g, P)

=2 =3

Application: lexemple 1 1er chemin: (S, a, b, P); 2me chemin: (S, b, P);

= 1; = 2;

f(ur) = 1 f(ur) = 3

2me ide : chane augmentante de S P : (on a port ct de chaque arc u, le couple (f(u),c(u)) S (1,5) a (4, 7) b (3, 8) c (0, 4) d (2, 2) e (6, 10) P

ur
C + = {(Sa), (ab), (cd), (eP)} C ={(cb), (ed)}
-

1 = Min(5-1, 7-4, 4-0, 10-6) = 3 2 = Min(3, 2) = 2

=2

Application: lexemple 1 C+ = {(Sb), (bP)} 1 = Min(5-0, 4-2) = 2 C ={(ab)} 2 = 1

=1;

f(ur) = 4

Algorithme FLOTMAX (donnes : X, U, I, T, ur , s, p, c; rsultats : f, Y) f(u) : = 0 pour tout u U Itrer MARQUAGE (X, U, I, T, ur , s, p, c, f ; Y, A, ) Arrt : p Y x : = p ; C + : = {ur} ; C - : = Tantque x s faire u : = A(x) si x = T(u) alors C + : = C + U {u} ; x : = I(u) Sinon /* dans ce cas, x = I(u) */ C - : = C - U {u} ; x : = T(u) Finsi Fintantque f(u) + si u C + f(u) : = f(u) - si u C f(u) Finitrer Finalgo si u C + U C -

Algorithme MARQUAGE (donnes : X, U, I, T, ur , s, p, c, f ; rsultats : Y, A, ) /* MARK est une variable logique qui vaut FAUX lorsquon ne peut plus marquer de nouveaux sommets*/ Y : = {s} ; MARK : = VRAI Tant que p Y et MARK faire Si il existe u = (xy) avec x Y, y Y et f(u) < c(u) alors /* cette tape est appele marquage direct . Larc u, sil appartient la chane dcele de s p sera dans C +. Le flot sur u augmentera */ Y : = Y U {y} ; A (y) : = u ; (y) : = Min [(x) ; c(u) f(u)] Sinon si il existe u = (yx) avec x Y, y Y et f(u) > 0 alors /* cette tape est appele marquage indirect . Larc u, sil appartient la chane dcele de s p sera dans C -. Le flot sur u diminuera */ Y : = Y U {y} ; A (y) : = u ; (y) : = Min [(x) ; f(u)] Sinon MARK : = FAUX Finsi Finsi Fintantque Si MARK alors : = (p) finsi Finalgo

Nature Marquage Marquage Direct Marquage Indirect

Avant marquage x* y
f(u) < c(u)

Aprs marquage x* y* x* y*

uC uC

x*
f(u) > 0

Remarque : Si litration i, f est un flot, alors litration i+1, f est un flot aussi. f := f + c (c est le vecteur reprsentatif relatif au cycle C U {ur}) 2) Thorme de la coupe minimum Dfinition : Un ensemble darcs C est appel coupe sparant P de S, sil existe Y X tel que C = +(Y). La capacit de C est par dfinition : c(C ) = c(u)
u C

Thorme 1 : (de la coupe minimum )


Pour toute coupe C sparant P de S et pour tout flot ralisable f sur R U { ur } , on a : c(C ) f(ur).

Thorme 2 :
Au terme de lapplication de lalgorithme FF, le flot courant sur ur est maximum.

Algorithme FLOTMAX (donnes : X, U, I, T, ur , s, p, c; rsultats : f, Y) f(u) : = 0 pour tout u U Itrer MARQUAGE (X, U, I, T, ur , s, p, c, f ; Y, A, ) Arrt : p Y x : = p ; C + : = {ur} ; C - : = Tantque x s faire u : = A (x) si x = T(u) alors + + C : = C U {u} ; x : = I(u) Sinon /* dans ce cas, x = I(u) */ C : = C U {u} ; x : = T(u) Finsi Fintantque f(u) + si u C + f(u) : = f(u) - si u C f(u) si u C + U C Finitrer Finalgo

Algorithme MARQUAGE (donnes : X, U, I, T, ur , s, p, c, f ; rsultats : Y, A, ) /* MARK est une variable logique qui vaut FAUX lorsquon ne peut plus marquer de nouveaux sommets*/ Y : = {s} ; MARK : = VRAI Tant que p Y et MARK faire Si il existe u = (xy) avec x Y, y Y et f(u) < c(u) alors /* cette tape est appele marquage direct . Larc u, sil appartient la chane dcele de s p sera dans C +. Le flot sur u augmentera */ Y : = Y U {y} ; A (y) : = u ; (y) : = Min [(x) ; c(u) f(u)] Sinon si il existe u = (yx) avec x Y, y Y et f(u) > 0 alors /* cette tape est appele marquage indirect . Larc u, sil appartient la chane dcele de s p sera dans C -. Le flot sur u diminuera */ Y : = Y U {y} ; A (y) : = u ; (y) : = Min [(x) ; f(u)] Sinon MARK : = FAUX Finsi Finsi Fintantque Si MARK alors : = (p) finsi Finalgo

3) Flots canaliss Soit G=(X,U) un graphe. Considrons les deux applications suivantes :

c:U u tel que : b(u) c(u)

R U {+} c(u) uU

b:U u

R U {- } b(u)

Si S et P sont deux sommets et ur = (PS), le problme de recherche dun flot maximum de S P dans

R =(X, U, c), revient chercher un vecteur f R m+1


i) f est un flot sur R U {ur } uU

(m = |U|) tel que :

ii) b(u) f(u) c( u) iii) f(ur) maximum Procdure de marquage : Nature Marquage Marquage Direct Marquage Indirect

Avant marquage x* y
f(u) < c(u)

Aprs marquage x* y* x* y*

uC uC

x*
f(u) > b(u)

Algorithme FLOTMAXGENERAL (donnes : X, U, I, T, ur, s, p, b, c; rsultats : Y, MODIF, FLOTBORNE) /* lorsque cette procdure est appele, f est suppose tre solution ralisable du problme de flot canalis ; MODIF est une variable logique qui vaut VRAI ssi lappel cet algorithme conduit un changement de flot ; FLOTBORNE est une variable logique qui vaut VRAI ssi il existe une coupe de capacit finie.*/ MODIF : = FAUX ; FLOTBORNE : = VRAI ; Itrer MARQUAGEGENERAL ( X, U, I, T, ur , s, p, b, c, f ; Y, A, ) Arrt : p Y ou = x : = p ; C + : = {ur} ; C - : = ; MODIF : = VRAI Tantque x s faire u : = A (x) si x = T(u) alors + + C : = C U {u} ; x : = I(u) Sinon /* dans ce cas, x = I(u) */ C : = C U {u} ; x : = T(u) Finsi Fintantque f(u) + si u C + f(u) : = f(u) - si u C f(u) si u C + U C Finitrer Si = alors FLOTBORNE : = FAUX finsi Finalgo

Algorithme MARQUAGEGENERAL (donnes : X, U, I, T, ur , s, p, b, c, f ; rsultats : Y, A, ) Y : = {s} ; MARK : = VRAI (s) : = c(ur) - f(ur)

/* (s) est la quantit maximum dont on souhaite augmenter le flot sur larc ur */ Tant que p Y et MARK faire Si il existe u = (xy) avec x Y, y Y et f(u) < c(u) alors Y : = Y U {y} ; A (y) : = u ; (y) : = Min [(x) ; c(u) f(u)] Sinon si il existe u = (yx) avec x Y, y Y et f(u) > b(u) Y : = Y U {y} ; A (y) : = u ; (y) : = Min [(x) ; f(u) b(u)] Sinon MARK : = FAUX Finsi Finsi Fintantque Si MARK alors : = (p) finsi Finalgo

alors

III) Recherche dun flot ralisable :


Thorme 3 : (Thorme dHOFFMAN) Une CNS pour quil existe un flot ralisable sur R est que pour tout cocycle on ait :

b(u)
{i / ui - (x)}

c(u)
{i / ui + (x)}

(1)

Exemple 2: Le rseau suivant nadmet pas de flot ralisable. Il suffit de prendre Y = {a, b).

b (0,1) (0,1) a (1 ,2) b (3,4) d (-2,-1)

Ide de lalgorithme : Initialisation : f(u) = 0 uU On pourra commencer par nimporte quel flot si on en dispose dun. A chaque itration, on calcule le rel INDIC dfini par :

INDIC = (f(u) c(u)


{u/ f(u) > c(u)}

(b(u) f(u) 0
{u/ f(u) < b(u)}

Le flot courant est ralisable ssi INDIC = 0. On distingue trois types darcs : U1 = {u / b(u) f(u) c(u)} le flot est ralisable sur ces arcs. U2 = {u / f(u) < b(u)} U3 = {u / f(u) > c(u)} Indic = 0 ssi U2 = U3 =

A chaque itration, et tant que le flot courant nest pas ralisable, on choisira un arc u0 U2 ou U3 et on lui associe le rseau : R (u0) = (X, U U { ur}, b(u), c(u)) avec :

b(u) b(u) = f(u)

si si

b(u) f(u) uU f(u) < b(u)

c(u) c(u) = c(u)

si si

f(u) c(u) uU f(u) > c(u)

u0 ur = - u0

si si

u0 U2 u0 U3

b(u0) f(u0) b(ur) = 0 et c(ur) = f(u0) - c(u0)

Algorithme FLOTREAL (donnes : X, U, I, T, b, c; rsultats : f, Y, EXISTFLOT) /* EXISTFLOT est une variable logique qui vaut VRAI ssi il existe un flot ralisable sur R = (X, U, b, c) ; ur est un arc supplmentaire quon ajoute U*/ EXISTFLOT : = VRAI ; f(u) = 0 uU /* On peut prendre comme valeur de dpart, nimporte quel flot sur (X, U)*/ Itrer INDIC : = [f(u) - c(u) ] + [ b(u) - f(u)]
{u / f(u) > c(u) } {u / f(u) < b(u) }

Arrt : INDIC = 0 ou EXISTFLOT = FAUX Si il existe u0 = (x0y0) U avec f(u0) > c(u0) I(ur) : = p : = y0 ; T(ur) : = s : = x0 ; : = -1 ; Sinon il existe u0 = (x0y0) U avec f(u0) < b(u0) I(ur) : = p : = x0 ; T(ur) : = s : = y0 ; :=1; Finsi b(u) si f(u) b(u) c(u) b(u) : = ; c(u) : = f(u) si f(u) < b(u) f(u)

alors c(ur) : = f(u0) c(u0) alors c(ur) : = b(u0) f(u0) si f(u) c(u) uU si f(u) > c(u)

f(u) : = f(u) uU; f(ur) : = 0 ; b(ur) : = 0 ; FLOTMAXGENERAL ( X, U, I, T, ur, s, p, b, c; f ; Y, MODIF, FLOTBORNE) ; si f(ur) = c(ur) alors f(u0) : = f (u0) + f(ur) ; f(u) : = f (u) uU, u u0 sinon EXISTFLOT : = FAUX Finsi Finitrer Finalgo

IV) Tension et Flot de cot minimum :


1) Tension de cot minimum : Position du problme : Soit R = (X, U, t1, t2, k) un rseau tel que : t1(u) t2(u) t 1: U t 2: U k: U R U {-} R U {+} R u U.

cot de larc u

Le problme de recherche dune tension de cot minimum sur R consiste trouver un vecteur t tel que : (i) t soit une tension sur G = (X, U) (ii) t1(u) t(u) t2(u) u U. (iii) k(u)*t(u) = Z(Min) Remarque : Si A est la matrice dincidence aux arcs relative G, alors le programme linaire relatif ce problme scrit :

t = -tA (TC) t1 t t 2 k(u)*t(u) = Z(Min)

Soit t une tension ralisable, associons le rseau k(u) b(u) = - si t(u) = t1(u) t(u) < t2(u) t(u) = t2(u) si t(u) > t1(u)

R (t) = (X, U, b, c) avec :

k(u) c(u) = +

si si

Thorme 4 : Une CNS pour quune tension ralisable sur R soit de cot minimum est quil existe un flot ralisable sur R (t). Algorithme TENSIONCOUMIN (donnes : X, U, I, T, t1, t2, k ; rsultats : t) TENSIONREAL (X ,U, I, T, t1, t2 ; EXIST, t, +, -) ; Itrer - b(u) : = k(u) si t(u) > t1 (u) si t(u) = t1(u) + c(u): = k(u) si t(u) = t2(u) si t(u) < t2 (u) uU

FLOTREAL (X, U, I, T, b, c, f, Y, EXISTFLOT) Arrt : EXISTFLOT : = Min


{u + (Y)}

Min

[ t2(u) - t(u)] ; Min si u +(Y) si u -(Y) si u +(Y) U

{u - (Y)}

[ t(u) - t1 (u)]

t(u) : = Finitrer Finalgo

t(u) + t(u) - t(u)

-(Y)

2) Flot de cot minimum : Position du problme : Soit R = (X, U, b, c, k) un rseau tel que : b(u) c(u) b: U c: U k: U R U {-} R U {+} R u U.

cot de larc u

Le problme de recherche dun flot de cot minimum sur R consiste trouver un vecteur f tel que : (i) f soit un flot sur G = (X, U) u U. (ii) t1(u) t(u) t2(u) (iii) k(u)*t(u) = Z(Min) Remarque : Si A est la matrice dincidence aux arcs relative G, alors le programme linaire relatif au problme de recherche dun flot de cot minimum scrit : A*f = 0 b f c k(u)*f(u) = Z(Min) Exemples : 1) Problme du plus court chemin dun sommet S un sommet P: R = (X, U, b, c, k) avec : U = U U {( ur)} k(u) = l(u) k(ur) = 0 b(u) = 0 b(ur) = 1 c(u) = + avec ur = (PS) uU uU

(FC)

2) Problme de flot maximum de S P sur R :

R = R U{ur}
k(u) = 0 k(ur) = -1 b(u) = 0

avec ur = (PS) uU u U U {( ur)}

3) Problme de transport : bi = quantit en stock au ime dpt i = 1,, m cj = quantit demande par le jme magasin j = 1,, n kij = cot unitaire de transport du ime dpt au jme magasin. Dpts Magasins

(0, bi, 0) S (0, +, kij) ( cj,+, 0) P

(0, +, 0)

Soit f un flot ralisable, associons le rseau k(u) t1 (u) = - si f(u) = b(u) si f(u) > b(u)

R (f) = (X, U, t1, t2)

avec :

k(u) t2(u) = +

si si

f(u) < c(u) f(u) = c(u)

Thorme 5 : Une CNS pour quun flot ralisable sur R soit de cot minimum est quil existe une tension ralisable sur R (f).

Algorithme FLOTCOUMIN (donnes : X, U, I, T, b, c, k ; rsultats : f, EXISTFLOTCOUMIN) FLOTREAL (X ,U, I, T, b, c ; f, Y, EXISTFLOT) ; Itrer - t1(u) : = k(u) si f(u) > b (u) si f(u) = b(u) + t2(u): = k(u) si f(u) = c(u) si f(u) < c (u) uU

TENSIONREAL (X ,U, I, T, t1, t2 ; EXIST, t, +, -) ; Arrt : EXIST ou = : = Min Min [ c(u) - f(u)] ; Min
{u +} {u -}

[ f(u) - b (u)]

t(u) : = Finitrer Finalgo

f(u) + f(u) - f(u)

si u + si u si u + U -

Exemple :
(0, 2, 3)

b (0, 8, 6) le triplet est (b(u), c(u), k(u))

(0, 3,3) a

(0, 7, 1) d

(0, 10, 8)

(0, 3, 2)

(6, + , 0)