Você está na página 1de 4

Caminho Mnimo: Algoritmo Dijikstra

Geovani Silva Celebrim1 , Juliane Marinho da Silva2 , Lus Paulo Cavalcante3 ,


Orientador: Leandro G. M. Alvim4
1

Departamento de Ciencia da Computaca o


Universidade Federal Rural do Rio de Janeiro (UFRRJ)
R. Governador Roberto Silveira S/N Nova Iguacu
Rio de Janeiro RJ Brasil
geovanicelebrim@hotmail.com, julianefrrj@gmail.com, lpcc@hotmail.com

Abstract. Throughout this article, it is been done an analyses of Dijkstra algorithm and its efficiency on solving the shortest path problem. Computational
tests were made in order to verify the execution of the algorithm and its efficiency with graphs with distinct numbers of vertex and weights. At the end it is
done a analyses of the obtained results and a conclusion.
Resumo. Ao longo deste artigo e realizada uma analise do algoritmo de Dijkstra e sua eficacia na resoluca o do problema do caminho mnimo. Testes computacionais foram realizados a fim de se verificar a execuca o do algoritmo e sua
eficiencia com grafos de diferentes numeros de arestas e pesos. Ao final e feita
uma analise dos resultados obtidos e uma conclusao.

1. Introduca o
Um dos principais problemas que a Ciencia da Computaca o propoe-se a resolver e o
problema do Caminho Mnimo. Este problema consiste em encontrar, dado um grafo,
o menor caminho de um vertice a todos os outros. Possuindo aplicaco es em diversos
problemas que ocorrem nas a reas de transporte,logstica, redes de computadores e de
telecomunicaco es entre outros.
Um dos algoritmos propostos pela Ciencia da Computaca o para resolver este problema e o Algoritmo de Dijkstra.Desenvolvido pelo Cientista da Computaca o Edsger
Dijkstra em 1956 e publicado em 1959, este algoritmo soluciona o problema do caminho mnimo em um grafo valorado direcionado G = (V,E) para o caso de todas as suas
arestas possurem pesos nao negativos.
Neste artigo sera discutida a eficiencia do algoritmo atraves do teste de corretude,
analise algortmica e testes computacionais realizados com diferentes tipos de grafos. Na
seca o 2, sera feita uma breve descrica o do problema. Na seca o 3, descreveremos o objetivo do problema. Na seca o 4, apresentaremos o algoritmo, a demonstraca o da corretude
e a analise de sua complexidade. Na seca o 5, sao apresentados testes computacionais a
fim de demonstrar seu custo com diferentes tipos de grafo. Por fim, na seca o 6, sera feita
uma pequena analise dos resultados obtidos na seca o anterior.

2. Problema e Motivaca o
Encontrar a rota mais curta possvel do Rio de Janeiro a Sao
Paulo[Cormen 2002].Calcular caminho mais curto entre cidades com o Dijikstra e

calcular a distancia de grafos com pesos sempre maior que zero. O problema do caminho
mnimo consiste em encontrar um caminho entre dois vertices u e v em um grafo
direcionado e valorado cuja soma dos pesos das arestas seja mnimo. Este problema
poderia ser resolvido utilizando o algoritmo de Busca em Largura. Contudo, este metodo
nao assegura que, no caso de um grafo com arestas de peso diferente de 1, o caminho
entre dois vertices seja o mnimo. Para tanto, e necessario, pois, um mecanismo que
garanta que, a cada vertice visitado, a soma das distancias dos vertices predecessores a
este seja a menor possvel.

3. Objetivo
O trabalho visa a implementaca o do algoritmo Dijkstra utilizando heap como fila de prioridade para encontrar o caminho mnimo com custo computacional baixo e tambem visa
obter resultados para diferentes tipos de entrada para o algoritmo.

4. Proposta
4.1. O Algoritmo de Dijkstra
Como fora dito na introduca o deste arquivo, o algoritmo de Dijkstra resolve o problema
do caminho mnimo em um grafo G = (V, E) para o caso de suas arestas possurem
pesos nao negativos. Com uma boa implementaca o, o tempo de execuca o do algoritmo de
Dijkstra e menor do que uma outra alternativa para o problema:o algoritmo de BellmondFord.
O algoritmo mantem um conjunto S de vertices cujos pesos do caminho mnimo
final a partir da aresta s ja esta determinado. Repetitivamente, o algoritmo seleciona um
vertice u em V S com o menor caminho mnimo esperado, adiciona u V S, e relaxa
todos os vertices que partem de u. Para a implementaca o estudada neste artigo, utilizouse uma fila de prioridades (heap) Q. Abaixo, o algoritmo em pseudocodigo, sendo w o
peso da aresta, s, a aresta inicial, d, a soma das distancias dos vertices predecessores e
o predecessor do vertice em questao:
Dijkstra(G, w, s)
1. para cada vertice v G.V
2. v.d =
3. v. = N IL
4. s.d = 0
5. S =
6. Q = G.V
7. enquanto Q 6=
8. u = extrairMin{Q}
9. S = S {u}
10. para cada vertice v G.adj[u]
11. relaxar(u, v, w)
4.2. Prova de Corretude
Dado um grafo G = (V,E), uma funca o custo c e um vertice s o algoritmo Dijkstra corretamente encontra uma caminho de custo mnimo de s a t para todo vertice acessvel a partir
de s.

Demonstraca o:Como Q e vazio no final do processo, vale que todos os vertices,


e portanto todas as arestas, foram examinadas, o que garante que a funca o y e um cpotencial. Se y(t) nC + 1 entao o valor y(t) foi atualizado ao menos uma vez, e assim
vale que w(t) e diferente de NIL. Logo, segue que existe um st-caminho P no grafo de
predecessores e P e um caminho de custo mnimo pela condica o de otimalidade porque:
y(v) = y(u) + c(uv), para todo uv pertencente a w, tal que c(P) = y(t) - y(s) = y(t).
Se y(t) = nC + 1, temos que y(t) - y(s) = nC + 1 e da condica o de inexistencia,
conclumos que nao existe caminho de s a t no grafo. Sendo assim, o algoritmo esta
correto.
4.3. Analise de sua Complexidade
A Construca o do heap e O(n), achar o mnimo e (log n) que e executado n vezes totalizando: O(n log n). Refazer o heap tem complexidade (log n) que e executado m vezes no
total de O(m log n).A complexidade total e O((n + m)log n) = O(m log n).

5. Experimentos
Para avaliar a execuca o do algoritmo, testes computacionais foram realizados. Os testes
apresentados aqui foram realizados em um computador HP G56 Celeron 2,20GHz,
3,00GB, Windows 7 Home Premium 64bits.
A metodologia usada foi atraves de iteraco es. O numero de arestas e vertices que
compoem o grafo sao dados como parametros de entrada. As arestas e seus respectivos
pesos foram gerados aleatoriamente atraves de um gerador de grafos.
Os resultados obtidos em cada execuca o sao apresentados na tabela abaixo. Os
dados apresentados sao, respectivamente, o numero de vertices, o numero de arestas e o
tempo de execuca o .Este u ltimo descreve somente o tempo de execuca o do algoritmo de
Dijkstra. O tempo para geraca o dos grafos nao foi computado.
Tabela 1. Tabela de Experimentos

Teste
1
2
3
4
5
6
7

Vertices
5
20
50
100
500
700
750

Arestas
10
50
100
1000
10000
25000
50000

Tempo (em segundos)


0,015
0,016
0,047
0,484
1,716
3,307
6,911

6. Conclusoes
Conforme proposto a busca por um caminho mnimo foi abordada neste trabalho e como
soluca o foi aplicado o algoritmo Dijikstra implementando com fila de prioridade para obter uma complexidade o tima.Constatamos entao atraves dos exemperimentos que a uniao
do algoritmo e fila de prioridade geram as vantagens desejadas com custo computacional
baixo.

O problema do caminho mnimo foi resolvido atraves do uso do algoritmo de


Dijkstra .Para um melhor desempenho em sua implementaca o foi utilizada uma fila de
prioridades (heap) para que, fosse possvel, manter os vertices ordenados de forma que
o algoritmo pudesse ser executado como esperado. Os grafos utilizados nos experimentos apresentados anteriormente foram produzidos por um gerador que recebe como
parametros de entrada o numero de vertices e o numero de arestas.
Os resultados obtidos evidenciam que o algoritmo de Dijkstra e bastante eficaz
encontrando a soluca o com tempo de execuca o o timo mesmo para grafos com numero
de vertices e de arestas elevados, como foi o caso do experimento 7, onde haviam 750
vertices e 50000 arestas. Com isto conclumos que para grafos grandes e completos algoritmo de Dijsktra se mostrou eficiente na resoluca o do problema do caminho mnimo
desde que o grafo em questao possua arestas de pesos positivos.
O trabalho contribuiu para a aplicaca o do conteudo teorico aprendido ao longo do
curso e para a melhora na dinamica em grupo.E tambem pode ser constatado que de fato
mudancas no algoritmo como implementaca o com fila de prioridade faz a diiferenca que
contribuiu para gerar resultados o timos mesmo para um grafo de entrada grande.
Mudancas no codigo podem contribuir para gerar um algoritmo de roteamento
usado na a rea de Redes de Computadores. O objetivo e determinar o melhor caminho
entre dois sistemas finais visando melhorar o preenchimento das tabelas de repasses. As
mensagens sao enviadas pelos roteadores para o sistema final em complexidade linear.

Referencias
Cormen, T. H. e. a. (2002). Algoritmos teoria e pratica. Elsevier ltda, 2 edition.
[1]Cromen, Thomas H. et al. Introduction to Algorithms. 3th ed. The MIT
Press.2009
[2] http://en.wikipedia.org/wiki/Dijkstra