trabalho dijkstra.pdf

4
Caminho M´ ınimo: Algoritmo Dijikstra Geovani Silva Celebrim 1 , Juliane Marinho da Silva 2 , Lu´ ıs Paulo Cavalcante 3 , Orientador: Leandro G. M. Alvim 4 1 Departamento de Ciˆ encia da Computac ¸˜ ao – Universidade Federal Rural do Rio de Janeiro (UFRRJ) R. Governador Roberto Silveira S/N – Nova Iguac ¸u – Rio de Janeiro – RJ – Brasil [email protected], [email protected], [email protected] Abstract. Throughout this article, it is been done an analyses of Dijkstra algo- rithm and its efficiency on solving the shortest path problem. Computational tests were made in order to verify the execution of the algorithm and its effici- ency 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 an´ alise do algoritmo de Dijks- tra e sua efic ´ acia na resoluc ¸˜ ao do problema do caminho m´ ınimo. Testes compu- tacionais foram realizados a fim de se verificar a execuc ¸˜ ao do algoritmo e sua eficiˆ encia com grafos de diferentes n´ umeros de arestas e pesos. Ao final ´ e feita uma an´ alise dos resultados obtidos e uma conclus˜ ao. 1. Introduc ¸˜ ao Um dos principais problemas que a Ciˆ encia da Computac ¸˜ ao prop˜ oe-se a resolver ´ eo problema do Caminho M´ ınimo. Este problema consiste em encontrar, dado um grafo, o menor caminho de um v´ ertice a todos os outros. Possuindo aplicac ¸˜ oes em diversos problemas que ocorrem nas ´ areas de transporte,log´ ıstica, redes de computadores e de telecomunicac ¸˜ oes entre outros. Um dos algoritmos propostos pela Ciˆ encia da Computac ¸˜ ao para resolver este pro- blema ´ e o Algoritmo de Dijkstra.Desenvolvido pelo Cientista da Computac ¸˜ ao Edsger Dijkstra em 1956 e publicado em 1959, este algoritmo soluciona o problema do cami- nho m´ ınimo em um grafo valorado direcionado G = (V,E) para o caso de todas as suas arestas possu´ ırem pesos n˜ ao negativos. Neste artigo ser´ a discutida a eficiˆ encia do algoritmo atrav´ es do teste de corretude, an´ alise algor´ ıtmica e testes computacionais realizados com diferentes tipos de grafos. Na sec ¸˜ ao 2, ser´ a feita uma breve descric ¸˜ ao do problema. Na sec ¸˜ ao 3, descreveremos o obje- tivo do problema. Na sec ¸˜ ao 4, apresentaremos o algoritmo, a demonstrac ¸˜ ao da corretude e a an´ alise de sua complexidade. Na sec ¸˜ ao 5, s˜ ao apresentados testes computacionais a fim de demonstrar seu custo com diferentes tipos de grafo. Por fim, na sec ¸˜ ao 6, ser´ a feita uma pequena an´ alise dos resultados obtidos na sec ¸˜ ao anterior. 2. Problema e Motivac ¸˜ ao Encontrar a rota mais curta poss´ ıvel do Rio de Janeiro a ao Paulo[Cormen 2002].Calcular caminho mais curto entre cidades com o Dijikstra ´ e

Upload: juliane-marinho

Post on 23-Dec-2015

7 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: TRABALHO DIJKSTRA.pdf

Caminho Mınimo: Algoritmo DijikstraGeovani Silva Celebrim1, Juliane Marinho da Silva2, Luıs Paulo Cavalcante3,

Orientador: Leandro G. M. Alvim4

1Departamento de Ciencia da Computacao –Universidade Federal Rural do Rio de Janeiro (UFRRJ)R. Governador Roberto Silveira S/N – Nova Iguacu –

Rio de Janeiro – RJ – Brasil

[email protected], [email protected], [email protected]

Abstract. Throughout this article, it is been done an analyses of Dijkstra algo-rithm and its efficiency on solving the shortest path problem. Computationaltests were made in order to verify the execution of the algorithm and its effici-ency with graphs with distinct numbers of vertex and weights. At the end it isdone a analyses of the obtained results and a conclusion.

Resumo. Ao longo deste artigo e realizada uma analise do algoritmo de Dijks-tra e sua eficacia na resolucao do problema do caminho mınimo. Testes compu-tacionais foram realizados a fim de se verificar a execucao do algoritmo e suaeficiencia com grafos de diferentes numeros de arestas e pesos. Ao final e feitauma analise dos resultados obtidos e uma conclusao.

1. IntroducaoUm dos principais problemas que a Ciencia da Computacao propoe-se a resolver e oproblema do Caminho Mınimo. Este problema consiste em encontrar, dado um grafo,o menor caminho de um vertice a todos os outros. Possuindo aplicacoes em diversosproblemas que ocorrem nas areas de transporte,logıstica, redes de computadores e detelecomunicacoes entre outros.

Um dos algoritmos propostos pela Ciencia da Computacao para resolver este pro-blema e o Algoritmo de Dijkstra.Desenvolvido pelo Cientista da Computacao EdsgerDijkstra em 1956 e publicado em 1959, este algoritmo soluciona o problema do cami-nho mınimo em um grafo valorado direcionado G = (V,E) para o caso de todas as suasarestas possuırem pesos nao negativos.

Neste artigo sera discutida a eficiencia do algoritmo atraves do teste de corretude,analise algorıtmica e testes computacionais realizados com diferentes tipos de grafos. Nasecao 2, sera feita uma breve descricao do problema. Na secao 3, descreveremos o obje-tivo do problema. Na secao 4, apresentaremos o algoritmo, a demonstracao da corretudee a analise de sua complexidade. Na secao 5, sao apresentados testes computacionais afim de demonstrar seu custo com diferentes tipos de grafo. Por fim, na secao 6, sera feitauma pequena analise dos resultados obtidos na secao anterior.

2. Problema e MotivacaoEncontrar a rota mais curta possıvel do Rio de Janeiro a SaoPaulo[Cormen 2002].Calcular caminho mais curto entre cidades com o Dijikstra e

Page 2: TRABALHO DIJKSTRA.pdf

calcular a distancia de grafos com pesos sempre maior que zero. O problema do caminhomınimo consiste em encontrar um caminho entre dois vertices u e v em um grafodirecionado e valorado cuja soma dos pesos das arestas seja mınimo. Este problemapoderia ser resolvido utilizando o algoritmo de Busca em Largura. Contudo, este metodonao assegura que, no caso de um grafo com arestas de peso diferente de 1, o caminhoentre dois vertices seja o mınimo. Para tanto, e necessario, pois, um mecanismo quegaranta que, a cada vertice visitado, a soma das distancias dos vertices predecessores aeste seja a menor possıvel.

3. ObjetivoO trabalho visa a implementacao do algoritmo Dijkstra utilizando heap como fila de pri-oridade para encontrar o caminho mınimo com custo computacional baixo e tambem visaobter resultados para diferentes tipos de entrada para o algoritmo.

4. Proposta

4.1. O Algoritmo de DijkstraComo fora dito na introducao deste arquivo, o algoritmo de Dijkstra resolve o problemado caminho mınimo em um grafo G = (V,E) para o caso de suas arestas possuırempesos nao negativos. Com uma boa implementacao, o tempo de execucao do algoritmo deDijkstra e menor do que uma outra alternativa para o problema:o algoritmo de Bellmond-Ford.

O algoritmo mantem um conjunto S de vertices cujos pesos do caminho mınimofinal a partir da aresta s ja esta determinado. Repetitivamente, o algoritmo seleciona umvertice u em V −S com o menor caminho mınimo esperado, adiciona u ∈ V −S, e relaxatodos os vertices que partem de u. Para a implementacao estudada neste artigo, utilizou-se uma fila de prioridades (heap) Q. Abaixo, o algoritmo em pseudocodigo, sendo w opeso 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.V2. v.d =∞3. v.π = NIL4. s.d = 05. S = ∅6. Q = G.V7. 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 CorretudeDado um grafo G = (V,E), uma funcao custo c e um vertice s o algoritmo Dijkstra correta-mente encontra uma caminho de custo mınimo de s a t para todo vertice acessıvel a partirde s.

Page 3: TRABALHO DIJKSTRA.pdf

Demonstracao: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 funcao y e um c-potencial. Se y(t) ¡ nC + 1 entao o valor y(t) foi atualizado ao menos uma vez, e assimvale que w(t) e diferente de NIL. Logo, segue que existe um st-caminho P no grafo depredecessores e P e um caminho de custo mınimo pela condicao 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 condicao de inexistencia,concluımos que nao existe caminho de s a t no grafo. Sendo assim, o algoritmo estacorreto.

4.3. Analise de sua ComplexidadeA Construcao do heap e O(n), achar o mınimo e (log n) que e executado n vezes totali-zando: O(n log n). Refazer o heap tem complexidade (log n) que e executado m vezes nototal de O(m log n).A complexidade total e O((n + m)log n) = O(m log n).

5. ExperimentosPara avaliar a execucao do algoritmo, testes computacionais foram realizados. Os testesapresentados aqui foram realizados em um computador HP G56 Celeron 2,20GHz,3,00GB, Windows 7 Home Premium 64bits.

A metodologia usada foi atraves de iteracoes. O numero de arestas e vertices quecompoem o grafo sao dados como parametros de entrada. As arestas e seus respectivospesos foram gerados aleatoriamente atraves de um gerador de grafos.

Os resultados obtidos em cada execucao sao apresentados na tabela abaixo. Osdados apresentados sao, respectivamente, o numero de vertices, o numero de arestas e otempo de execucao .Este ultimo descreve somente o tempo de execucao do algoritmo deDijkstra. O tempo para geracao dos grafos nao foi computado.

Tabela 1. Tabela de Experimentos

Teste Vertices Arestas Tempo (em segundos)1 5 10 0,0152 20 50 0,0163 50 100 0,0474 100 1000 0,4845 500 10000 1,7166 700 25000 3,3077 750 50000 6,911

6. ConclusoesConforme proposto a busca por um caminho mınimo foi abordada neste trabalho e comosolucao foi aplicado o algoritmo Dijikstra implementando com fila de prioridade para ob-ter uma complexidade otima.Constatamos entao atraves dos exemperimentos que a uniaodo algoritmo e fila de prioridade geram as vantagens desejadas com custo computacionalbaixo.

Page 4: TRABALHO DIJKSTRA.pdf

O problema do caminho mınimo foi resolvido atraves do uso do algoritmo deDijkstra .Para um melhor desempenho em sua implementacao foi utilizada uma fila deprioridades (heap) para que, fosse possıvel, manter os vertices ordenados de forma queo algoritmo pudesse ser executado como esperado. Os grafos utilizados nos experi-mentos apresentados anteriormente foram produzidos por um gerador que recebe comoparametros de entrada o numero de vertices e o numero de arestas.

Os resultados obtidos evidenciam que o algoritmo de Dijkstra e bastante eficazencontrando a solucao com tempo de execucao otimo mesmo para grafos com numerode vertices e de arestas elevados, como foi o caso do experimento 7, onde haviam 750vertices e 50000 arestas. Com isto concluımos que para grafos grandes e completos al-goritmo de Dijsktra se mostrou eficiente na resolucao do problema do caminho mınimodesde que o grafo em questao possua arestas de pesos positivos.

O trabalho contribuiu para a aplicacao do conteudo teorico aprendido ao longo docurso e para a melhora na dinamica em grupo.E tambem pode ser constatado que de fatomudancas no algoritmo como implementacao com fila de prioridade faz a diiferenca quecontribuiu para gerar resultados otimos mesmo para um grafo de entrada grande.

Mudancas no codigo podem contribuir para gerar um algoritmo de roteamentousado na area de Redes de Computadores. O objetivo e determinar o melhor caminhoentre dois sistemas finais visando melhorar o preenchimento das tabelas de repasses. Asmensagens sao enviadas pelos roteadores para o sistema final em complexidade linear.

ReferenciasCormen, 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 MITPress.2009

[2] http://en.wikipedia.org/wiki/Dijkstra