1 / 26

Algoritmos em Grafos

Algoritmos em Grafos. Celso C. Ribeiro Caroline T. Rocha. PARTE 2: CAMINHOS MAIS CURTOS. Caminhos mais Curtos. Dados: grafo G=(V,A) orientado e distância c ij associada ao arco ( i , j )  A. Problema: Obter o caminho mais curto entre dois nós s e t.

alain
Download Presentation

Algoritmos em 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. Algoritmos em Grafos Celso C. Ribeiro Caroline T. Rocha

  2. PARTE 2: CAMINHOS MAIS CURTOS Algoritmos em Grafos

  3. Caminhos mais Curtos • Dados: grafo G=(V,A) orientado e distância cij associada ao arco (i,j)  A. Problema: Obter o caminho mais curto entre dois nós s e t. • O comprimento de um caminho é igual à soma dos comprimentos (distâncias) dos arcos que formam o caminho. A “distância” ou “comprimento” de um arco pode ter diversas interpretações dependendo da aplicação: custos, distâncias, consumo de combustível, etc. Exemplo 1: Dado um mapa rodoviário, determinar a rota mais curta de uma cidade a outra. (rota mais rápida, rota com menor consumo de combustível, ...) Algoritmos em Grafos

  4. B E H 6 4 4 2 4 4 8 F I 5 5 2 5 K A C 4 2 4 7 4 2 4 G J D Caminhos mais Curtos Exemplo 2: Construção de uma estrada entre duas cidades A e K. O grafo abaixo representa os diversos trechos possíveis e o custo de construção de cada um. Determinar o trajeto ótimo cujo custo de construção seja mínimo (corresponde a achar o caminho mais curto de A a K em relação a estes custos). Solução: A – D – G – I – K custo = 7 + 2 + 2 + 5 = 16 Algoritmos em Grafos

  5. k w i j Caminhos mais Curtos • Condição de existência: Caminho de i a j contendo um circuito w: Comprimento do caminho = comprimento (i  k) + comprimento (w) + comprimento (k  j) Qual é o comprimento do caminho mais curto de i a j se o comprimento do circuito w é negativo? Algoritmos em Grafos

  6. A solução ótima (caminho mais curto) sempre será um caminho elementar (sem circuito). Caminhos mais Curtos Condição de existência: não há circuitos de comprimento negativo. Algoritmos em Grafos

  7. Caminhos mais Curtos • Caminho mais curto: - De um nó a outro - De um nó a todos os demais - Entre todos os pares de nós de um grafo Algoritmos em Grafos

  8. Algoritmo de Moore-Dijkstra (1957-1959) *(i) = comprimento do caminho mais curto do nó 1 ao nó i Em especial, *(1)=0 (distâncias positivas). • Algoritmo com n-1 iterações • No início de cada iteração, o conjunto V de nós está particionado em dois subconjuntos S e S, com o nó 1 em S. Caminhos mais Curtos Caminho mais curto do nó 1 a cada nó do grafo G=(V,A) Hipótese: todas as distâncias cij são positivas: cij ≥ 0, (i,j)  A Algoritmos em Grafos

  9. cai a 1 b c i cbi cci Caminhos mais Curtos • Cada nó i  V possui um rótulo (i ), que verifica a seguinte propriedade: • dá o valor do caminho mais curto de 1 a i sob a restrição de que todos os nós utilizados (exceto o próprio i ) pertençam a S. Algoritmos em Grafos

  10. Caminhos mais Curtos Teorema: Seja o nó tal que . Então , isto é, o comprimento do caminho mais curto do nó 1 ao nó j é igual a . Demonstração: • Por construção, certamente existe um caminho de 1 até j com comprimento (j). • Suponhamos que exista outro caminho de 1 a j de comprimento menor do que (j). • Dividamos este caminho em duas partes: - P1 é a parte inicial, do nó 1 ao nó L, onde L é o primeiro nó de encontrado - P2 é a parte final, do nó L ao nó j Algoritmos em Grafos

  11. Caminhos mais Curtos • comprimento de P1 ≥ (L) ≥ (j) comprimento de P2 ≥ 0 Logo, o comprimento de P1 + P2 ≥ (j). Algoritmos em Grafos

  12. Inicializar S  {2,3,...,n}, S  {1}, (1) 0, (j) c1j se j1+ + caso contrário EnquantoS  faça Selecionar jS tal que (j)= miniS{(i)} S  S – {j} Para iS e ij+faça (i)  min{(i), (j)+cji} fim_enquanto Caminhos mais Curtos Algoritmo de Moore-Dijkstra O algoritmo constrói progressivamente o conjunto dos nós mais próximos de 1.  Construção de uma arborescência com raiz em 1 que define os caminhos mais curtos do nó 1 a cada nó do grafo. Algoritmos em Grafos

  13. S = {1} S = {2,3,4,5,6} 1 1 3 3 5 4 2 6 4 5 6 2 4 4 5 5 2 2 7 7 j = 3 S = {2,4,5,6} 1 1 2 2 5 5 3 3 *(1) = 0 1 1 7 7 *(3) = 1 Caminhos mais Curtos Exemplo: (1) = 0 (2) = 7 (3) = 1 (4) = (5) = (6) = + ITERAÇÃO 1 (2) = min{7, 1+5} = 6 (5) = min{, 1+2} = 3 (6) = min{, 1+7} = 8 Algoritmos em Grafos

  14. 4 5 *(5) = 3 2 1 1 7 *(1) = 0 1 2 5 3 1 7 3 3 6 4 6 2 5 2 5 4 *(3) = 1 4 5 *(2) = 5 *(5) = 3 j = 2 S = {4,6} j = 5 S = {2,4,6} 2 7 *(1) = 0 1 2 5 3 1 7 *(3) = 1 Caminhos mais Curtos ITERAÇÃO 2 (2) = min{6, 3+2} = 5 (4) = min{, 3+5} = 8 ITERAÇÃO 3 (4) = min{8, 5+4} = 8 (6) = min{, 5+1} = 6 Algoritmos em Grafos

  15. 4 5 *(2) = 5 *(5) = 3 2 7 *(1) = 0 1 2 5 3 1 1 1 7 *(3) = 1 *(6) = 6 3 3 5 5 2 2 6 4 4 6 *(4) = 8 4 5 *(2) = 5 *(5) = 3 j = 4 S = { } j = 6 S = {4} 2 7 *(1) = 0 1 2 5 3 1 7 *(3) = 1 *(6) = 6 Caminhos mais Curtos ITERAÇÃO 4 (4) = 8 ITERAÇÃO 5 Algoritmos em Grafos

  16. 3 3 4 1 2 5 2 1 3 2 1 3 4 3 2 5 6 7 4 Caminhos mais Curtos  Iteração Início nó 0 4 2     0 4 2 5 4   0 4 2 5 4 7 7 0 4 2 5 4 7 7 0 4 2 5 4 7 7 0 4 2 5 4 7 7 0 4 2 5 4 7 7 Algoritmos em Grafos

  17. 1 2 3 3 - 8 10 Caminhos mais Curtos • Número de operações (tempo): ~ n2 n-1 iterações, cada iteração busca o mínimo em uma lista com até n-1 elementos (vetor ) • Caminho mais curto do nó 1:  ao nó j  a todos os nós Mesma complexidade, mas critérios de parada diferentes. • Distâncias negativas: 2 Caminho mais curto de 1 a 3? Resultado do algoritmo? 3 Por que? Algoritmos em Grafos

  18. Caminhos mais Curtos Extensão do algoritmo de Moore-Dijkstra para o caso com distâncias negativas (mas sem ciclos negativos) Inicializar S  {2,3,...,n}, S  {1}, (1) 0, (j) c1j se j1+ + caso contrário EnquantoS  faça Selecionar jS tal que (j)= miniS{(i)} S  S – {j} Para ij+faça Calcular *  (j)+ cji Se* < (i) então S  S  {i} (i)  * fim-se fim-para fim-enquanto Algoritmos em Grafos

  19. 3 3 4 1 2 -3 -2 1 3 2 1 3 4 S = 3 3 5 5 7 5 6 2 7 4 Caminhos mais Curtos X X X X X X X X 2 3 4 5 6 7 3 5  Iteração Início nó 0 4 2     0 4 2 5 4   0 4 2 5 4 7 7 0 4 1 5 4 7 7 0 4 1 4 3 7 7 0 4 1 4 3 6 6 0 4 1 4 2 6 6 0 4 1 4 2 5 5 0 4 1 4 2 5 5 Algoritmos em Grafos

  20. Caminhos mais Curtos • Caminho mais curto: - De um nó a outro - De um nó a todos os demais - Entre todos os pares de nós de um grafo Algoritmos em Grafos

  21. Caminhos mais Curtos Caminho mais curto entre todos os pares de nós de um grafo • Dados: Grafo G=(V, A) orientado, |V | = n. Não há circuitos negativos. c = {cij}, j = 1,...,n, i = 1,...,n cij ≥ 0 cii = 0 cij= +, (i, j )  A Ak(i, j ) = valor do caminho mais curto de i a j podendo usar apenas nós numerados de 1 a k como nós intermediários. Algoritmos em Grafos

  22. Caminhos mais Curtos A0(i, j ) = cij: caminho mais curto de i a j usando no máximo o nó “0” (que não existe) como nó intermediário (caminho mais curto de i a j sem nós intermediários) Ak(i, j ) : pode usar o nó k ou não. Ak+1(i, j ) : pode usar o nó k+1 ou não. A0 A1 A1 A2 ... An-1 An An(i, j ) = valor do caminho mais curto de i a j podendo usar qualquer nó de 1 a n como nó intermediário. Algoritmos em Grafos

  23. Caminhos mais Curtos • Se Ak+1(i, j ) não usa o nó k+1 como intermediário, então: Ak+1(i, j ) = Ak(i, j ) • Se Ak+1(i, j ) usa o nó k+1 como intermediário, então: Ak+1(i, j ) = Ak(i, k+1) + Ak(k+1, j ) Ak+1(i, j ) = min { Ak(i, j ), Ak(i, k+1) + Ak(k+1, j ) } Algoritmos em Grafos

  24. Para i = 1,...,nfaça Para j = 1,...,nfaça A0(i,j)  cij fim-para fim-para Para k = 1,...,nfaça Para i = 1,...,nfaça Para j = 1,...,nfaça Ak(i,j)  min{Ak-1(i,j), Ak-1(i,k) + Ak-1(k,j)} fim-para fim-para fim-para Caminhos mais Curtos Algoritmo de Floyd: Algoritmos em Grafos

  25. 6 0 0 0 0 4 4 4 4 11 6 6 11 0 4 11 4 1 A0 = A3 = A2 = A1 = 6 6 5 6 0 0 0 0 2 2 2 2 C = 6 0 2 3 11 2 3 3 3 3 7 7 7 +∞ 0 0 0 0 3 +∞ 0 3 2 Caminhos mais Curtos Exemplo: Algoritmos em Grafos

  26. Caminhos mais Curtos • Algoritmo de Dijkstra: número de operações (tempo) ~ n2 n-1 iterações, cada iteração busca o mínimo em uma lista com até n-1 elementos (vetor ) • Algoritmo de Floyd: número de operações (tempo) ~ n3 Três comandos for de 1 até n um dentro do outro • Ou seja, o problema de calcular os caminhos mais curtos entre todos os pares de nós pode ser resolvido com a mesma eficiência aplicando-se n vezes o algoritmo de Dijkstra, uma vez a partir de cada nó inicial. Algoritmos em Grafos

More Related