Você está na página 1de 9

Universidade Federal do Vale do So Francisco

Implementao de busca em largura e em profundidade, algoritmo do menor caminho de Dijkstra: o caso do metr de Paris ngelo Gustavo Gomes Cavalcanti Daise Farias dos Santos Eliezer Neto Fernandes Andrade Thaminne Felix de Oliveira Lopes Machado

Juazeiro, 2013

1. Resumo Neste trabalho veremos uma aplicao prtica do algoritmo de dijkstra, algoritmo que toma a deciso que parece tima no momento, desenvolvida atravs da linguagem C, no intuito de solucionar o problema de trajeto das estaes do metr de Paris, mostrando o caminho mais curto, onde o usurio informar o local de partida e o local da chegada e o software calcular e mostrar o trajeto mais curto, a partir das informaes de distancia das linhas do metr extradas de um arquivo de texto. 2. Problema Para a teoria dos grafos uma "estratgia gulosa" conveniente j que sendo P um menor caminho entre 2 vrtices U e V, todo sub-caminho de P um menor caminho entre 2 vrtices pertencentes ao caminho P, desta forma construmos os melhores caminhos dos vrtices alcanveis pelo vrtice inicial determinando todos os melhores caminhos intermedirios. Nota: diz-se 'um menor caminho' pois caso existam 2 'menores caminhos' apenas um ser descoberto. O algoritmo considera um conjunto S de menores caminhos, iniciado com um vrtice inicial I. A cada passo do algoritmo busca-se nas adjacncias dos vrtices pertencentes a S aquele vrtice com menor distncia relativa a I e adiciona-o a S e, ento, repetindo os passos at que todos os vrtices alcanveis por I estejam em S. Arestas que ligam vrtices j pertencentes a S so desconsideradas. Um exemplo prtico do problema que pode ser resolvido pelo algoritmo de Dijkstra : algum precisa se deslocar de uma cidade para outra. Para isso, ela dispe de vrias estradas, que passam por diversas cidades. E informa qual dos trajetos oferece o menor caminho. 3. Busca em profundidade Busca em profundidade (ou busca em profundidade, tambm usada sigla em ingls DFS) um algoritmo usado para realizar uma busca ou travessia numa rvore, estrutura de rvore ou grafo. Intuitivamente, o algoritmo comea num n raiz (selecionando algum n como sendo a raiz, no caso de um grafo) e

explora tanto quanto possvel cada um dos seus ramos, antes de retroceder (backtracking). O algoritmo de Busca em Profundidade uma proposta que trabalha sob o critrio LIFO (Last In First Out, isto , o ltimo que entra o primeiro que sai). tambm denominada de primeiro-em-profundidade ou depth-first [RAB95]. Quanto estrutura do algoritmo, a nica diferena em relao busca em largura, a utilizao de uma pilha ao invs de fila. Esta tcnica explora o caminho para o objetivo, dando preferncia aos ns que esto mais distantes da raiz da rvore de busca. Funciona bem, quando as solues so total e igualmente desejadas ou quando anteriormente foi feita uma varredura, detectando direes incorretas [FUR73]. A busca em profundidade usada quando a ideia iniciar a busca a partir do ultimo estado gerado. A estratgia consiste em pesquisar o grafo o mais profundamente sempre que possvel. Aplicvel tanto a grafos orientados quanto no orientados. Possui um numero enorme de aplicaes: Determinar os componentes de um grafo Ordenao topolgica Determinar componentes fortemente conexos Sub-rotina para outros algoritmos

4. Busca em Largura Na teoria dos grafos, busca em largura (ou busca em amplitude, tambm conhecido em ingls por Breadth-First Search (BFS)) um algoritmo de busca em grafos utilizado para realizar uma busca ou travessia num grafo e estrutura de dados do tipo rvore. Intuitivamente, voc comea pelo vrtice raiz e explora todos os vrtices vizinhos. Ento, para cada um desses vrtices mais prximos, exploramos os seus vrtices vizinhos inexplorados e assim por diante, at que ele encontre o alvo da busca. O algoritmo de Busca em Largura uma proposta que trabalha sob o critrio FIFO (First In First Out, isto , o primeiro que entra o primeiro que sai). tambm denominada de busca em amplitude, busca em nvel e breadth-first [RAB95].

Funciona da seguinte forma: Aplica-se todos os operadores possveis raiz (isto , ao estado inicial), em seguida, a todos os filhos da raiz (da esquerda para a direita), depois, a todos os netos da raiz (da esquerda para a direita) e assim por diante. A busca cessa ao se descobrir o n objetivo. [COL88]. Existem duas filas de trabalho usadas pela busca em largura. A fila de abertos, que guarda todos os vrtices do grafo a serem explorados; e a fila de fechados, onde se encontram todos os vrtices que j foram explorados. Neste algoritmo, todos os vrtices de certo nvel da rvore so examinados antes do nvel abaixo. Se existe uma soluo e se o grafo finito, ento por este mtodo ela certamente ser encontrada. Se pretender iniciar a busca a partir de estados gerados h algum tempo recomendvel utilizao da busca em amplitude 5. Problema do Caminho mais Curto Quando existe um destino a se chegar, podem existir vrios caminhos possveis at ele. Se o problema for definir o caminho para sair de um vrtice A e alcanar um vrtice B, no importa a ordem dos ns passados pelo caminho, mas o somatrio das distncias sendo o menor possvel. Pode-se perceber que isso no muito fcil de resolver, pois existem vrios caminhos possveis desconsiderando as distncias, mas somente um resolve o problema. Ento para definir qual o caminho correto, o menor caminho possvel nesse caso, primeiro preciso saber quais so os caminhos possveis, ou seja, em quais ordens o destino pode ser atendido passando por diferentes caminhos (ns). Tendo-se definido a ordem para passar por todos os caminhos possveis, determinar o menor caminho entre eles fica fcil, bastando usar o algoritmo para isso. Assim, possvel perceber que o nmero de caminhos possveis o resultado do nmero de combinaes possveis entre o estado atual e o destino. A nica maneira de saber qual desses possveis caminhos representa o mais curto, sabendo o comprimento de cada um deles. Isto, em muitos casos, se torna impraticvel, pois para determinar o comprimento de cada um dos possveis caminhos, preciso aplicar o algoritmo e encontrar o menor caminho entre cada um dos vrtices integrantes do caminho, na ordem em que eles so apresentados.

6. Algoritmo de Dijkstra O algoritmo de Dijkstra, concebido pelo cientista da computao holands Edsger Dijkstra em 1956 e publicado em 1959, soluciona o problema do caminho mais curto num grafo dirigido ou no dirigido com arestas de peso no negativo, em tempo computacional O([m+n]log n) onde m o nmero de arestas e n o nmero de vrtices. O algoritmo que serve para resolver o mesmo problema em um grafo com pesos negativos o algoritmo de Bellman-Ford, que possui maior tempo de execuo que o Dijkstra. O algoritmo de Dijkstra assemelha-se ao BFS, mas um algoritmo guloso, ou seja, toma a deciso que parece tima no momento. Escolhido um vrtice como raiz da busca, este algoritmo calcula o custo mnimo deste vrtice para todos os demais vrtices do grafo. O algoritmo pode ser usado sobre grafos orientados (dgrafos), ou no, e admite que todas as arestas possuam pesos no negativos (nulo possvel). Esta restrio perfeita mente possvel no contexto de redes de transportes, onde as arestas representam normalmente distncias ou tempos mdios de percurso; podero existir, no entanto, aplicaes onde as arestas apresentem pesos negativos, nestes casos o algoritmo no funcionar corretamente. (NONATO, 2004) Um exemplo prtico do problema que pode ser resolvido pelo algoritmo de Dijkstra : algum precisa se deslocar de uma cidade para outra. E ele pode ser empregado em vrios contextos, desde o estudo de uma cadeia de produo at o clssico problema do carteiro que no pode passar duas vezes na mesma rua. A matriz de vnculos e pesos pode ser composta por informaes que representam distncia entre localidades, custos operacionais, quantidade de recursos, ou qualquer outro elemento passvel de ser ponderado entre os vrtices. Por sua vez, os vrtices tambm podem assumir uma infinidade de possibilidades. Os vrtices podem representar cidades ou qualquer outra localidade, podem ser os estados em um sistema dinmico complexo, ou mesmo abstraes de momentos em um contexto. Qualquer situao que possa ser representada por um grafo simples, que possuas sua matriz de pesos definida passvel de ser submetido proposta de Dijkstra.

7. Estrutura de Dados Utilizada As TAD utilizadas seguem abaixo: struct line{ int Node; }; A estrutura 'line' representa as linhas do metr. struct temporary_line{ int Node; float f; }; A estrutura 'temporary_line' representa uma linhatemporria, para trocas e auxlio nas manipulaes necessrias. struct Node{ int info; struct Node *next; }; A estrutura 'Node' representa o n do grafo, ou seja, cada parada da linha. struct Node* createNode() { return malloc(sizeof (struct Node)); } A estrutura acima responsvel pela criao dos ns em tempo de execuo. O grafo foi armazenado em arquivos texto, com correnpondencias entre suas distancias em cada n da linha. O projeto conta com trs arquivos que descrevem os caminhos e as distncias de cada linha. Os arquivos so matrizes de adjacncias, mostrando as ligaes entre as linhas. Foi adotado um padro para as cores das linhas, onde a 1 azul, a 2 vermelha, a 3 verde e a 4 amarela. O arquivo 'Caminhos.txt' uma matriz que mostra as linhas de acordo com suas cores: 01000000000000 10100000440000 01010002000020

00101003000030 00010144000000 00001000000000 00004000000000 00034000400300 04200004002000 04000000000000 00000000200000 00000003000000 00230000000003 00000000000030 O arquivo 'Dados.txt' o responsvel por guardar as informaes dos vizinhos, ou seja, quem est ligado diretamente a determinado n: 2 1,3,9,10 2,4,9,13 3,5,8,13 4,6,7,8 5 5 4,5,9,12 2,3,8,11 2 9 8 3,4,14 13 0 O ltimo arquivo utilizado foi o 'Distncias.txt', que mostra a distncias dos arcos para cada n em forma de matriz: 00 11 20 27 40 43 39 28 18 10 18 30 30 32 11 00 09 16 29 32 28 19 11 04 17 23 21 24 20 09 00 07 20 22 19 15 10 11 21 21 13 18 27 16 07 00 13 16 12 13 13 18 26 21 11 17

40 29 20 13 00 03 02 21 25 31 38 27 16 20 43 32 22 16 03 00 04 23 28 33 41 30 17 20 39 28 19 12 02 04 00 22 25 29 38 28 13 17 28 19 15 13 21 23 22 00 09 22 18 07 25 30 18 11 10 13 25 28 25 09 00 13 12 12 23 28 10 04 11 18 31 33 29 22 13 00 20 27 20 23 18 17 21 26 38 41 38 18 12 20 00 15 35 39 30 23 21 21 27 30 28 07 12 27 15 00 31 37 30 21 13 11 16 17 13 25 23 20 35 31 00 05 32 24 18 17 20 20 17 30 28 23 39 37 05 00 8. Material e Mtodo O software foi desenvolvido em linguagem C, e consiste no clculo do trajeto mais curto entre as estaes do metr de Paris. Esse metr possui 14 estaes que esto interligadas em quatro linhas, sendo elas a linha amarela, vermelha, azul e verde. So dadas as distncias entre as estaes, tempo de troca de linha e velocidade do trem. O local de partida e o local de chegada informado pelo usurio e mostra como resultado as linhas de trajeto mais curto. O ambiente integrado de desenvolvimento (IDE) utilizado para o desenvolvimento deste sistema foi o Dev 5.3.0.4. 9. Resultados Implementar a busca foi desafiador e inovador para todos os integrantes da equipe, a busca por alternativas e melhoramentos foi motivadora para a melhor soluo. Em relao a usabilidade do programa desenvolvido, concluimos que necessita de algumas modificaes, como novo clculo de rota, em caso de mudana em tempo de execuo, deixando o programa mais flexvel a alteraes de caminho.

10. Referncias Bibliogrficas SEDGEWICK, Robert, 1946 Algorithms in C / Robert Sedgewick. - 3rd ed. Reading, Mass.: Addison- Wesley, c1998. AARON M. Tenanbaum, Yedidyah Langsam, Mosha J. Augenstein; Estruturas de Dados Usando C, Pearson Makron Books, 2005. ZIVIANE, Nvio, 2004 Projetos de Algoritmos. SAYO, L. F. Modelos tericos em cincia da informao: abstrao e mtodo cientfico. Cincia e Informao. v. 30, n. 1, p. 82-91, jan./abr. 2001 DOUGLAS D. MOONEY, A course in mathematical modeling, Mathematical Association of America, (1999) T. CORMEN H, LEISERSON, C. E. e RIVEST R. L, Algoritmos - Teoria e Prtica, Editora Campus, 2002. Disponvel em, http://pt.wikipedia.org/wiki/Busca_em_profundidade, acesso em 28/04/13 Disponvel em, http://pt.wikipedia.org/wiki/Busca_em_largura, acesso em 28/04/13 Disponvel em, http://www.ic.unicamp.br/~lee/mc558/dfs-4up.pdf, acesso em 28/04/13 Disponvel em, http://pt.wikipedia.org/wiki/Algoritmo_de_Dijkstra, acesso em 28/04/13 Disponvel em, http://pt.scribd.com/doc/7773764/42/Figura-8-Pseudo-codigo-do-Algoritmo-deDijkstra, acesso em 28/04/13

Você também pode gostar