1 / 32

Representa o computacional de Grafos

Para representar um grafo precisaramos de 3 conjuntos:ARESTAS={a1,a2,a3,a4,a5,a6...}VERTICES={v1,v2,v3,v4....}eV A={[a1,v1,v2],[a2,v1,v3].....]}Porm, como encontrar o menor caminho nesta representao?. Matriz de adjacnciasDe posse dos vrtices, podemos formar uma matriz NxN elementos o

nicholai
Download Presentation

Representa o computacional de Grafos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


    1. Representação computacional de Grafos

    2. Para representar um grafo precisaríamos de 3 conjuntos: ARESTAS={a1,a2,a3,a4,a5,a6...} VERTICES={v1,v2,v3,v4....} e V+A={[a1,v1,v2],[a2,v1,v3].....]} Porém, como encontrar o menor caminho nesta representação?

    3. Matriz de adjacências De posse dos vértices, podemos formar uma matriz NxN elementos onde i,j contem a aresta entre os elementos do vértice Ni e Nj. Esta matriz armazena 1 se existe a aresta ou 0 se não existe. Ou seja, ela é totalmente simétrica, caso seja um grafo não direcionado.

    4. Caso um grafo contenha poucas arestas, a matriz tende a ser “esparsa”, ou seja, conter muitos zeros! Caso tenhamos N arestas o tamanho da matriz sempre será N2. Qualquer algoritmo que precise verificar algo na matriz terá que fazer N2 comparações. Se o grafo possuir poucas arestas, a matriz passa a não ser interessante, desta forma podemos utilizar Listas encadeadas!

    5. Lista encadeada Usa ponteiros para mostrar o próximo da lista. Para encontrar os vértices adjacentes, precisamos percorrer toda a lista. Precisamos de informações adicionais para armazenar o endereço do próximo elemento.

    6. Em um grafo não-direcionado, cada aresta aparecerá 2 vezes. Se nj está na lista de adjacentes a ni, então ni, também está na lista de adjacências de nj. Em um grafo rotulado, as informações podem ser armazenadas em cada elemento da lista.

    7. Crie a MATRIZ e a LISTA ENCADEADA:

    8. Caminho Eureliano (Algoritmo)

    9. Definição Um caminho Eureliano em um grafo G, é um caminho que usa cada aresta de G exatamente uma vez. A existência de um caminho Eureliano, depende dos graus de seus vértices. Existe um caminho Eureliano em um grafo conexo se, e somente se, não houver nenhum ou existirem exatamente dois vértices de grau ímpar. No caso de não haver vértices ímpares, o caminho pode começar em qualquer vértice e terminará neste mesmo vértice; para o caso de haver dois vértices ímpares, o caminho deve começar em um vértice ímpar e terminar no outro.

    10. Definição

    11. Algoritmo A essência é contar o número de vértices adjacentes a cada vértice e determinar se este é impar ou par. Se houver muitos vértices com grau impar, não existe um caminho Eureliano.

    12. Algoritmo Total=0 T=1 While(total<=2) and (i<=n) { grau=0 for j=1 to N { grau = grau + a[i,j] } if grau=impar { total=total+1 i = i + 1} } If total>2 or total=1 então “Não existe caminho Eureliano” Else “Existe caminho Eureliano””

    13. Ciclo Hamiltoniano

    14. Definição Willian Rowan Hamilton(1865), propôs um problema semelhante ao elaborado por Euler, mas agora estamos interessados em saber se podemos usar todos os vértices exatamente uma vez!

    15. Idéia básica Comece por algum vértice e tente encontrar um caminho. Se o caminho resultante tiver um vértice repetido, ele não é um ciclo. Se o caminho puder ser completado como um ciclo, verifique se ele visitou todos os vértices. Se ele visitou, então temos um ciclo Hamiltoniano. Em resumo: Não existe um algoritmo eficiente para resolver o problema do ciclo Hamiltoniano.

    16. O caixeiro viajante Um bom exemplo do problema de Hamilton é o caixeiro viajante.

    17. Caixeiro viajante Exemplificando o caso n = 4: se tivermos quatro cidades A, B, C e D, uma rota que o caixeiro deve considerar poderia ser: saia de A e daí vá para B, dessa vá para C, e daí vá para D  e então volte a A. Quais são as outras possibilidades ? É muito fácil ver que existem seis rotas possíveis: ABCDA,ABDCA,ACBDA,ACDBA,ADBCA, ADCBA.

    18. O caixeiro viajante Suponhamos temos um muito veloz computador, capaz de fazer 1 bilhão de adições por segundo. Isso parece uma velocidade imensa, capaz de tudo. Contudo, essa imensa velocidade é um nada frente à imensidão do número 19! de rotas que precisará examinar. Com efeito, acredite se puder, o valor de 19! é  121 645 100 408 832 000  ( ou , aproximadamente, 1.2 x 1017 em notação científica ). Consequentemente, ele precisará de 1.2 x 1017 / ( 53 milhões ) = 2.3 x 109 segundos para completar sua tarefa, o que equivale a cerca de 73 anos . O problema é que a quantidade ( n - 1 )! cresce com uma velocidade alarmante, sendo que muito rapidamente o computador torna-se incapaz de executar o que lhe pedimos. Constate isso mais claramente na tabela a seguir:

    19. Idéia básica

    20. Caminho Mínimo (Algoritmo)

    21. O problema Admita que tenhamos um grafo conexo onde todos os pesos são positivos, então, existe um caminho entre os vértices X e Y? De fato pode haver vários desses caminhos. Mas como encontrar um caminho onde a soma dos pesos seja a menor? Trata-se de um recursos importante para resolver problemas em redes de computadores, em trânsito de veículos ou em telecomunicações. (entre outros)

    22. Suposições Como o grafo é conexo, sabemos que o caminho existe. Como ele não tem restrições, ele pode ser resolvido (e o Hamiltoniano não)

    23. Algoritmo de Dijkstra Construímos um conjunto chamado IN que conterá o vértice inicial (x por exemplo), e que irá aumentando a medida que for executado. IN conterá então todos os vértices para os quais já determinamos os menores caminhos (a partir de x) Para aumentar IN, pegamos o vértice fora de IN com menor distância. Agora recalculamos

    31. O Algoritmo Trata-se de um algoritmo de visão curta. Ele não é capaz de ver todo o grafo para determinar diversos caminhos mínimos. Ele apenas determina a cada passo, os caminhos mínimos relativos ao conjunto IN. Esse tipo de algoritmo é conhecido como Algoritmo guloso – pois sempre realiza apenas os passos que são melhores.

    32. O Algoritmo // Criando o primeiro vetor com as distâncias // iniciais IN = {x} D[x]=0; For todos os Z que não estão em IN { d[z] = A[x,z] s[z] = x; }

    33. O Algoritmo While not (y in IN) { IN=IN U P for (todos de z que pertençam a IN) { distanciaanterior = d[z] d[z] = min(d[z],d[p] ; A[p,z]); if (dz<distanciaanterior) s[z]=p } } //{while}

More Related