Escolar Documentos
Profissional Documentos
Cultura Documentos
Fluxo Máximo
Árvores Geradoras Mínimas
Túlio Toffolo – www.toffolo.com.br
Marco Antônio Carvalho – marco.opt@gmail.com
BCC402 – Aula 14
Algoritmos e Programação Avançada
Plano da Aula
• Fluxo Máximo
• Algoritmo de Ford Fulkerson
2
CAMINHOS
PROGRAMAÇÃO
MAIS CURTOS
DE TRIPULAÇÕES
Caminhos mais Curtos
4
Caminhos mais Curtos
2 4 4 4
8
F I
5 5 2 5
A K
C 4
4 2
7 4
2 4
D G J
Solução: A–D–G–I–K
custo = 7 + 2 + 2 + 5 = 16
5
Caminhos mais Curtos
• Condição de existência:
Caminho de i a j contendo um circuito w:
k
j
i
Comprimento do caminho =
comprimento (i → k) +
comprimento (w) +
comprimento (k → j)
6
Caminhos mais Curtos
Condição de existência:
não há circuitos de comprimento negativo.
7
Caminhos mais Curtos
8
Caminhos mais Curtos
S ∩S =φ
S ∪ S =V
9
Caminhos mais Curtos
cai π (i )
π (b )
i
1 b
cbi
π (c )
cci
c
S S
10
Caminhos mais Curtos
11
Caminhos mais Curtos
12
PROGRAMAÇÃO
CAMINHOS MAIS CURTOS
ALGORITMO DE DIJKSTRA
DE TRIPULAÇÕES
Caminhos mais Curtos
Algoritmo de Moore-Dijkstra
Inicializar S ← {2,3,...,n},
S ← {1},
π(1)← 0,
π(j)← c1j se j∈Γ1+
+∞ caso contrário
Enquanto S ≠ ∅ faça
Selecionar j∈S tal que π(j)= mini∈S{π(i)}
S ← S – {j}
Para ∀i∈S e i∈Γj+ faça
π(i) ← min{π(i), π(j)+cji}
fim_enquanto
14
Caminhos mais Curtos
15
Caminhos mais Curtos
Exemplo:
4 S = {1}
4 5 S = {2,3,4,5,6}
2
2 5
7 π(1) = 0
1
1 5
2
3 π(2) = 7
1 π(3) = 1
3 6
7 π(4) = π(5) = π(6) = +∞
ITERAÇÃO 1
4
4 5 j=3
2 2 5 S = {2,4,5,6}
7
π*(1) = 0 1 π(2) = min{7, 1+5} = 6
2
1 5 3
π(5) = min{∞, 1+2} = 3
1
3 6 π(6) = min{∞, 1+7} = 8
7
π*(3) = 1
16
Caminhos mais Curtos
4 ITERAÇÃO 2
4 5
π*(5) = 3
2
2 5 j=5
7
π*(1) = 0 1 S = {2,4,6}
2
1 5 3 π(2) = min{6, 3+2} = 5
1 π(4) = min{∞, 3+5} = 8
3 6
7
π*(3) = 1
4 ITERAÇÃO 3
4 5
π*(2) = 5 π*(5) = 3
2
2 5 j=2
7 S = {4,6}
π*(1) = 0 1 2
1 5 3 π(4) = min{8, 5+4} = 8
1 π(6) = min{∞, 5+1} = 6
3 6
7
π*(3) = 1
17
Caminhos mais Curtos
4
4 5 ITERAÇÃO 4
π*(2) = 5 π*(5) = 3
2
2 5
7 j=6
π*(1) = 0 1
1 5
2 S = {4}
3
π(4) = 8
1
3 6
7
π*(3) = 1 π*(6) = 6
π*(4) = 8
4 ITERAÇÃO 5
4 5
π*(2) = 5 π*(5) = 3
2
2 5
7 j=4
π*(1) = 0
1
1 2 S={}
5 3
1
3 6
7
π*(3) = 1 π*(6) = 6
18
Caminhos mais Curtos
3 3
2 5 6
4
1 2
1 5 2 3 1
2
3 4 7
3 4
π
Iteração
nó Início 1 2 3 4 5 6
1 0 0 0 0 0 0 0
2 4 4 4 4 4 4 4
3 2 2 2 2 2 2 2
4 ∞
5 5 5 5 5 5
5 ∞
4 4 4 4 4 4
6 ∞ ∞ 7 7 7 7 7
7 ∞ ∞ 7 7 7 7 7
19
Caminhos mais Curtos
3
3
Caminho mais curto de 1 a 3? 2
1 -8 Resultado do algoritmo? 3
10 Por que?
2
20
Caminhos mais Curtos
Inicializar S ← {2,3,...,n},
S ← {1},
π(1)← 0,
π(j)← c1j se j∈Γ1+
+∞ caso contrário
Enquanto S ≠ ∅ faça
Selecionar j∈S tal que π(j)= mini∈S{π(i)}
S ← S – {j}
Para ∀i∈Γj+ faça
Calcular π* ← π(j)+ cji
Se π* < π(i) então
S ← S ∪ {i}
π(i) ← π*
fim-se
fim-para
fim-enquanto
21
PROGRAMAÇÃO
CAMINHOS MAIS CURTOS
ALGORITMO DE FLOYD
DE TRIPULAÇÕES
Caminhos mais Curtos
• Dados:
Grafo G=(V, A) orientado, |V | = n.
Não há circuitos negativos.
c = {cij}, j = 1,...,n, i = 1,...,n
cij ≥ 0
cii = 0
cij = +∞, (i, j ) ∉ A
23
Caminhos mais Curtos
24
Caminhos mais Curtos
Ak+1(i, j ) = Ak(i, j )
25
Caminhos mais Curtos
Algoritmo de Floyd:
26
Caminhos mais Curtos
Exemplo:
6
0 4 11 0 4 11
1 2
4 C = 6 0 2 A0 = 6 0 2
3 11 2 3 +∞ 0 3 +∞ 0
3
0 4 11 0 4 6 0 4 6
A1 = 6 0 2 A2 = 6 0 2 A3 = 5 0 2
3 7 0 3 7 0 3 7 0
Teoriade Grafos 27
Caminhos mais Curtos
28
Otimizações: uso de Heaps
fonte f sumidouro
S P
31
Problema do Fluxo Máximo
S P
Exemplo: a capacidades c
1, 1 0, 5
fluxos f
S 1, 2 P
3, 3
2, 4
b
3, ∞
32
Problema do Fluxo Máximo
v, x = S
∑ f (u ) − ∑ f (u ) = 0, ∀x ≠ S, ∀x ≠ P
u I u x
: ( )= uT u x
: ( )=
-v, x ≠ P
u
I(u) T(u)
∑ f (u ) − ∑ f (u ) = 0, ∀x ∈ X
uI u x
: ( )= uT u x
: ( )=
33
Problema do Fluxo Máximo
Exemplo:
a c
2
∞
∞
3 1
S 1 e 1 P
2 7
∞
5 ∞
b d
8 7 8 7
34
FLUXO MÁXIMO
ALGORITMO DE
FORD FULKERSON
Problema do Fluxo Máximo
Iteração:
Determinar um caminho C de S a P ao longo do
qual nenhum arco esteja saturado.
(isto é, f(u) = c(u))
Circuito Γ = C ∪ {(P,S)}
Aumentar o fluxo ao longo dos arcos de Γ do
valor δ = minu∈Γ[c(u)-f(u)]
36
Problema do Fluxo Máximo
Exemplo: a
1
1 5
S 2 P
1
3
4
b 32
1
2
3
37
Problema do Fluxo Máximo
f(u) c(u)
Exemplo:
a
1, 1 Γ+ 1
0, 5
X
+1
1,
X 2 Γ
- P
S 0 Γ
-1
+1
Γ+
2,
X 4
3, 3
3 b
Γ+
+1 3,
X ∞
4
δ1 = 2
δ=1
δ2 = 1
39
Problema do Fluxo Máximo
Algoritmo
u
" Rotulação direta: x y
40
Problema do Fluxo Máximo
u
" Rotulação inversa: x y
41
Problema do Fluxo Máximo
ROTULAR(f,δ,A,Y)
δ, δ(S) ← +∞
Y ← {S}
Enquanto P ∉ Y e δ > 0 faça
Se ∃u =(x,y): x ∈ Y, y ∉ Y e f(u) < c(u) então
Y ← Y ∪ {y}
A(y) ← u
δ(y) ← min {δ(x), c(u)-f(u)}
Senão
Se ∃u =(y,x): x ∈ Y, y ∉ Y e f(u) > 0 então
Y ← Y ∪ {y}
A(y) ← u
δ(y) ← min {δ(x), f(u)}
Senão
δ ← 0
fim-enquanto
Se P ∈ Y então δ ← δ(P)
FIM-ROTULAR
42
Problema do Fluxo Máximo
ALTERAR_FLUXOS(f,δ,A)
x ← P
f(P,S) ← f(P,S) + δ
Enquanto x ≠ S faça
u ← A(x)
Se x = T(u) então
f(u) ← f(u) + δ
x ← I(u)
Senão
f(u) ← f(u) - δ
x ← T(u)
fim-enquanto
FIM-ALTERAR_FLUXOS
43
Problema do Fluxo Máximo
a
1, 1
Exemplo: 1,
0, 5
S 1, 2
0, P
3, 3
2,
3, 4
b
3, ∞
4,
Marcação: f(P,S) = 4
δ(S) = +∞
Y = {S} A(S) = (P,S)
f(a,P) = 1
δ(b) = 2 Y = {S, b} A(b) = (S,b)
f(a,b) = 0
δ(a) = 1 Y = {S, b, a} A(a) = (a,b)
f(S,b) = 3
δ(P) = 1 Y = {S, b, a, P} A(P) = (a,P)
f(S,a) = 1
δ=1
f(b,P) = 3
44
Problema do Fluxo Máximo
a
1, 1
Exemplo: 1, 5
S 0, 2 P
3, 3
3, 4
b
4, ∞
Marcação:
δ(S) = +∞
Y = {S}
δ(b) = 1 Y = {S, b}
δ = 0, P ∉ Y FIM
45
Problema do Fluxo Máximo
15 15
2 6
Exemplo: 15
15
20 4 15
5
1 12 5 7
8
6 8
10 8
3 4 8
9 12
15
∞
δ(1) = +∞
Y = {1} A(1) = (7,1)
f(6,7) = 15
δ(2) = 20 Y = {1, 2} A(2) = (1,2)
f(2,6) = 15
δ(6) = 15 Y = {1, 2, 6} A(6) = (2,6)
f(1,2) = 15
δ(7) = 15 Y = {1, 2, 6, 7} A(7) = (6,7)
f(7,1) = 15
δ = 15
46
Problema do Fluxo Máximo
15 15
2 6
Exemplo: 15
15
20 4 15
5
12 5 7
1 8
6 8 8
10 8
8
8 8
3 4 8
9 12
15
23
∞
δ(1) = +∞
Y = {1} A(1) = (7,1)
f(8,7) = 8
δ(3) = 10 Y = {1, 3} A(3) = (1,3)
f(4,8) = 8
δ(4) = 9 Y = {1, 3, 4} A(4) = (3,4)
f(3,4) = 8
δ(8) = 9 Y = {1, 3, 4, 8} A(8) = (4,8)
f(1,3) = 8
δ(7) = 8 Y = {1, 3, 4, 8, 7} A(7) = (8,7)
f(7,1) = 23
δ=8
47
Problema do Fluxo Máximo
15 15
2 6
Exemplo: 15
20
15
20 4 15
5
12 5 7
1 5 8
5 5
6 8 8
10 8
8
8 8
3 4 8
9 12
23
28
∞
δ(1) = +∞
Y = {1} A(1) = (7,1)
f(5,7) = 5
δ(2) = 5 Y = {1, 2} A(2) = (1,2)
f(3,5) = 5
δ(3) = 5 Y = {1, 2, 3} A(3) = (2,3)
f(2,3) = 5
δ(5) = 5 Y = {1, 2, 3, 5} A(5) = (3,5)
f(1,2) = 20
δ(7) = 5 Y = {1, 2, 3, 5, 7} A(7) = (5,7)
δ=5 f(7,1) = 28
48
Problema do Fluxo Máximo
15 15
2 6
Exemplo: 20
15
20 4 15
5
12 5 7
1 7
5 8
5 5
7
6 8 8
10 8
10
8
8 8
3 4 8
9 12
28
30
δ(1) = +∞
Y = {1} A(1) = (7,1)
f(5,7) = 7
δ(3) = 2 Y = {1, 3} A(3) = (1,3)
f(3,5) = 7
δ(5) = 2 Y = {1, 3, 5} A(5) = (3,5)
f(1,3) = 10
δ(7) = 2 Y = {1, 3, 5, 7} A(7) = (5,7)
δ=2 f(7,1) = 30
49
Problema do Fluxo Máximo
15 15
2 6
Exemplo: 20
20
15
4 15
5
12 5 7
1 7 8
5 7
6 8 8
10 8
10
8 8
3 4 8
9 12
30
∞
δ(1) = +∞
Y = {1}
δ = 0, P ∉ Y FIM
50
Problema do Fluxo Máximo
C = { u ∈ U: I(u) ∈ Y, T(u) ∉ Y }
51
Problema do Fluxo Máximo
" Teorema:
fluxo viável f
f(P,S) ≤ c(C)
corte C
Y Y
f sp = f ps + f (P , S )
fS
S
P f ps ≥ 0 ⇒ f (P , S ) ≤ f sp = ∑ f (u )
P
u C
fP
∈
≤ ∑ c (u ) = c (C )
S
u C
∈
52
Problema do Fluxo Máximo
• Corolário:
Quando o algoritmo de rotulação termina com um fluxo f sem que
seja possível marcar o nó P, f é a solução ótima do problema de
fluxo máximo de S a P.
P∉Y
u T(u)
f(u) = c(u),
Y Y senão a extremidade u
estaria marcada
u I(u) f(u) = 0,
senão a extremidade u
Y Y
estaria marcada
53
Problema do Fluxo Máximo
• Corolário:
Se as capacidades são inteiras, então o algoritmo de Ford e
Fulkerson obtém em um número finito de iterações uma solução
ótima do problema de fluxo máximo.
54
Problema do Fluxo Máximo
• Teorema:
15 15
Exemplo: 2 6
20
20 15
4 15
5
12 5 7
1 7 8
5 7
6 8 8
10 8
10
8 8
3 4 8
9 12
30
∞
Corte mínimo
Capacidade = 30 δ(1) = +∞
Y = {1}
Fluxo máximo = 30
δ = 0, P ∉ Y FIM
56
ÁRVORES
PROGRAMAÇÃO
GERADORAS
DE TRIPULAÇÕES
MÍNIMAS
Introdução
• Objetivos
• Obtenção de uma árvore em um grafo conexo, com arestas
valoradas, de tal forma que a soma dos custos das arestas
seja mínimo
Principais Algoritmos
Algoritmo de Boruvka
7 21 6
14 1
4
30 10 9
PROGRAMAÇÃO
ÁRVORES GERADORAS MÍNIMAS
ALGORITMO DE KRUSKAL
DE TRIPULAÇÕES
Algoritmo de Kruskal
• Idéia do algoritmo:
• Aresta de menor peso sempre pertence à árvore
geradora de peso mínimo
17
7
7 11
2
9
12
10
Variação do Algoritmo de Kruskal
• Idéia do algoritmo:
• Se a aresta de menor peso sempre pertence à
árvore geradora de peso mínimo, então a aresta de
maior peso não pertence, se o número de arestas
for maior que n-1
• Complexidade: O(A*log A)
• Gargalo: ordenação das arestas
Variação do Algoritmo de Kruskal
17
7
7 11
2
9
12
10
Algoritmo de Kruskal
• Principais desvantagens:
• O método exige uma “etapa preparação”, por
exemplo, em caso de representação por listas de
adjacência
• Grande consumo de memória
PROGRAMAÇÃO
ÁRVORES GERADORAS MÍNIMAS
ALGORITMO DE PRIM
DE TRIPULAÇÕES
Algoritmo de Prim
• Idéia do algoritmo:
• Inicia com uma árvore formada apenas por um nó
qualquer do grafo, ou pela aresta de peso mínimo.
• A cada iteração, adiciona a aresta de menor peso que
conecta um nó já conectado a um nó ainda não
conectado
17
7
7
2 11
9
12
10
PROGRAMAÇÃO
ÁRVORES GERADORAS MÍNIMAS
OTIMIZAÇÕES
DE TRIPULAÇÕES
Implementações
• Grafos esparsos
• Consumo de memória
Resultados da Literatura
• Tempo de execução
Perguntas?
85