A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Análise e Síntese de Algoritmos

Apresentações semelhantes


Apresentação em tema: "Análise e Síntese de Algoritmos"— Transcrição da apresentação:

1 Análise e Síntese de Algoritmos
Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25

2 Análise e Síntese de Algoritmos
Contexto Algoritmos Elementares em Grafos (CLR, Cap. 22) BFS & DFS Ordenação Topológica & SCCs Árvores Abrangentes de Menor Custo (CLR, Cap. 23) Algoritmos de Borůvka, Kruskal e Prim Caminhos mais curtos com fonte única (CLR, Cap. 24) Algoritmos de Dijkstra e Bellman-Ford Caminhos mais curtos entre todos os pares (CLR, Cap. 25) Solução Recursiva e Algoritmo de Floyd-Warshall 2003/2004 Análise e Síntese de Algoritmos

3 Análise e Síntese de Algoritmos
Resumo Caminhos Mais Curtos entre Todos os Pares (APSPs) Definições Soluções recursivas Algoritmo de Floyd-Warshall Fecho Transitivo Algoritmo de Johnson 2003/2004 Análise e Síntese de Algoritmos

4 Caminhos Mais Curtos entre Todos os Pares (APSPs) — Observações
Encontrar caminhos mais curtos entre todos os pares de vértices Se pesos não negativos Utilizar algoritmo de Dijkstra, assumindo cada vértice como fonte: O(V E lg V) (que é O(V3 lg V) se grafo é denso) Se pesos negativos Utilizar algoritmo de Bellman-Ford, assumindo cada vértice como fonte: O(V2E) (que é O(V4) se grafo é denso) Objectivo: Encontrar algoritmos mais eficientes 2003/2004 Análise e Síntese de Algoritmos

5 Análise e Síntese de Algoritmos
APSPs — Definições Representação: utilização de matriz de adjacências Pesos dos arcos: matriz (n x n) W = (wij) Representação dos caminhos mais curtos: matriz (n x n) D = (dij) dij é o peso do caminho mais curto entre os vértices i e j dij = (vi,vj) 2003/2004 Análise e Síntese de Algoritmos

6 Análise e Síntese de Algoritmos
APSPs — Definições Representação de caminhos mais curtos Matriz de predecessores  = (ij) ij: NIL: se i = j ou não existe caminho de i para j Caso contrário: predecessor de j num caminho mais curto de i para j Sub-grafo de predecessores de G para i, G, i = (V, i, E, i) Sub-grafo induzido pela linha i de  Exemplo 2003/2004 Análise e Síntese de Algoritmos

7 APSPs — Solução Recursiva
Sub-caminhos de caminhos mais curtos são também caminhos mais curtos Peso mínimo em caminho de vértice i para vértice j que contém não mais do que m arcos: Com m = 0, existe caminho de i para j se e só se i = j Para m  1, wjj = 0 2003/2004 Análise e Síntese de Algoritmos

8 APSPs — Solução Recursiva
Calcular sequência de matrizes D(1), …, D(n-1), onde D(n-1) contém os pesos dos caminhos mais curtos D(1) = W Complexidade: (n3) p/ cada matriz; Total: (n4) Extend-Shortest-Paths(D,W) n = rows[W] D’: matriz (n x n) for i = 1 to n for j = 1 to n for k = 1 to n return D’ 2003/2004 Análise e Síntese de Algoritmos

9 APSPs — Solução Recursiva
Genericamente: calcular D(i) em função de D(i-1) (e de W) Complexidade para cálculo de D(n): (n4) OBS: é possível melhorar complexidade reduzindo número de matrizes calculadas: (n3lg n) A cada iteração, calcular D(2i) em função de D(i) e de D(i) Exemplo 2003/2004 Análise e Síntese de Algoritmos

10 APSPs — Algoritmo de Floyd-Warshall
Caracterização de um caminho mais curto Vértices intermédios de caminho p = v1,v2,,vk, {v2,,vk-1} Considerar todos os caminhos entre i e j com vértices intermédios retirados do conjunto {1,,k} e seja p um caminho mais curto (p é simples) Se k não é vértice intermédio de p, então todos os vértices intermédios de p estão em {1,,k-1} Se k é vértice intermédio de p, então existem caminhos p1 e p2, respectivamente de i para k e de k para j com vértices intermédios em {1,,k} k não é vértice intermédio de p1 e de p2 p1 e p2 com vértices intermédios em {1,,k-1} 2003/2004 Análise e Síntese de Algoritmos

11 APSPs — Algoritmo de Floyd-Warshall
Formulação i j k p1 p2 Vértices entre 1 e k-1 Vértices entre 1 e k 2003/2004 Análise e Síntese de Algoritmos

12 APSPs — Algoritmo de Floyd-Warshall
Complexidade: (n3) Exemplo Floyd-Warshall(W) n = rows[W] D(0) = W for k = 1 to n for i = 1 to n for j = 1 to n return D(n) 2003/2004 Análise e Síntese de Algoritmos

13 Fecho Transitivo de um Grafo Dirigido
Dado um grafo G = (V, E) dirigido, o fecho transitivo é definido por G* = (V, E*) tal que, Aplicação: autorizações de acesso Algoritmo: Atribuir a cada arco peso 1 e utilizar algoritmo de Floyd-Warshall Se dij  , então (i, j)  E* Complexidade: (n3) 2003/2004 Análise e Síntese de Algoritmos

14 Fecho Transitivo de um Grafo Dirigido
Outro algoritmo: Substituir operações min e + por  e , respectivamente Se existe caminho de i para j com todos os vértices intermédios em {1,2,…,k}, Caso contrário, Formulação: Complexidade: (n3) (mas constantes menores) Exemplo 2003/2004 Análise e Síntese de Algoritmos

15 Fecho Transitivo de um Grafo Dirigido
Transitive-Closure(G) n = |V[G]| for i = 1 to n for j = 1 to n if i = j or (i, j)  E else for k = 1 to n return T(n) 2003/2004 Análise e Síntese de Algoritmos

16 APSPs — Algoritmo de Johnson
Utiliza algoritmos de Dijkstra e de Bellman-Ford Baseado em re-pesagem dos arcos Se arcos com pesos não negativos, utilizar Dijkstra para cada vértice Caso contrário, calcular novo conjunto de pesos não negativos w’, tal que Um caminho mais curto de u para v com função w é também caminho mais curto com função w’ Para cada arco (u, v) o peso w’(u, v) é não negativo 2003/2004 Análise e Síntese de Algoritmos

17 APSPs — Algoritmo de Johnson
Dado G = (V, E), com função de pesos w e de re-pesagem h: V  R, seja w’(u, v) = w(u, v) + h(u) - h(v) Seja p = v0,v1,,vk. Então w(p) = (v0, vk) se e só se w’(p) = ’(v0, vk) = (v0, vk) + h(v0) - h(vk) Existe ciclo negativo com w se e só se existe ciclo negativo com w’ 2003/2004 Análise e Síntese de Algoritmos

18 APSPs — Algoritmo de Johnson
Hipótese: existe pz, caminho mais curto de v0 para vk com w’ Então: O que implica Mas p é caminho mais curto com w; contradição ! OBS: Para quaisquer caminhos p1, p2 entre v0 e vk, verifica-se w(p1) < w(p2)  w’(p1) < w’(p2) 2003/2004 Análise e Síntese de Algoritmos

19 APSPs — Algoritmo de Johnson
Semelhante: Admitir pz como caminho mais curto de v0 para vk com w (ou considerar observação anterior) Existe ciclo negativo com w se e só se existe com w’ Caminhos mais curtos e ciclos negativos inalteráveis com mudanças na função de pesos w’(u, v) = w(u, v) + h(u) - h(v) 2003/2004 Análise e Síntese de Algoritmos

20 APSPs — Algoritmo de Johnson
Dado G = (V, E), criar G’ = (V’,E’): V’ = V  { s } E’ = E  { (s, v) : v  V } ( v  V, atingível a partir de s) w(s, v) = 0 Com ciclos negativos: Detectados com algoritmo de Bellman-Ford aplicado a G’ ! Sem ciclos negativos: Definir: h(v) = (s, v) Dado que: h(v)  h(u) + w(u, v) Verifica-se: w’(u, v) = w(u, v) + h(u) - h(v)  0 ! 24.10 2003/2004 Análise e Síntese de Algoritmos

21 APSPs — Algoritmo de Johnson
Executar Dijkstra para todo o u  V Cálculo de ’(u,v), para u  V Mas também, ’(u,v) = (u, v) + h(u) - h(v) (u,v) = ’(u, v) + h(v) - h(u) 2003/2004 Análise e Síntese de Algoritmos

22 APSPs — Algoritmo de Johnson
Johnson(G) Representar G’ if Bellman-Ford(G’,w,s) = FALSE print “Indicar ciclo negativo” else atribuir h(v) = (s, v), calculado com Bellman-Ford calcular w’(u,v) = w(u,v) + h(u) - h(v) para cada arco (u,v) foreach v  V[G] executar Dijkstra(G,w’,u); calcular ’(u, v) duv = ’(u, v) + h(v) - h(u) return D 2003/2004 Análise e Síntese de Algoritmos

23 APSPs — Algoritmo de Johnson
Complexidade: Bellman-Ford: O(V E) Executar Dijkstra para cada vértice: O(V (V + E) lg V) Assumindo amontoado (heap) binário Total: O(V (V + E) lg V) Útil para grafos esparsos Exemplo 2003/2004 Análise e Síntese de Algoritmos

24 Análise e Síntese de Algoritmos
Revisão Caminhos Mais Curtos entre Todos os Pares (APSPs) Definições Solução recursiva Algoritmo de Floyd-Warshall Fecho Transitivo Algoritmo de Johnson A seguir: Fluxos máximos em grafos (CLR, Cap. 26) 2003/2004 Análise e Síntese de Algoritmos


Carregar ppt "Análise e Síntese de Algoritmos"

Apresentações semelhantes


Anúncios Google