Ciência da Computação GRAFOS - paginas.unisul.brpaginas.unisul.br/max.pereira/Grafos Aula...
-
Upload
nguyenliem -
Category
Documents
-
view
217 -
download
0
Transcript of Ciência da Computação GRAFOS - paginas.unisul.brpaginas.unisul.br/max.pereira/Grafos Aula...
Ciência da Computação
GRAFOS
Aula 06 Algoritmo de Caminho Mínimo:
Dijkstra
Max Pereira
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
Publicado em 1959, o algoritmo resolve o problema do caminho mínimo em grafos orientados ou não, sob uma restrição: não pode haver arestas com pesos negativos. A partir de um vértice inicial (origem) o algoritmo calcula o custo mínimo deste vértice para todos os demais vértices.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
Edsger W. Dijkstra (11-05-1930 / 06-08-2002)
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
Edsger W. Dijkstra (11-05-1930 / 06-08-2002)
“What is the shortest way to travel from Rotterdam to Groningen? It is the algorithm for the shortest path which I designed in about 20 minutes. One morning I was shopping with my young fiancée, and tired, we sat down on the café terrace to drink a cup of coffee and I was just thinking about whether I could do this, and I then designed the algorithm for the shortest path.”
Frana, Phil (August 2010). "An Interview with Edsger W. Dijkstra". Communications of the ACM. 53 (8): 41–47
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
Aplicação do algoritmo
Começamos com o vértice u. Os três vértices adjacentes a u são v, w e x. Atribui-se os custos (distâncias) para os vértices e como predecessor o vértice u. Acrescenta-se cada vértice a fila (PQ).
Na sequência examinamos os vértices adjacentes a x (vértice com a menor distância). Para cada vértice adjacente verifica-se se a distância a esse vértice através do x é menor do que a distância anterior.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
Aplicação do algoritmo
No próximo passo verifica-se os vértices adjacentes ao vértice v. Nesse caso, não há mudanças.
Passamos para o vértice y. Aqui verifica-se que é mais “barato” chegar ao vértice w e z através de y. Assim, o ajuste das distâncias é realizado.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
Aplicação do algoritmo
Checamos agora o vértice w. Não há mudanças.
Finalmente vamos para o vértice z. Aqui também não há mudanças. Dessa forma, a fila (PQ) é esvaziada e o algoritmo encerra.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
1) Definir o nó de origem, neste caso s, e incluir este nó em PERM.
Atribuir zero a sua distância (dist[s]) porque o custo de ir de s a s é
obviamente 0. Todos os outros nós i tem suas distâncias (dist[i])
inicializadas com um valor bastante grande ("infinito").
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
2) A partir de s consulta-se os vértices adjacentes a ele, que no grafo
G são u e x. Para todos os vértices adjacentes, que chamaremos z,
calcula-se: Se dist[z] > dist[s] + peso(s, z)
dist[z] = dist[s] + peso(s, z)
path[z] = s
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
3) Dentre todos os vértices não pertencentes a PERM escolhe-se
aquele com a menor distância. Neste caso é o vértice x, pois dist[x]
= 5.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
4) Então, inclui-se x em PERM e a partir de x consulta-se os vértices
adjacentes a ele que não estão em PERM, que no grafo G são u, v e y.
Para todos os vértices adjacentes, que chamaremos z, calcula-se:
Se dist[z] > dist[x] + peso(x, z)
dist[z] = dist[x] + peso(x, z)
path[z] = x
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
5) Dentre todos os vértices não pertencentes a PERM escolhe-se
aquele com a menor distância. Neste caso é o vértice y, pois dist[y] =
7.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
6) Inclui-se então y em PERM e a partir de y consulta-se os vértices
adjacentes a ele que não estão em PERM, que no grafo G é apenas o
vértice v. Se dist[v] > dist[y] + peso(y, v)
dist[v] = dist[y] + peso(y, v)
path[v] = y
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
7) Dentre todos os vértices não pertencentes a PERM escolhe-se
aquele com a menor distância. Neste caso é o vértice u, pois
dist[u] = 8.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
8) Inclui-se então u em PERM e a partir de u consulta-se os vértices
adjacentes a ele que não estão em PERM, que no grafo G é apenas o
vértice v. Se dist[v] > dist[u] + peso(u, v)
dist[v] = dist[u] + peso(u, v)
path[v] = u
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
9) Dentre todos os vértices não pertencentes a PERM escolhe-se
aquele com a menor distância. Neste caso é o único vértice restante
v e dist[v] = 9.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
10) Por fim faz-se v pertencer a PERM. Neste ponto, todos os vértices
já estão em PERM e a busca é finalizada.
Algoritmo de Dijkstra
Ciência da Computação - GRAFOS
Aplicações
Google MapsIP routing
Trabalho 2
Ciência da Computação - GRAFOS
Implementar o algoritmo de Dijkstra:
Entrada: Tipo de grafo: não-orientado ou orientado Valorado - somente arestas Conjunto V Conjunto E Vértice inicial (origem)
Saída: As distâncias e os caminhos entre o vértice de origem e os demais
vértices