quando o grafo é sem pesos, a determinação de um caminho mais curto pode ser feita através de uma busca em largura caminho mais curto é aquele que apresenta o menor número de arestas quando o grafo tem pesos associados às arestas, o caminho mais curto pode não ser o que usa menos arestas dado um grafo dirigido e ponderado G = (V,A), deseja-se obter o caminho P mais curto a partir de um dado vértice origem s V até cada v V o comprimento (ou peso) de um caminho P é a soma dos pesos das arestas que compõem P exemplo prático: alguém precisa se deslocar de uma cidade para outra. Para isso, ela dispõe de várias estradas, que passam por diversas cidades. Qual delas oferece uma trajetória de menor caminho? algoritmos para solucionar o problema do caminho mais curto: Dijkstra (grafos dirigidos e não dirigidos com pesos não negativos) *** Bellman-Ford (grafos com pesos negativos) *** o que será abordado no curso
algoritmo de DIJKSTRA (1959) encontra o comprimento (ou peso) mínimo a partir de um vértice de partida s até todos os outros vértices do grafo comprimento (ou peso) mínimo de origem única notação: grafo dirigido ponderado G (V,A) s é o vértice origem D[v] é o menor comprimento (ou peso) estimado de s até v em um determinado instante se é igual a, não existe caminho entre s e v Q = V S (lista ordenada com menor valor de D[v]) S contém os vértices com os caminhos mais curtos calculados até o momento NVERT é o número de vértices do grafo G MA = matriz de adjacências e LA = lista de adjacências algoritmo de DIJKSTRA passo 1) inicialização de D[v]: D[s]=0 e demais, iguais a passo 2) usa-se dois conjuntos: S, que representa todos os vértices v com caminhos calculados até o momento e o Q, simbolizando todos os outros vértices (V S) passo 3) realiza-se uma série de relaxamentos das arestas (distância dos menores caminhos são atualizadas) relaxamento (ou relaxação) de uma aresta (u,v) consiste em verificar se é possível melhorar o melhor comprimento (mínimo) até v obtido até o momento (se isto acontecer, D[v] deve ser atualizado)
pseudocódigo do algoritmo de DIJKSTRA procedimento DIJKSTRA (V, MA, LA, s, NVERT); início para i 0 até NVERT-1 faça {para todo vértice pertencente ao grafo} D[i] infinito; D[s] 0; S ; Q V; enquanto (Q <> ) faça {enquanto houver vértice em Q} início u retira (Q); {retira de Q o vértice com menor valor de D[ ]} S S + {u}; para cada v LA[u] faça {para cada adjacente de u} se (D[v] > D[u] + MA[u,v]) {relaxamento de (u,v)} então D[v] D[u] + MA[u,v]; fim; para i 0 até NVERT-1 faça imprima D[ i ]; {imprime o comprimento mais curto de s a i} fim; algoritmo de DIJKSTRA exemplo_1
algoritmo de DIJKSTRA exemplo_1 (cont.) animação do algoritmo de Dijkstra http://students.ceid.upatras.gr/~papagel/project/kef5_7_1.htm problemas clássicos da literatura que envolvem grafos sete pontes de Königsberg caixeiro viajante alguns links de animações de jogos utilizando teoria de grafos http://www.math.ucalgary.ca/~laf/colorful/colorful.html
o problema das sete pontes de Königsberg: foram construídas sete pontes que cruzavam o rio Pregel, ligando diferentes partes da cidade (antiga Prússia) como mostra a figura: é possível fazer um percurso de tal forma que se inicie e volte à mesma posição passando por todas as pontes somente uma única vez? o problema das sete pontes de Königsberg marca o início da teoria dos grafos o matemático suíço, Leonhard Euler, em 1736, provou que não existia caminho que possibilitasse tais restrições para isso transformou os caminhos (pontes) em retas (arestas) e suas intersecções (ilhas, áreas de terra) em pontos (vértices) 4 vértices e 7 arestas
o problema das sete pontes de Königsberg a ser resolvido é possível achar um caminho que comece e termine num vértice qualquer (A, B, C, ou D) e passe por cada aresta uma única vez? partindo do vértice A, toda vez que se passa por qualquer outro vértice, duas arestas são usadas: a de chegada e a de saída se for possível achar uma rota que usa todas as arestas do grafo e que começa e termina em A, por exemplo, o número total de chegadas e saídas de cada vértice deve ser um valor múltiplo de 2 no entanto, grau(a) = grau(c) = grau(d) = 3 e grau(b) = 5 (????) portanto a travessia proposta não é possível, cada ponto deve ter um número par de caminhos (um para entrar e outro para sair) o problema do caixeiro viajante: traveling salesman problem (TSP): determinar a viagem de custo mínimo que o vendedor deve efetuar para visitar todas as cidades no seu território de vendas, começando e acabando na mesma localidade suponha o mapa abaixo mostrando quatro cidades (A,B,C,D) e as distâncias em km entre elas
o problema do caixeiro viajante solução: enumere todos os possíveis circuitos começando e terminando em A calcule a distância de cada um deles determine o menor deles Rota (distância em km): ABCDA 30+30+25+40 = 125 ABDCA 30+35+25+50 = 140 ACBDA 50+30+35+40 = 155 ACDBA 50+25+35+30 = 140 ADBCA 40+35+30+50 = 155 ADCBA 40+25+30+30 = 125 tanto a rota ABCDA ou ADCBA tem uma distância total de 125 km o problema do caixeiro viajante algoritmo para resolver o TSP atualmente, por força bruta, como feito no exemplo anterior para o grafo com 30 vértices existem 29! 8.84 10 30 circuitos diferentes começando e terminando num determinado vértice mesmo se cada circuito puder ser achado e calculado em apenas 1µs, seriam necessários, aproximadamente, 2.8 10 17 anos para solucionar o problema de descoberta dos possíveis circuitos neste tipo de computador
Exercício 1) Execute o algoritmo de Dijkstra para os grafos (a e b) abaixo: considerando como vértice origem s, o vértice 4 para a) considerando como vértice origem s, o vértice 1 para b) Exercício 2) A Empresa Brasileira de Correios e Telégrafos de Santa Rita mantém vários postos de coleta de correspondência espalhados pela cidade, inclusive em bairros mais afastados. A localização e a quantidade destes postos são algumas vezes modificadas de forma que diariamente o motorista responsável por recolher a correspondência recebe um esquema que mostra o melhor percurso para passar em todos os postos de coleta. Este esquema é montado manualmente por um funcionário da E.C.T. Este funcionário não agüenta mais as reclamações do motorista de que as rotas que ele traça nunca são as melhores. O chefe, sem saber como tratar o problema, resolve contratar um especialista (você), para resolvê-lo. Como você modelaria o problema? Como encontrar a melhor rota? Que particularidades devem ser tratadas?