7 Caminho Minimo
7 Caminho Minimo
http://algs4.cs.princeton.edu
Caminhos mínimos em um dígrafo valorado
edge-weighted digraph
4->5 0.35
5->4 0.35
4->7 0.37
5->7 0.28
7->5 0.28
5->1 0.32
0->4 0.38
0->2 0.26
7->3 0.39 shortest path from 0 to 6
1->3 0.29
0->2 0.26
2->7 0.34
2->7 0.34
6->2 0.40
7->3 0.39
3->6 0.52
3->6 0.52
6->0 0.58
6->4 0.93
2
Google maps
3
Aplicações de caminho mínimo
PERT/CPM.
Rotas em mapas.
Seam carving.
Mapeamento de textura.
Navegação de robôs.
http://en.wikipedia.org/wiki/Seam_carving
Typesetting em TeX.
Planejamento de tráfego urbano.
Pipelining ótimo de chip VLSI.
Agendamento de operadores de telemarketing.
Roteamento de mensagens.
Protocolos de roteamento em rede (OSPF, BGP, RIP).
Exploração de oportunidades de câmbio.
Roteamento ótimo de caminhões considerando congestionamentos.
Reference: Network Flows: Theory, Algorithms, and Applications, R. K. Ahuja, T. L. Magnanti, and J. B. Orlin, Prentice Hall, 1993.
4
Variantes de caminho mínimo
Quais vértices?
Single source: de um vértice s para todos os demais.
Single sink: de cada vértice para um vértice específico t.
Source-sink: de um vértice s para outro t.
All pairs: entre todos os pares de vértice.
Ciclos?
Sem ciclos dirigidos.
Sem “ciclos negativos”. Qual variante?
http://algs4.cs.princeton.edu
API de arestas dirigidas e valoradas
weight
v w
7
Implementação em Java:
9
Dígrafo valorado: listas de adjacência
tinyEWD.txt
V 0 2 .26 0 4 .38
8 E
15
4 5 0.35 1 3 .29
adj
5 4 0.35
0
4 7 0.37 2 7 .34 Bag objects
5 7 0.28 1
7 5 0.28 2
5 1 0.32 3 6 .52 reference to a
3 DirectedEdge
0 4 0.38
0 2 0.26 4 object
4 7 .37 4 5 .35
7 3 0.39 5
1 3 0.29
6
2 7 0.34 5 1 .32 5 7 .28 5 4 .35
6 2 0.40 7
3 6 0.52
6 4 .93 6 0 .58 6 2 .40
6 0 0.58
6 4 0.93
7 3 .39 7 5 .28
10
Dígrafo valorado: listas de adjacência (implementação em Java)
public EdgeWeightedDigraph(int V)
{
this.V = V;
adj = (Bag<DirectedEdge>[]) new Bag[V];
for (int v = 0; v < V; v++)
adj[v] = new Bag<DirectedEdge>();
}
public class SP
12
API para caminho mínimo single-source
public class SP
% java SP tinyEWD.txt 0
0 to 0 (0.00):
0 to 1 (1.05): 0->4 0.38 4->5 0.35 5->1 0.32
0 to 2 (0.26): 0->2 0.26
0 to 3 (0.99): 0->2 0.26 2->7 0.34 7->3 0.39
0 to 4 (0.38): 0->4 0.38
0 to 5 (0.73): 0->4 0.38 4->5 0.35
0 to 6 (1.51): 0->2 0.26 2->7 0.34 7->3 0.39 3->6 0.52
0 to 7 (0.60): 0->2 0.26 2->7 0.34
13
4.4 C AMINHOS M ÍNIMOS
‣ APIs
‣ Propriedades de caminhos mínimos
‣ Algoritmo de Dijkstra
Algorithms
‣ DAGs valorados
‣ Pesos negativos
R OBERT S EDGEWICK | K EVIN W AYNE
http://algs4.cs.princeton.edu
Estruturas de dados para caminhos mínimos single-source
Obs: Uma solução de árvore de caminhos mínimos (SPT) existe. Por que?
edgeTo[] distTo[]
edgeTo[] distTo[]
0 null 0
0 null 0
1 1
5->1 0.32
5->1 0.32
1.05
1.05
2 2 0->2
0->20.26
0.26 0.26
0.26
3 3 7->3
7->30.37
0.37 0.97
0.97
4 4 0->4
0->40.38
0.38 0.38
0.38
5 5 4->5
4->50.35
0.35 0.73
0.73
6 3->6 0.52 1.49
6 3->6 0.52 1.49
7 2->7 0.34 0.60
7 2->7 0.34 0.60
SPT a partir deShortest
0 paths data structures
Representação pai-link
Shortest paths data structures
15
Estruturas de dados para caminhos mínimos single-source
Obs: Uma solução de árvore de caminhos mínimos (SPT) existe. Por que?
v 3.1
1.3
s
w 7.2 4.4
Arestas pretas
estão em edgeTo[]
17
“Relaxamento" de arestas
18
4.4 C AMINHOS M ÍNIMOS
‣ APIs
‣ Propriedades de caminhos mínimos
‣ Algoritmo de Dijkstra
Algorithms
‣ DAGs valorados
‣ Pesos negativos
R OBERT S EDGEWICK | K EVIN W AYNE
http://algs4.cs.princeton.edu
Edsger W. Dijkstra: algumas frases…
21
Demonstração do algoritmo de Dijkstra
1 15 3 0→1 5.0
0→4 9.0
5
4 0→7 8.0
12
s 0 3 1→2 12.0
8 1→3 15.0
7 2 9
7 1→7 4.0
9 2→3 3.0
6 1
11 2→6 11.0
5
5 3→6 9.0
4 13 4→5 4.0
4→6 20.0
4 20 6
4→7 5.0
5→2 1.0
5→6 13.0
Um dígrafo valorado 7→5 6.0
7→2 7.0
22
Demonstração do algoritmo de Dijkstra
1 3
v distTo[] edgeTo[]
0 0.0 -
s 0 1 5.0 0→1
2 14.0 5→2
7 2 3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
23
Visualização do algoritmo de Dijkstra
24
Visualização do algoritmo de Dijkstra
25
Algoritmo de Dijkstra: implementação em Java
pq.insert(s, 0.0);
while (!pq.isEmpty()) {
int v = pq.delMin(); relaxa vértices em ordem
de distância de s
for (DirectedEdge e : G.adj(v))
relax(e);
}
}
}
26
Algoritmo de Dijkstra: implementação em Java
27
Algoritmo de Dijkstra: qual fila de prioridade?
Array desordenado 1 V 1 V2
Heap de Fibonacci
1† log V † 1† E + V log V
† amortizado
Em resumo:.
Implementação de array é a melhor para grafos densos.
Heap binário é muito mais rápido para grafos esparsos.
Heap 4-way é indicado para situações de alta performance
Heap de Fibonacci é a melhor na teoria, mas na prática…
28
Calculando uma árvore geradora em um grafo
29
4.4 C AMINHOS M ÍNIMOS
‣ APIs
‣ Propriedades de caminhos mínimos
‣ Algoritmo de Dijkstra
Algorithms
‣ DAGs valorados
‣ Pesos negativos
R OBERT S EDGEWICK | K EVIN W AYNE
http://algs4.cs.princeton.edu
Dígrafos acíclicos e valorados
1 15 3
5
4
12
s 0 3
8
7 2 9
7
9 6 1
11
5
5
4 13
4 20 6
R: Sim!
31
Demonstração de caminhos mínimos em DAG
0→1 5.0
0→4 9.0
1 15 3
0→7 8.0
5 1→2 12.0
4
12
s 0 3 1→3 15.0
8 1→7 4.0
7 2 9
7
2→3 3.0
9 6 2→6 11.0
1
11
5 3→6 9.0
5 4→5 4.0
4 13
4→6 20.0
4 20 6 4→7 5.0
5→2 1.0
5→6 13.0
Um DAG valorado 7→5 6.0
7→2 7.0
32
Demonstração de caminhos mínimos em DAG
0 1 4 7 5 2 3 6
1 3
v distTo[] edgeTo[]
0 0.0 -
s 0 1 5.0 0→1
2 14.0 5→2
7 2
3 17.0 2→3
4 9.0 0→4
5 13.0 4→5
5 6 25.0 2→6
7 8.0 0→7
4 6
33
Implementação de caminhos mínimos em DAG
34
Redimensionamento baseado em conteúdo
http://www.youtube.com/watch?v=vIFCV2spKtg
35
Redimensionamento baseado em conteúdo
37
Redimensionamento baseado em conteúdo
38
Redimensionamento baseado em conteúdo
seam
39
Redimensionamento baseado em conteúdo
40
Caminho máximo em DAGs valorados
Negativar novamente.
42
Resumo: custo dos algoritmos de caminho mínimo single source
Sem ciclos
Ordenação topológica dirigidos E+V E+V V
Bellman-Ford EV EV V
Sem ciclos
negativos
Bellman-Ford
E+V EV V
(queue-based)
43