A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Algoritmo de Caminho Mínimo

Cópias: 1
CC/EC/PPGI/UFES CC/EC/MestradoTeoria dos Grafos Algoritmo de Caminho Mínimo.

Apresentações semelhantes


Apresentação em tema: "Algoritmo de Caminho Mínimo"— Transcrição da apresentação:

1 Algoritmo de Caminho Mínimo
CC/EC/Mestrado Teoria dos Grafos 1

2 Algoritmo de Dijkstra Resolve o problema com um vértice-fonte em grafos cujas arestas tenham peso maior ou igual a zero. Este algoritmo é capaz de determinar o caminho mínimo, a partir de um vértice inicial v, para todos os outros vértices do grafo. CC/EC/Mestrado Teoria dos Grafos 2

3 Algoritmo de Dijkstra vINI = vértice inicial d(vINI, vINI) = 0
d(vINI, i) = INFINITO, i, i  V – {vINI} fechado =  aberto = V anterior(i) = 0, i, i  V enquanto(aberto ≠ ) { k = vértice pertencente a aberto, mais próximo do vértice inicial fechado = fechado  k; aberto = aberto – k; para cada vizinho i de k que está em aberto faça{ custo = min{d(vINI, i), d(vINI,k) + c(k,i)} se (custo < d(vINI, i)) então d(vINI, i) = custo; anterior(i) = k } CC/EC/Mestrado Teoria dos Grafos 3

4 Execução fim do algoritmo 1. o grafo inicial
7. 2 é o vértice de menor custo; fechado = fechado+{2} 13. 6 é o vértice de menor custo; fechado = fechado+{6} 2. inicializando os custos 8. examinando os vértices vizinhos ao 2 14. fim alcançado fim do algoritmo 3. atualizando o conjunto fechado 9. 4 é o vértice de menor custo; fechado = fechado+{4} 4. examinando os vértices vizinhos ao 1 que estão em aberto 10. examinando os vértices vizinhos ao 4 5. 3 é o vértice de menor custo; fechado = fechado+{3} 11. 5 é o vértice de menor custo; fechado = fechado+{5} 6. examinando os vértices vizinhos ao 3 12. examinando os vértices vizinhos ao 5 CC/EC/Mestrado Teoria dos Grafos 4

5 Outros algoritmos de caminho mínimo
Algoritmo de Bellmann-Ford Algoritmo de Floyd CC/EC/Mestrado Teoria dos Grafos 5

6 Algoritmo de Bellmann-Ford
Entrada: matriz de pesos das arestas c(i, j) de G = (V,E) 1. v_inicial ← vértice inicial; 2. d(v_inicial, v_inicial)←0; 3. d(v_inicial, i)←INFINITO,para todo i de V – v_inicial 4. anterior(i)←0, para todo i de V 5. enquanto  (j, i) de E tal que d(v_inicial, i) > d(v_inicial, j) + c(j, i) faça d(v_inicial, i) ← d(v_inicial, j) + c(j, i) anterior(i) ← j 8. fim-enquanto {j,i} 1 3 2 -8 10 (1,2) (2,1) (1,3) (3,1) (3,2) (1,2) (2,1) (1,3) (3,1) (2,3) (3,2) {1,2} {1,3} {2,3} 1 2 3 d(1, i) anterior(i) 3 -13 -29 3 2 10 -21 -5 10 1 2 2 1 1 1 1 2 1 CC/EC/Mestrado Teoria dos Grafos 6

7 Caminhos mais Curtos Caminho mais curto entre todos os pares de nós de um grafo Dados: Grafo G=(V, A), |V | = n. Não há circuitos negativos. c = {cij}, j = 1,...,n, i = 1,...,n cij ≥ 0 cii = 0 cij = +, (i, j )  A Ak(i, j ) = valor do caminho mais curto de i a j podendo usar apenas nós numerados de 1 a k como nós intermediários.

8 Caminhos mais Curtos A0(i, j ) = cij : caminho mais curto de i a j usando no máximo o nó “0” (que não existe) como nó intermediário (caminho mais curto de i a j sem nós intermediários) Ak(i, j ) : pode usar o nó k ou não. Ak+1(i, j ) : pode usar o nó k+1 ou não. A0  A1 A1  A2 ... An-1  An An(i, j ) = valor do caminho mais curto de i a j podendo usar qualquer nó de 1 a n como nó intermediário.

9 Caminhos mais Curtos Se Ak+1(i, j ) não usa o nó k+1 como intermediário, então: Ak+1(i, j ) = Ak(i, j ) Se Ak+1(i, j ) usa o nó k+1 como intermediário, então: Ak+1(i, j ) = Ak(i, k+1) + Ak(k+1, j ) Ak+1(i, j ) = min { Ak(i, j ), Ak(i, k+1) + Ak(k+1, j ) }

10 Caminhos mais Curtos Algoritmo de Floyd: Para i = 1,...,n faça
Para j = 1,...,n faça A0(i,j)  cij fim-para Para k = 1,...,n faça Ak(i,j)  min{Ak-1(i,j), Ak-1(i,k) + Ak-1(k,j)}

11 Caminhos mais Curtos Exemplo: +∞ 3 2 6 11 4 +∞ 3 2 6 11 4 7 3 2 6 11 4
+∞ 3 2 6 11 4 C = +∞ 3 2 6 11 4 A0 = 7 3 2 6 11 4 A1 = 7 3 2 6 4 A2 = 7 3 2 5 6 4 A3 =

12 Caminhos mais Curtos Algoritmo de Dijkstra: número de operações (tempo) ~ n2 n-1 iterações, cada iteração busca o mínimo em uma lista com até n-1 elementos Algoritmo de Floyd: número de operações (tempo) ~ n3 Três comandos for de 1 até n um dentro do outro Ou seja, o problema de calcular os caminhos mais curtos entre todos os pares de nós pode ser resolvido com a mesma eficiência aplicando-se n vezes o algoritmo de Dijkstra, uma vez a partir de cada nó inicial.

13 Floyd em grafos não direcionados?
Como aplicar o algoritmo de Floyd no grafo abaixo? 1 3 2 -8 10


Carregar ppt "Algoritmo de Caminho Mínimo"

Apresentações semelhantes


Anúncios Google