320 likes | 651 Views
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
E N D
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}