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

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

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

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

Análise e Síntese de Algoritmos

Caminhos Mais Curtos para Todos os Pares CLRS, Cap. 25

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

2003/2004 Análise e Síntese de Algoritmos 2

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

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

2003/2004 Análise e Síntese de Algoritmos 3

Resumo

• Caminhos Mais Curtos entre Todos os Pares (APSPs)– Definições– Soluções recursivas

• Algoritmo de Floyd-Warshall– Fecho Transitivo– Algoritmo de Johnson

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

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

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

2003/2004 Análise e Síntese de Algoritmos 5

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)

Ej,i e ji seEj,i e ji sej)(i, arco do peso

ji se0w ij

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

2003/2004 Análise e Síntese de Algoritmos 6

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

iNIL:VjV iji,

{i}Vj:j,E i,iji,

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

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,

)m(ijd

kj1m

iknk1kj1m

iknk1

1mij

mij wdminwdmin,dmind

ji seji se0

d 0ij

wjj = 0

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

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’ kjik

'ij

'ij wd,dmind

'ijd

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

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

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

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}

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

2003/2004 Análise e Síntese de Algoritmos 11

APSPs — Algoritmo de Floyd-Warshall

• Formulação

1k sedd,dmin0k sew

d 1kkj

1kik

1kij

ijkij

i j

kp1

p2

Vértices entre1 e k-1

Vértices entre1 e k

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

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) = Wfor k = 1 to n

for i = 1 to nfor j = 1 to n

return D(n) 1k

kj1k

ik1k

ijk

ij dd,dmind

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

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)

G em j para i de caminho existe:j,iE*

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

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

1t kij

0t kij

1k setttt 1kkj

1kik

1kij

kij

Ej,i ou ji se1

Ej,i e ji se0t 0

ij

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

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 nif i = j or (i, j) E

else

for k = 1 to nfor i = 1 to n

for j = 1 to n

return T(n) 1k

kj1k

ik1k

ijk

ij tttt

1t 0ij

0t 0ij

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

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

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

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’ k0 vhvhpwp'w

k0k0

k

1ii1i

k

1ii1ii1i

k

1ii1i

vhvhpwvhvhv,vw

vhvhv,vw

v,v'wp'w

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

2003/2004 Análise e Síntese de Algoritmos 18

APSPs — Algoritmo de Johnson

k0k0 v,v'p'wv,vpw

k0zk0z vhvhpwp'wp'wvhvhpw

Hipótese: existe pz, caminho mais curto de v0 para vk com w’Então: p'wp'w z

pwpw z 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)

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

2003/2004 Análise e Síntese de Algoritmos 19

APSPs — Algoritmo de Johnson

k0k0 v,v'p'wv,vpw

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’

cwvhvhcwc'w k0

0cw;vv;v,,v,vc k0k10

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)

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

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

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

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)

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

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-Fordcalcular 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

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

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

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

2003/2004 Análise e Síntese de Algoritmos 24

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)