Escolar Documentos
Profissional Documentos
Cultura Documentos
Índice
Conceito de rede de transporte
Fluxo máximo numa rede de transporte
Fluxo de custo mínimo numa rede de transporte
Rede de transporte
Modelar fluxos
conservativos entre dois Rede e capacidades Rede e fluxos
pontos através de canais
com capacidade limitada s s
• s: fonte (produtor)
3 2
3 1
• t: poço (consumidor)
1
• Fluxo não pode ultrapassar a a b a
0
b
capacidade da aresta
• Soma dos fluxos de entrada 4 2
num vértice intermédio igual à 3 1
2 1
soma dos fluxos de saída
Exemplos: c d
c d
• Rede de abastecimento de
líquido ponto a ponto
• Tráfego entre dois pontos 2 3
2 2
Em alguns casos, as arestas t
podem ter custos associados t
(custo de transportar uma
unidade de fluxo)
∞ 2 ∞
(ou 3) 1 2
s1 a c t1 (ou 2)
s 2 2 2 t
∞ 3
(ou 5) s2 2 b 5 d 6
t2 ∞
(ou 8)
Problema
Encontrar um fluxo de valor máximo (fluxo total que
parte de s / chega a t)
s s
3 2
3 2
1
a b a 0
b
3 4 2
2 1 2
c d c d
2 3
2 3
t
t
Formalização
Dados de entrada :
cij - capacidade da aresta que vai do nó i a j (0 se não existir)
Dados de saída (variáveis a calcular) :
f ij - fluxo que atravessa a aresta que vai do nó i para o nó j (0 se não existir)
Restrições :
0 ≤ f ij ≤ cij , ∀ij
∑ f =∑ f
j
ij
j
ji , ∀i ≠ s , t
Objectivo :
max ∑ f sj
j
s s s
3 2 0 0 3 2
1 0 1
a b a b a b
3 4 2 0 0 0 3 4 2
c d c d c d
2 3 0 0 2 3
t t t Caminho
seleccionado
(traço forte)
G Gf Gr
Exemplo: 1ª iteração
s s s
3 2 3 0 3 2
1 0 1
a b a b a b
3 4 2 0 3 0 3 1 2
c d c d c 3 d
2 3 0 3 2
3
t t t
G Gf Gr
Se não tivesse as arestas em sentido inverso,
parava aqui com solução não óptima!
Exemplo: 2ª iteração
s s s
3 2 3 2 3 2
1 0 1
a b a b a b
3 4 2 2 1 2 1 3 2
2
c d c d c 1 d
2 3 2 3 2 3
t t t
G Gf Gr
FIM
(valor do fluxo máximo = 5)
Algoritmos em Grafos: Fluxo máximo em redes de transporte – CAL, 2010/11 12
c d c d 2
0/2 0/3
2 3
t t 3
Gf/G Gr
(nivelado)
Exemplo: 1ª iteração
nível
s s s 0
2 2
3/3 0/2
3 1
3 b
0/1 1
a b a b 2
1
1 d 2
0/3 3/4 0/2 3 1 2
3 3
3 a
c d c d 3
c 4
3
0/2 3/3 2 3
2
t t t 5
Gf/G Gr Gr
Não há mais caminhos de s para t
deste nível (comprimento 3) ⇒ RENIVELAR
Exemplo: 2ª iteração
nível
s s 0
2
3/3 2/2
b 1
0/1 3
a b 2
1
d 2
1/4 3
2/3 2/2
1 3
a
c d 1 2
c 3 4
2/2 3/3
2
5
t t
Gf/G Gr
Não há mais caminhos de s para t
deste nível e nível(t) = |V|-1 ⇒ TERMINAR
Passo 5
• O nº máximo de execuções (selecção e aplicação de um caminho de aumento) é o
nº máximo de caminhos de aumento, que é o mesmo que no algoritmo de
Edmonds-Karp, ou seja, O(|E|.|V|) (O(|E|) para cada comprimento,
multiplicado por |V| comprimentos possíveis)
• Cada caminho de aumento pode ser encontrado em tempo O(|V|) no grafo Gr
(ignorando as arestas escondidas) por simples pesquisa em profundidade, pois já
não há que ter a preocupação de encontrar um caminho mais curto
1969
(m = |E|, n = |V|, U = capacidade máxima) T. Asano and Y. Asano: recent developments in Maximum Flow
Algorithms. Journal of the Operations Research, 1 (2000).
Problema
O objectivo é transportar uma certa quantidade F de fluxo (≤ máximo
permitido pela rede) da fonte para o poço, com um custo total mínimo
• Para além da capacidade, arestas têm associado um custo (custo de transportar uma
unidade de fluxo)
• Podem existir arestas de custo negativo (útil em problemas de maximização do valor,
introduzindo sinal negativo)
Fluxo a 3
transportar Fluxo de custo mínimo (= Σwijfij = 5)
(F)
s
3,0 2,0 s
1,-2 3 0
a b
1
4,2 2,2
a b
3,1
2 0 1
c d
c d
2,1 3,1
t 2 1
Custo (wij)
Capacidade (cij) t
Formalização
Dados de entrada :
cij - capacidade da aresta que vai do nó i a j (0 se não existir)
wij - custo de passar uma unidade de fluxo pela aresta (i, j)
F - quantidade de fluxo a passar pela rede
Dados de saída (variáveis a calcular) :
f ij - fluxo que atravessa a aresta que vai do nó i para o nó j (0 se não existir)
Restrições :
0 ≤ f ij ≤ cij , ∀ ij
∑fj
ij = ∑ f ji , ∀i ≠ s ,t
j
∑fj
sj =F
Objectivo :
min ∑ f ij × wij
ij
Próximo custo é 1
• Só que -1 x 0 = 0 …
• Evita-se assim a introdução (quantidade actual do fluxo = 1)
de arestas de custo (custo actual do fluxo = 1)
negativo!
0 c d 1 0 c d 1 c d
1,0 1,0 1,0
2,1 2,0 2,1 0 2,0 2,0 2,0
t t t
1 1
Próximo custo é Σd(t)=1+1=2
Repetição do processo
6. Aplicar o caminho de aumento de custo 0
• Actualiza-se o grafo de resíduos
3,0 s
2,1
1,1
a b
Quantidade actual de fluxo = 3
2,0 1,0 1,0 = pretendido => FIM
1,0
4,1
c d
Custo actual do fluxo = 5
1,0
2,0 2,0
t
Eficiência *
Primeira redução do grafo de resíduos: O(|V| |E|) pelo algoritmo de
Bellman-Ford
Subsequentes reduções do grafo de resíduos e determinação do caminho
de aumento de custo mínimo: O(|E| log |V|) pelo algoritmo de Dijkstra
Se todas as grandezas forem inteiras, o nº máximo de iterações é F (≤
|E|), pois em cada iteração o valor do fluxo é incrementado de uma
unidade
Tempo total fica O(F |E| log|V|) usando heap binário (2-heap)
Pode ser melhorado para O(F |E| log|E|/|V|+1V|) usando d-heap em que
d = |E|/|V|+1 (nº de filhos de cada nó do heap), de acordo com o
seguinte teorema:
• Teorema (Johnson 1977): Seja d = m/n+1. Um d-heap suporta m operações do
tipo 1 (insert/decreaseKey) e n operações de tipo 2 (delete) em tempo O(m
logdn) (neste caso fazemos n=|V| e m=|E|)