Fluxo Máximo em Redes
Estrutura da Aula
1. Introdução
2. Método de Ford-Fulkerson
3. Rede Residual
Problema da Mina
Uma mina de carvão produz 12
toneladas de carvão por dia que precisam ser escoados para um porto usando a malha ferroviária disponível. O grafo a seguir
mostra a malha e a capacidade de cada trecho.
Problema da Mina
É possível escoar 12 toneladas por dia
da mina para o porto?
Senão, qual o máximo possível?
mina porto A B C 5 8 8 10 10 10
Fluxo Máximo em Redes
O Problema da Mina pode ser tratado como o
problema de achar o Fluxo Máximo
O grafo é uma rede direcionada (=grafo
direcionado valorado)
Um vértice fonte: origem do fluxo
Exemplo: a mina
Um vértice sumidouro: destino do fluxo
Exemplo: o porto
Fluxo Máximo em Redes
No cálculo do fluxo, ignorar a
possibilidade de os vértices acumularem fluxo
O fluxo que entra em um vértice é igual ao
que sai
Exceções são os vértices fonte (só sai) e o
Representação do Fluxo
Associar a cada aresta o seu fluxo real
(usado) seguido da sua capacidade (fluxo máximo)
Inicialmente o fluxo real é nulo
mina porto A 0/5 0/8 0/10 0/10 0/10
Fluxo Máximo em Redes
Fluxo da rede (total)
Fluxo saindo do vértice fonte, ou
Fluxo entrando no vértice sumidouro
mina porto A B C 5/5 0/8 0/8 5/10 0/10 5/10
2. Método de
Ford-Fulkerson
Método de Ford-Fulkerson
Os algoritmos mais simples
baseiam-se no método de Ford-Fulkerson
Acha um caminho da fonte ao sumidouro,
passando por arestas com capacidade disponível
Chamado “caminho aumentante”
Incrementa o fluxo da rede ao longo desse
caminho
Incremento é o peso da aresta de menor capacidade
disponível, ao longo do caminho
Método de Ford-Fulkerson
Não é bem um algoritmo, pois não especifica como achar o caminho, o
que pode ser feito de várias maneiras:
Com uma pesquisa em profundidade
Com uma pesquisa em extensão
Com o algoritmo de Dijkstra
Algoritmo de Edmonds-Karp
É um caso especial do método de
Ford-Fulkerson
O único detalhe específico é o
algoritmo para achar caminhos Pesquisa em extensão!
Isso garante uma complexidade
Exemplo 1
Executar o algoritmo de Edmonds-Karp
Pesquisa em extensão: qual o menor caminho em
número de arestas? mina porto A 0/5 0/8 0/10 0/10
Exemplo 1
1º caminho: mina→A→porto
Aresta com capacidade mínima: mina→A
Incrementa o fluxo de 5 ao longo do caminho
mina porto A C 5/5 0/8 0/8 0/10 5/10 0/10
aresta atingiu sua capacidade máxima
Exemplo 1
2º caminho: mina→B→A→porto
Aresta com capacidade mínima: A→porto Incrementa o fluxo de 5 mina porto A 5/5 5/8 0/10 10/10
Exemplo 1
3º caminho: mina→B→C→porto
Aresta com capacidade mínima: mina→B Incrementa o fluxo de 3 mina porto A C 5/5 8/8 5/8 0/10 10/10 3/10
“Correção de Fluxo”
Em alguns grafos, pode acontecer de
um caminho “mal escolhido” impedir a criação de outros caminhos
Nestes casos, o algoritmo precisa fazer
uma “correção” no fluxo
Basta permitir que sejam traçados caminhos no
sentido contrário ao do fluxo de uma aresta
Desfaz o fluxo estabelecido naquela aresta (mas não
Exemplo 2
Aplicando a pesquisa em extensão,
vários caminhos podem ser escolhidos Vamos supor que o primeiro caminho escolhido seja
"fonte→A→D→sumidouro" fonte sumi. A B C 0/3 D 0/5 0/5 0/4 0/7
Exemplo 2
1º caminho: fonte→A→D→sumidouro
Aresta de capacidade mínima: A→D Aumenta o fluxo de 4
fonte A B
0/3
4/5 0/5
Exemplo 2
2º caminho: fonte→A→B→sumidouro
Aresta de capacidade mínima: fonte→A Aumenta o fluxo de 1 fonte sumi. A B C 0/3 D 5/5 1/5 4/4 1/7
Exemplo 2
Este é o fluxo máximo da rede?
Não. O primeiro caminho escolhido “bloqueou" a
descoberta de um fluxo maior
Por isso, o algoritmo permite seguir no
contra-fluxo das arestas
A "capacidade" da aresta no sentido inverso é dada
pelo valor do fluxo dela
Segui-la no sentido inverso, desfaz o fluxo que passa
pela aresta
Exemplo 2
3º caminho: fonte→C→D→A→B
→sumid.
Arestas de capacidade mínima: fonte→C e C→D
fonte sumi. A B C 0/3 D 5/5 1/5 4/4 1/7
Exemplo 2
3º caminho: fonte→C→D→A→B
→sumid.
Arestas de capacidade mínima: fonte→C e C→D Aumenta o fluxo de 3 fonte A B 3/3 5/5 4/5 1/4 4/7 desfez parte do fluxo desta aresta!
Rede Residual
Assim, para implementar o
método de Ford-Fulkerson, é
preciso representar o grafo com arestas tanto no sentido do fluxo como no sentido contrário
Isso é o que representa a rede
Rede Residual
Mostra apenas quanto ainda
resta da capacidade de cada aresta
Por isso o nome “residual”
Para permitir desfazer um fluxo,
cria uma aresta no sentido contrário ao de cada fluxo estabelecido
Rede Residual
A rede residual consiste em
representar arestas assim:
Na direção original da aresta, com o peso
dado pela diferença (capacidade – fluxo)
Na direção contrária à original, com peso
dado pelo valor do fluxo atual
Indica que pode desfazer esse fluxo
Rede Residual
No início, a rede residual é
idêntica ao grafo original
Conseqüência da definição de rede residual
(slide anterior)
Vamos rever o exemplo 2 usando
Exemplo 2 (revisto)
Aplicando a pesquisa em extensão,
dois caminhos podem ser escolhidos Vamos supor que seja escolhido o caminho
"fonte→A→D→sumidouro" fonte A B 3 5 5 4 7 Rede Residual
Exemplo 2 (revisto)
1º caminho: fonte→A→D→sumidouro
Aresta de capacidade mínima: A→D Aumenta o fluxo de 4 fonte sumi. A B C 3 D 4 5 4 7 Rede Residual 1 0 0 removidas!
Exemplo 2 (revisto)
2º caminho: fonte→A→B→sumidouro
Aresta de capacidade mínima: fonte→A Aumenta o fluxo de 1 Rede Residual fonte A B 3 1 4 4 1 5 6
Exemplo 2 (revisto)
3º caminho: fonte→C→D→A→B
→sumid.
Arestas de capacidade mínima: fonte→C e C→D Aumenta o fluxo de 3 Rede Residual fonte sumi. A B C 3 D 4 1 1 4 5 3 3
Rede Residual
Com as redes residuais, é possível
“desfazer” um fluxo de maneira natural
Existe uma aresta que representa esse caso
Essa é a implementação correta dos
algoritmos do método de Ford-Fulkerson
Incluindo o Edmonds-Karp
Pode ser facilmente representada com uma matriz de adjacências
Pseudocódigo
Entradas C[1..n][1…n] – a rede (grafo com pesos), dada como
matrix de adjacências
s – fonte (source) t – sumidouro (sink)
Saídas
f – valor do fluxo total (será o máximo, no final)
F[1..n][1..n] – a rede de fluxo, indicando o fluxo em
cada aresta
Temporários importantes
EdmondsKarpMaxFlow(C, s, t)
f := 0 (initial overall flow is zero) F := zero(1..n, 1..n) (starts with zero for all edges) R := copy(C) (starts with a copy of C)
forever
Pred := BreadthFirstSearch(R, s) (paths starting in s)
m = MinimumCapacity(Pred, s, t) (minimum in the path from s to t) if m = -1 (happens only if there is no path)
break
f := f + m (increases the overall flow) v := t
while v ≠ s (traverses the edges of the path, backward) u := Pred[v] (the edge uv is in the path)
F[u,v] := F[u,v] + m (increments the flow in uv) F[v,u] := F[v,u] - m
R[u,v] := R[u,v] – m (reduces the residual capacity of uv) R[v,u] := R[v,u] + m
Exemplo
Mostrar a atualização de f, m e R
em um exemplo pequeno Dois caminhos aumentantes
Complexidade
Método de Ford-Fulkerson: O(E.f)
Onde f é o fluxo máximo do grafo
Assumindo que o caminho é achado
aleatoriamente
Edmonds-Karp: O(VE2)
Em grafos densos: O(V5)
Algoritmo de Dinic (ou Dinitz): O(V2E)
Parecido com o Edmonds-Karp
Outros Algoritmos
Os algoritmos “push-relabel” são
considerados os melhores para o problema de fluxo
O mais importante, tem
complexidade: O(V2√E)
Em grafos densos: O(V3)