Você está na página 1de 63

FLUXO EM REDES

Fluxo em Redes

Rede
Grafo orientado conexo ao qual associam-se
parâmetros às arestas.

R = (N, A, U), onde

N = conjunto de nós ou vértices


A = conjunto de arcos
U = conjunto de parâmetros
Fluxo em Redes
Fluxo na aresta e ou aresta (i,j) : fe ou f(i,j)

Fluxo em uma rede: f = (f1, ..., fm) ∈ ℜm,


onde m = |A|

Obs: atribuição de reais não negativos às


arestas
Fluxo em Redes

Exemplo: Transporte de comodidades


entre centro produtores e consumidores

6 8
+200 P1 A D1 7
3 5 M1 -600
8 4 3
D2
+800 P2 1
1
10
9 M2 -400
D3
Fluxo em Redes
Considerando que os nós satisfazem as
seguintes condições
(i) Existe um nó especial chamado fonte,
denotado por s

(ii) Existe um nó especial chamado sumidouro,


denotado por t

(iii) A cada aresta e ∈ A são associados limites


Fluxo em Redes

(iii) A cada aresta e ∈ A são associados limites

Limite máximo –
ue = u (i, j )
capacidade do arco

u e = u (i, j ) Limite mínimo

0 ≤ u e ≤ ue para os fluxos fe
Fluxo em Redes
(iv) Para todo x ∈ N, x ≠ s, t, tem-se

1ª Lei de Kirchoff
∑ f (i, x ) = ∑ f (x, j ) ou
Lei da Conservação
i∈Γ − ( x ) j∈Γ + ( x )
nos vértices

Obs. Os nós que satisfazem (iv) são ditos


conservativos.
s, t não são conservativos
Fluxo em Redes

Exemplo: Modelando exemplo anterior

[200,200] P1 A D1
M1 [600,600]
s
D2
[800,800] P2 t

M2 [400,400]
D3

Obs. As demais arestas tem limites [0,∞]


Fluxo em Redes
Fluxo viável

f = (f1, ..., fm) ∈ ℜm é dito viável, se

(i) f é conservativo

(ii) ∃u e , ue ∈ ℜ, e = 1,..., m tais que


u e ≤ f e ≤ ue Restrição de capacidade
de transporte
Fluxo em Redes

No caso em que u e = 0, e = 1, ..., m, sempre


existirá um fluxo viável, pois f = (0, 0, ...,0) é um
fluxo viável.

Interpretação:

fe  taxa que o material é transportado


Fluxo em Redes
Fluxo Total entre Conjunto de Nós
Dados dois conjuntos X e Y
X,Y ⊂ N
(X∩Y) = ∅

f(X,Y) = ∑f
e∈S
e
Fluxo de X para Y

S = {e / (xi,xj), xi ∈ X e xj ∈ Y}
Fluxo em Redes
Exemplo:

X = {x1,x2} x1 x3 x4

Y = {x4,x5} s t

x2 x5

f(X,Y) = f(x1,x5) + f(x2,x4) + f(x2,x5)

f(Y,X) = f(x4,x1)
Fluxo em Redes
Lei da Conservação dos Fluxos

f (x,N\{X}) = f(N\{x},x), ∀x∈N, x ≠ s,t

Obs. Pode-se adicionar um arco de t para s dito


arco de retorno, no qual passa um fluxo
viável.
Fluxo em Redes

Temos então:

∑ f (i, x ) = ∑ f (x, j ), x ≠ s, t
i∈Γ − ( x ) j∈Γ + ( x )

f ( x, X ) = f ( X , x ), ∀x, x ∈ N \ {s, t}
Fluxo em Redes
Exemplo:
f=7

[0,2] 2
x1 x4 [0,6]
[0,4] 4
[0,2] 0 2
0
s 0 [0,2] [0,5] t
3 2 5
[0,4]
[0,3] x2 [0,10]
x5
[0,3] 3
Fluxo em Redes
Corte
Considere uma rede s-t constituída por um único
caminho de s para t

s x1 ... xn t

Então o valor do fluxo máximo que percorre esta


rede é:

{ }
f 0 = min u (s, x1 ), u ( x1 , x2 ),..., u ( xn , t )
Fluxo em Redes
Corte

O arco de menor capacidade é dito gargalo


da rede.

Em uma rede R qualquer, o gargalo é


denominado corte mínimo.
Fluxo em Redes

( )
Considerando X , X uma partição de N, tal que

X ∩ X ={ } X ∪X =N
s∈ X, t∈ X

( )
Diz-se que X , X define um corte em R e refere-
se a ele como corte s-t.
Fluxo em Redes
No exemplo abaixo, tem-se
X = {s, x1 , x 2 }
X = {x5 , x4 , t}
[0,2] 2
x1 x4 [0,6]
[0,4] 4
[0,2] 0 2
0
s 0 [0,2] [0,5] t
3 2 5
[0,4]
[0,3] x2 [0,10]
x5
[0,3] 3
Fluxo em Redes
Teorema.

Para um fluxo f e um corte s-t qualquer em uma


rede R, tem-se

( ) (
val ( f ) = f X , X − f X , X )
Fluxo em Redes
Prova.
val ( f ) = f (s, N ) − f (N , s )
= ∑ f ( x, N ) − ∑ f ( N , x )
x∈ X x∈ X

= f ( X , N ) − f (N , X )
( ) (
= f X, X ∪ X − f X ∪ X, X )
= f ( X , X ) + f (X , X ) − [ f ( X , X ) + f (X , X )]
= f (X , X ) − f (X , X )
Fluxo em Redes
Capacidade do Corte
( )
Considere o corte s-t X , X . Tem-se

( )
u X , X = ∑ ue , onde
e∈S

{
S = e / (i, j ), i ∈ X , j ∈ X }
e

( )
u X , X = ∑ ue
e∈S
Fluxo em Redes
Capacidade do Corte

(
u X, X )
Analogamente aos arcos onde u e ≤ fe ≤ u e
Tem-se ( ) ( )
f X, X ≤ u X, X
f (X , X ) ≥ u (X , X )
Fluxo em Redes
Lema.
Dado um fluxo f de valor val(f), qualquer que
( )
seja o corte X , X , tem-se:

val ( f ) ≤ u (X , X ) − u (X , X )
Prova.
( ) ( )
val ( f ) = f X , X − f X , X
val ( f ) ≤ u (X , X ) − f (X , X )
val ( f ) ≤ u (X , X ) − u (X , X )
Fluxo em Redes
Fluxo Líquido

Chama-se fluxo líquido através do corte s-t


( ) (
f X,X − f X,X )
e sua capacidade líquida

( ) (
u X, X −u X, X )
Fluxo em Redes
Fluxo Líquido
Dado um vértice i, o fluxo líquido em i é igual ao
fluxo que sai de i menos o fluxo que chega a i.

Na rede s-t, temos


 val ( f ), se i = s

∑ f (i, j ) − ∑ f ( j , i ) =  − val ( f ), se i = t
∀j ∀j 0, caso contrário

Fluxo em Redes
Problema do Fluxo Máximo

max f 0
sujeito a
 f 0 , se x = s

f ( x, N ) − f ( N , x ) =  − f 0 , se x = t
 0, se x ≠ s, t

u ( x , y ) ≤ f ( x, y ) ≤ u ( x , y )
Fluxo Máximo
Algoritmo de Ford e Fulkerson
Trabalha com caminhos de aumento de fluxo.

A partir de um fluxo viável inicial (f = 0) procura


por caminhos de aumento de fluxo e faz passar
mais fluxo.

Caminho de aumento de fluxo é um caminho de


s até t por onde possa passar mais fluxo.
Fluxo Máximo – Algoritmo F&F

30 10
30 8
20 12
10 a d 15
10 10 10 12
20 20 c
s 10 t
20 30
10 10
b 20 30
e 10
20 10
10
30
Fluxo Máximo – Algoritmo F&F
Caminho de aumento de fluxo

30 8 30 10 15 12
s a d t

Caminho saturado

30 5 30 7 15 15
s a d t
Fluxo Máximo – Algoritmo F&F
Um arco pode ser eleito para um caminho de
aumento de fluxo por duas razões:

1. A direção do arco é coerente com a direção


do caminho de s para t. Neste caso,
f ( x, y ) ≤ u ( x, y )

os vértices x e y pertencem ao caminho

o arco é dito arco direto


Fluxo Máximo – Algoritmo F&F
2. A direção do arco é oposta à direção do
caminho de s para t. Neste caso,

u ( x , y ) ≤ f ( x, y )

os vértices x e y pertencem ao caminho

o arco é dito arco reverso


Fluxo Máximo – Algoritmo F&F
Como o algoritmo parte de um fluxo viável,
podemos considerar, sem perda de
generalidade, que
u ( x, y ) = 0
Para todo arco (x,y) da rede.

O Teorema da Circulação garante que


podemos assumir isso ou que a rede não
possui fluxo viável.
(Teorema da Circulação – pesquisa)
Fluxo Máximo – Algoritmo F&F

Consideramos que o fluxo no arco reverso é


positivo (não negativo)

f ( x, y ) ≥ 0

Em todo arco direto é possível aumentar o fluxo de


s para t pelo arco. Nos arcos reversos pode-se
tentar diminuir o fluxo no arco, mantendo-se a lei da
conservação do fluxo.
Fluxo Máximo – Algoritmo F&F

Caminho de aumento de fluxo

30 8 30 10 15 12
s a d t

Arcos reversos Arco direto


Fluxo Máximo – Algoritmo F&F

Considere uma rede R = (N,A,U) e um fluxo f em R.

Def. A aresta e é utilizável de x para y se

1. e é direcionada de x para y e f ( x, y ) ≤ u ( x, y )

2. e é direcionada de y para x e f ( y, x ) ≥ 0

ou seja, existe folga no arco e.


Fluxo Máximo – Algoritmo F&F

Constrói-se um grafo (rede) R’ a partir de R (e o


fluxo considerado), somente com os arcos
utilizáveis (e vértices correspondentes).

Assim, se existir caminho de s para t em R’, então,


existe caminho de aumento de fluxo.

Teorema.
Dado um fluxo f, se existir caminho direto de s para
t em R’ então f não é fluxo máximo.
Fluxo Máximo – Algoritmo F&F

Como achar um aminho de aumento de fluxo?


O processo consiste em
ROTULAR e
VARRER (EXAMINAR)

os vértices da rede, começando pela fonte até


chegar ao sumidouro.

“Varrer” um vértice x significa chegar em x e olhar


todos os adjacentes que não foram rotulados.
Fluxo Máximo – Algoritmo F&F

Como achar um aminho de aumento de fluxo?

Se e é um arco utilizável de x para y, como definido,


então pode-se rotular y, significando que um
caminho de aumento de fluxo construído até x pode
se estender a y.
Fluxo Máximo – Algoritmo F&F
Como achar um aminho de aumento de fluxo?
Um rótulo é uma 3-upla (q,±, z ) , onde
i) q é o vértice que estava sendo varrido quando
da rotulação de y.
ii) + se o arco (x,y) era utilizável de x para y, ou
seja,
f ( x, y ) < u ( x, y )
iii) - se y foi rotulado porque o arco (x,y) era
utilizável de y para x, ou seja,
f ( y, v ) > 0
Fluxo Máximo – Algoritmo F&F
Como achar um aminho de aumento de fluxo?
Um rótulo é uma 3-upla (q,±, z ) , onde
iv) z é a maior quantidade de fluxo que pode passar
de s pelo cominho até então construído.

No início s recebe o rótulo (∞,+, ∞ )


Fluxo Máximo – Algoritmo F&F
Regra de Parada
 t foi rotulado
então existe caminho de aumento de fluxo de s
para t.

Neste caso, t recebeu um rótulo (q,±, z ) .


Assim, o fluxo pode ser aumentado em z unidades
no caminho.

OBS. Aumentar o fluxo e reiniciar o processo.


Fluxo Máximo – Algoritmo F&F
Regra de Parada
 t não foi rotulado e não é possível atribuir mais
rótulos

Neste caso, não existe caminho de aumento de


fluxo e, portanto, o fluxo corrente é máximo.

FIM.
Fluxo Máximo – Algoritmo F&F
Exemplo
30 10
30 (s,−,8)
(a,+,8)
8 20 12
10 a d 15
10 15 10 12
20 20 (d ,+,3)
(∞,+, ∞ ) s c 10 t
20
10 (d ,−,8) 30
10 30
b e
20 20 10
10 10
30
Fluxo Máximo – Algoritmo F&F
Exemplo
30 10
30 (s,−,5)
(a,+,5)
5 20 15
10 a d 15
10 15 10 15
20 20
(∞,+, ∞ ) s c 10 t (e,−,5)
20
10 (d ,−,5) 30
10 30
b e
20 20 10
(e,+,5) 10
10 (c,+,5)
30
Fluxo Máximo – Algoritmo F&F
Exemplo
30 10
30
0 20 20
10 a d 15
10 15 5 15
20 20
(∞,+, ∞ ) s c t
15
10 20 30
10 30
b e
20 20 5
10 10
30
Fluxo Máximo – Algoritmo F&F
Exercício
30 10
30
8 20 12
10 a d 15
10 15 15 12
20 20 c
s t
10
10 20 30
10 30
b e
20 20 10
10 10
30
Fluxo Máximo
Teorema Fluxo Máximo – Corte Mínimo
Para qualquer rede s-t o valor do fluxo máximo é
igual a capacidade líquida mínima entre seus cortes
s-t.

Comentário:
Já sabemos de resultados anteriores que
( ) (
val ( f ) ≤ u X , X − u X , X )
Esta restrição deve satisfazer qq corte s-t, incluindo
o de menor capacidade líquida.
Fluxo Máximo
Prova
É suficiente obter um fluxo f e um corte (X , X ) tal
que
( ) (
f0 = u X , X − u X , X )
Seja f um fluxo máximo. Utilizar o conjunto de
vértices N como se segue:

1. Fazer X = {s} e X = { }
N  N\ {s}, x  s
Fluxo Máximo
Prova
2. Escolha y ∈ N e testar

2.1 se x ∈ X e f ( x, y ) < u ( x, y ) ou
f ( y , x ) > u ( x, y )
Então X ← X ∪ {y}

Caso contrário X = X ∪ {y}


Fluxo Máximo
Prova
3. Se N = { }, pare

Caso contrário escolha y ∈ N, fazer x  y e ir para


2.

Se f é máximo, contruindo X desta forma obteremos

( )
t ∈ X , ou seja X , X é um corte s-t.
Fluxo Máximo
Prova
Assumir por absurdo que t ∉ X

Por definição de X, existe caminho de s a t com a


propriedade que os arcos possuem folga. Portanto,
um caminho de aumento de fluxo.

Absurdo !!!
Fluxo Máximo
Algoritmo de Ford e Fulkerson
0. Considere f um fluxo viável na rede
1. Rotular s com [-∞,0,∞]
2. Se todos os nós já tiverem sido examinados
(“varridos”), vá para o passo 6.
3. Encontrar um nó rotulado, não examinado, i.
3.1 Para um arco (i,j) se f (i, j ) < u (i, j )
e j não está rotulado, rotular j com [i,+,zj]
onde
{ }
z j = min zi , u (i, j ) − f (i, j )
Fluxo Máximo
Algoritmo de Ford e Fulkerson
3.2 Para um arco (j,i) se f ( j , i ) < u ( j , i )
e j não está rotulado, rotular j com [i,-,zj]
onde
z j = min{zi , f ( j , j ) − u ( j , i )}
4. Se t não foi rotulado, vá para o passo 2
5. {aumento de fluxo}
5.1 Iniciando em t, utilizar os rótulos para construir
o caminho de aumento de fluxo.
5.2 Aumentar o fluxo nos arcos do caminho
somando zt nos arcos diretos e decrescendo zt nos
arcos reversos.
Fluxo Máximo
Algoritmo de Ford e Fulkerson
5.3 Cancelar todos os rótulos (exceto s)e ir para 3

6. O fluxo é máximo. Um corte s-t de capacidade


mínima pode ser obtido colocando-se todos os nós
rotulados em X e os restantes em X

Fim
Fluxo Máximo
Eficiência do Algoritmo de Ford e Fulkerson
O algoritmo rotula os vértices em qualquer ordem.
Considere a aplicação do método na rede abaixo,
utilizando {s,a,b,t} como caminho de aumento de
fluxo.
a [0,M]
[0,M]

[0,1] t onde M é um número


s
grande
[0,M] [0,M]
b
Fluxo Máximo
Eficiência do Algoritmo de Ford e Fulkerson
A cada iteração o algoritmo aumenta 1 unidade de
fluxo. Como o fluxo máximo é 2M, serão
necessárias 2M iterações do algoritmo para
construir o fluxo máximo.

Questões:
1. Em quantos passos termina o algoritmo?
2. Ele sempre termina?
Fluxo Máximo
Algoritmo de Ford e Fulkerson
Caso 1. Capacidades inteiras
Durante o processo de rotulação e aumento de fluxo
são produzidos somente aumentos inteiros.
Se C* denota a capacidade combinada da rede das
arestas que saem da fonte s, então o valor do fluxo
não excede C*.
Uma vez que o aumento de fluxo se dará por, no
mínimo, 1 unidade a cada passo, então depois de
C* iterações o algoritmo termina com o fluxo
máximo.
Fluxo Máximo
Algoritmo de Ford e Fulkerson
Teorema.
Em uma rede com capacidades inteiras em todos os
arcos, o algoritmo termina num número finito de
passos e encontra o fluxo máximo.
Fluxo Máximo
Algoritmo de Ford e Fulkerson
Boa notícia: O algoritmo converge para capacidades
inteiras.

Má notícia: A complexidade não depende somente


do número de vértices e arestas da rede, mas
também das capacidades.

Ford e Fulkerson construíram um exemplo com


arcos de capacidade irracional para o qual o
algoritmo não converge.
Fluxo Máximo
Algoritmo de Ford e Fulkerson
Solução de Edmond e Karp

Aumentar o fluxo no caminho mais curto de s a t.

A cada passo é escolhido para ser examinado o


primeiro vértice rotulado (first labelled first scanned).

A complexidade do algoritmo passa a independer da


capacidade dos arcos.
Edmond,J., Karp, R. 1972. Theoretical Improvements in Algorithmic
Efficiency for Network Flow Problems, J. ACM 19, 248-269.
Fluxo Máximo
Algoritmo de Ford e Fulkerson – E&K

Exemplo anterior

O algoritmo resolve o problema em 2 iterações.

a [0,M]
[0,M]

s [0,1] t

[0,M] [0,M]
b
Fluxo Máximo
Algoritmo de Ford e Fulkerson – E&K
Teorema.

A complexidade do algoritmo de Ford e Fulkerson


modificado é O(m2n).

OBS.

Algoritmo MPM resolve o problema em O(n3).