Caminhos Mínimos Com Uma Fonte 1/74 Caminhos Mínimos Com Uma Fonte Eduardo Camponogara Departamento de Automação e Sistemas Universidade Federal de Santa Catarina DAS-9003: a Algoritmos
Caminhos Mínimos Com Uma Fonte 2/74 Sumário Algoritmo Bellman-Ford Algoritmo de Dijkstra Grafos Acíclicos
Caminhos Mínimos Com Uma Fonte 3/74 Sumário Algoritmo Bellman-Ford Algoritmo de Dijkstra Grafos Acíclicos
Caminhos Mínimos Com Uma Fonte 4/74 Cenário Um motorista deseja encontrar o caminho mais curto da cidade de Florianópolis/SC a Marilha/SP. Dado um mapa das rodovias brasileiras, no qual pares de cidades adjacentes são marcados, como podemos determinar a rota mais curta?
Caminhos Mínimos Com Uma Fonte 5/74 Cenário Um motorista deseja encontrar o caminho mais curto da cidade de Florianópolis/SC a Marilha/SP. Dado um mapa das rodovias brasileiras, no qual pares de cidades adjacentes são marcados, como podemos determinar a rota mais curta? Uma possibilidade consiste em enumerarmos todos os possíveis caminhos de Florianópolis a Marilha. Adicionar as distâncias em cada rota. Selecionar a rota mais curta.
Caminhos Mínimos Com Uma Fonte 6/74 Questão O método é satisfatório?
Caminhos Mínimos Com Uma Fonte 7/74 Desenvolvimentos Veremos como resolver problemas deste tipo de forma eficaz. Em problemas de caminhos mínimos, nos é dado um grafo direcionado G = (V,E) cujas arestas têm pesos. Os pesos são induzidos por uma função w : E R. O peso de um caminho p = (v 0,v 1,...,v k ) é a soma dos pesos das arestas: k 1 w(p) = w(v i,v i+1 ) i=0
Caminhos Mínimos Com Uma Fonte 8/74 Definição Definimos o peso (comprimento) do caminho de menor peso (mais curto) de um vértice u para v como: { min{w(p) : p é caminho de u v} δ(u,v) = + se não existir caminho
Caminhos Mínimos Com Uma Fonte 9/74 No exemplo do problema Florianópolis-Marilha, podemos modelar o mapa como um grafo: os vértices representam as cidades as arestas representam as rodovias, estradas, etc. os pesos das arestas representam as distâncias entre duas cidades
Caminhos Mínimos Com Uma Fonte 10/ 74 Variantes 1. Caminhos mínimos com um destino Encontre o caminho mais curto para um vértice t a partir de cada vértice u V. 2. Caminho mínimo entre um par de vértices Encontre o caminho mais curto de u para v 3. Todos os caminhos mínimos Encontre o caminho mínimo entre cada par u,v V
Caminhos Mínimos Com Uma Fonte 11/ 74 Pesos negativos Pesos negativos Em algumas instâncias do problema de caminhos mínimos com fonte única, podem existir arestas com pesos negativos. Se o grafo G = (V,E) não tiver ciclo com peso negativo alcançável a partir da fonte s, então δ(s,v) permanece bem definido para todo v V, mesmo se o grafo contiver algum ciclo negativo.
Caminhos Mínimos Com Uma Fonte 12/ 74 Pesos negativos Pesos negativos 10 4 1 1 1 2 3 1
Caminhos Mínimos Com Uma Fonte 13/ 74 Pesos negativos Pesos negativos Alguns algoritmos, como o algoritmo de Dijkstra, assumem que todos os pesos são não-negativos. Algoritmos como Bellman-Ford e Floyd-Warshall, entretanto, podem operar com arestas de peso negativo, desde que não existam ciclos de peso negativo. Tipicamente, estes algoritmos detectam a presença de ciclo negativo.
Caminhos Mínimos Com Uma Fonte 14/ 74 Representação Representação Estamos interessados não apenas na distância do caminho mais curto, mas também no caminho em si. A representação do caminho mais curto é similar àquela usada na busca em largura (breadth-first search) Dado um grafo G = (V,E), mantemos para cada vértice v V o seu predecessor π[v] que é outro vértice ou nil. Os algoritmos de caminhos mínimos definem os atributos π de maneira que a cadeia de predecessores originada em v, de trás pra frente, nos dá o caminho mais curto de s para v.
Caminhos Mínimos Com Uma Fonte 15/ 74 Representação Representação O grafo predecessor G π = (V π,e π ) induzido por π, após o término do algoritmo, produz a árvore de caminhos mínimos. G π é definido como segue: V π = {v V : π[v] nil} {s} E π = {(π[v],v) : v V π {s}}
Caminhos Mínimos Com Uma Fonte 16/ 74 Relaxações Relaxações Algoritmos de caminhos mínimos usam a técnica de relaxação, que decresce um limite superior (upper bound) para a distância mínima para cada vértice. Até que o limite superior se torne a própria distância: δ 1 (u) δ 2 (u)... δ k (u) = δ(s,u) Os algoritmos também exploram a propriedade de que o caminho mais curto entre dois vértices também é formado de caminhos mais curtos.
Caminhos Mínimos Com Uma Fonte 17/ 74 Relaxações Relaxações Lema Dado um grafo direcionado com peso nas arestas, G = (V,E), e a função peso nas arestas w : E R. Seja p = (v 1,v 2,...,v k ) um caminho mais curto de v 1 para v k em G. Para quaisquer 1 i < j k, seja p ij = (v i,v i+1,...,v j ) o subcaminho de p de v i para v j. Então, p ij é um caminho mínimo de v i para v j.
Caminhos Mínimos Com Uma Fonte 18/ 74 Relaxações Relaxações Lema Seja dado um grafo direcionado com peso nas arestas, G = (V,E), e a função peso nas arestas w : E R. Seja s um vértice correspondente à fonte. Então, para toda aresta (u,v) E, δ(s,v) δ(s,u)+w(u,v)
Caminhos Mínimos Com Uma Fonte 19/ 74 Relaxações Relaxações Vários algoritmos são baseados na técnica de relaxação. Para cada vértice v V, mantemos um atributo d[v], que é um limite superior (upper bound) no comprimento do caminho mais curto de s para v: d[v] δ(s,v) d[v] é uma estimativa para δ(s,v)
Caminhos Mínimos Com Uma Fonte 20/ 74 Relaxações Relaxações Initialize-Single-Source(G, s) 1) for each v V[G] 2) do d[v] 3) π[v] nil 4) d[s] = 0 Após a inicialização, π[v] = nil para todo v V, d[s] = 0, d[v] = para todo v V {s}.
Caminhos Mínimos Com Uma Fonte 21/ 74 Relaxações Relaxações Relax(u,v) 1) if d[v] > d[u]+w(u,v) 2) then d[v] d[u]+w(u,v) 3) π[v] u O propósito de relaxar uma aresta (u,v) consiste de testar se podemos melhorar a estimativa do caminho mais curto para v encontrado até então, por meio do caminho até u.
Caminhos Mínimos Com Uma Fonte 22/ 74 Relaxações Relaxações 5 u 2 v 9 5 u 2 v 6 Relax(u,v) Relax(u,v) 5 7 5 6
Caminhos Mínimos Com Uma Fonte 23/ 74 Propriedades Propriedades A corretude de algoritmos de caminhos mínimos é baseada em propriedades de caminhos mínimos e das relaxações.
Caminhos Mínimos Com Uma Fonte 24/ 74 Propriedades Desigualdade triangular Lema Para cada aresta (u,v) E, temos δ(s,v) δ(s,u)+w(u,v)
Caminhos Mínimos Com Uma Fonte 25/ 74 Propriedades Limite superior Lema Sempre temos d[v] δ(s,v) para todo vértice v V, e uma vez que d[v] = δ(s,v), a estimativa d[v] não muda.
Caminhos Mínimos Com Uma Fonte 26/ 74 Propriedades Inexistência de caminho Lema Se não existe caminho de s para v, então sempre temos d[v] = δ(s,v) = +
Caminhos Mínimos Com Uma Fonte 27/ 74 Propriedades Convergência Lema Se s u v é um caminho em G para certos vértices u,v V, e se d[u] = δ(s,u) em qualquer momento antes de relaxarmos a aresta (u,v), então após a relaxação da aresta (u,v) temos d[v] = δ(s,v) daí pra frente.
Caminhos Mínimos Com Uma Fonte 28/ 74 Propriedades Propriedade de relaxação de caminho Lema Seja p = (v 0,v 1,...,v k ) um caminho mais curto de s = v 0 para v k e as arestas de p são relaxadas na ordem (v 0,v 1 ), (v 1,v 2 ),..., (v k 1,v k ). Então d[v k ] = δ(s,v k ) Esta propriedade é garantida independentemente de quaisquer passos de relaxação ocorridos, até mesmo se eles são intermediários aos passos de relaxação das arestas em p.
Caminhos Mínimos Com Uma Fonte 29/ 74 Propriedades Subgrafo predecessor Lema Uma vez que d[v] = δ(s,v) para todo v V, o grafo predecessor G π é uma árvore de caminhos mínimos com raiz em s.
Caminhos Mínimos Com Uma Fonte 30/ 74 Algoritmo Bellman-Ford Sumário Algoritmo Bellman-Ford Algoritmo de Dijkstra Grafos Acíclicos
Caminhos Mínimos Com Uma Fonte 31/ 74 Algoritmo Bellman-Ford Algoritmo Bellman-Ford O algoritmo de Bellman-Ford resolve o problema de caminhos mínimos com uma fonte no caso geral, onde as arestas podem possuir peso negativo. O algoritmo retorna um valor Booleano indicando se foi ou não encontrado um ciclo de comprimento negativo alcançável a partir de s. Se não há ciclo negativo alcançável a partir de s, o algoritmo produz a árvore de caminhos mínimos com raiz em s e os seus respectivos comprimentos (pesos).
Caminhos Mínimos Com Uma Fonte 32/ 74 Algoritmo Bellman-Ford Algoritmo Bellman-Ford Bellman-Ford(G,w,s) 1) Initialize-Single-Source(G, s) 2) for i 1 to V[G] 1 3) do for each (u,v) E[G] 4) do Relax(u,v) 5) for each (u,v) E[G] 6) do if d[v] > d[u]+w(u,v) 7) then return FALSE 8) return TRUE
Caminhos Mínimos Com Uma Fonte 33/ 74 Algoritmo Bellman-Ford Grafo 6 t 5 2 x s 2 8 4 3 7 7 y 9 z
Caminhos Mínimos Com Uma Fonte 34/ 74 Algoritmo Bellman-Ford Bellman-Ford: inicialização 6 t 5 2 x s 0 2 8 4 3 7 7 y 9 z
Caminhos Mínimos Com Uma Fonte 35/ 74 Algoritmo Bellman-Ford Bellman-Ford: iteração 1 6 t 6 5 2 x s 0 2 8 4 3 7 7 7 y 9 z
Caminhos Mínimos Com Uma Fonte 36/ 74 Algoritmo Bellman-Ford Bellman-Ford: iteração 2 6 t 6 5 2 4 x s 0 2 8 4 3 7 7 7 y 9 2 z
Caminhos Mínimos Com Uma Fonte 37/ 74 Algoritmo Bellman-Ford Bellman-Ford: iteração 3 6 t 2 5 2 4 x s 0 2 8 4 3 7 7 7 y 9 2 z
Caminhos Mínimos Com Uma Fonte 38/ 74 Algoritmo Bellman-Ford Bellman-Ford: iteração 4 6 t 2 5 2 4 x s 0 2 8 4 3 7 7 7 y 9 2 z
Caminhos Mínimos Com Uma Fonte 39/ 74 Algoritmo Bellman-Ford Tempo de execução do algoritmo Bellman-Ford Fezendo V = n e E = m, podemos verificar que: Passo 1: O(n) Passo 2: Θ(n) Passo 3-4: Θ(1) Logo, o laço 2-4 leva Θ(nm) Laço 5-7 leva O(m) Conclusões: Portanto, Bellman-Ford executa em tempo Θ(nm). Para um grafo denso, m = Θ(n 2 ), o tempo de execução do algoritmo é Θ(n 3 ).
Caminhos Mínimos Com Uma Fonte 40/ 74 Algoritmo Bellman-Ford Bellman-Ford: corretude Lema Seja G = (V,E) um grafo direcionado com peso nas arestas Seja s V a fonte Seja w : E R a função peso Assuma que G não contém ciclos de peso negativo alcançáveis a partir de s Então, após V 1 passos do laço 2-4 do algoritmo Bellman-Ford, teremos d[v] = δ(s,v) para todo vértice v alcançável a partir de s.
Caminhos Mínimos Com Uma Fonte 41/ 74 Algoritmo Bellman-Ford Bellman-Ford: corretude Corolário Seja G = (V,E) um grafo direcionado com peso nas arestas Seja s V a fonte Seja w : E R a função peso Assuma que G não contém ciclos de peso negativo alcançáveis a partir de s Então, então para cada v V, existe um caminho de s para v se e somente se Bellman-Ford termina com d[v] < quando ele é aplicado sobre G.
Caminhos Mínimos Com Uma Fonte 42/ 74 Algoritmo Bellman-Ford Bellman-Ford: corretude Teorema Suponha que o algoritmo de Bellman-Ford executa sobre um grafo direcionado, G = (V,E), com função peso das arestas w : E R e tendo s como fonte. Se G não contém ciclos negativos, alcançáveis a partir de s, então: o algoritmo retorna TRUE; d[v] = δ(s,v) para todo v V; e o subgrafo predecessor Gπ é uma árvore de caminhos mínimos com raiz em s. Se G contém um ciclo negativo (alcançável a partir de s), então o algoritmo retorna FALSE.
Caminhos Mínimos Com Uma Fonte 43/ 74 Algoritmo de Dijkstra Sumário Algoritmo Bellman-Ford Algoritmo de Dijkstra Grafos Acíclicos
Caminhos Mínimos Com Uma Fonte 44/ 74 Algoritmo de Dijkstra Algoritmo de Dijkstra Princípios O algoritmo de Dijkstra resolve o problema de caminhos mínimos com uma fonte em um grafo direcionado G = (V,E), cujas arestas apresentam pesos não-negativos. O algoritmo mantém um conjunto S de vértices para os quais a distância do caminho mais curto a partir de s já foi computada. Ou seja, para todo v S, temos d[v] = δ(s,v). O algoritmo iterativamente seleciona um vértice u V S que possua a menor estimativa de distância, d[u] = min{d[v] : v V S}, e insere u em S. Ao mesmo tempo que relaxa as arestas que emanam de u.
Caminhos Mínimos Com Uma Fonte 45/ 74 Algoritmo de Dijkstra Algoritmo de Dijkstra S V S v 1 u 1 v 2 u 2 u 3 v 3 u 4
Caminhos Mínimos Com Uma Fonte 46/ 74 Algoritmo de Dijkstra Algoritmo de Dijkstra Dijkstra(G,w,s) 1) Initialize-Single-Source(G, s) 2) S 3) Q = V[G] 4) while Q 5) do u Extract min(q) 6) S S {u} 7) for each (u,v) Adj[u] 8) do Relax(u,v,w)
Caminhos Mínimos Com Uma Fonte 47/ 74 Algoritmo de Dijkstra Algoritmo de Dijkstra Uma vez que o algoritmo de Dijkstra sempre escolhe o vértice de V S mais próximo do conjunto S, dizemos que o algoritmo faz uso de uma técnica gulosa. Algoritmos gulosos tipicamente produzem soluções subótimas. No caso do problema de caminhos mínimos com uma fonte, o algoritmo guloso obtém a solução ótima. A chave para mostrar que o algoritmo produz uma solução ótima é o fato que quando u é inserido em S, d[u] = δ(s,u).
Caminhos Mínimos Com Uma Fonte 48/ 74 Algoritmo de Dijkstra Corretude do algoritmo de Dijkstra S V S p 1 π[u] u s p 3 p 2 x y
Caminhos Mínimos Com Uma Fonte 49/ 74 Algoritmo de Dijkstra Corretude do algoritmo de Dijkstra Teorema Se executarmos o algoritmo de Dijkstra em um grafo direcionado G = (V,E), onde w : E R +, Então, quando o algoritmo termina, d[v] = δ(s,v) para todo v V.
Caminhos Mínimos Com Uma Fonte 50/ 74 Algoritmo de Dijkstra Corretude do algoritmo de Dijkstra Demonstração Vamos mostrar que para cada u V, temos d[u] = δ(s,u) no momento em que u é inserido em S, e esta igualdade permanece. Com o propósito de contradição, suponha que u é o primeiro vértice tal que d[u] δ(s,u). Seja p = (p 1,π[u],u) o caminho produzido pelo algoritmo. Seja p = ( p 2,x,y, p 3 ) um caminho mais curto de s até u. y é o primeiro vértice em p que não pertence a S. Temos que w( p) < w(p).
Caminhos Mínimos Com Uma Fonte 51/ 74 Algoritmo de Dijkstra Corretude do algoritmo de Dijkstra Demonstração Sabemos que d[x] = δ(s,x). Caso contrário, u não seria o primeiro vértice com distância incorreta. Uma vez que y pertence a um caminho mais curto, temos que d[y] = δ(s,y) no momento em que x foi inserido em s. A aresta (x,y) foi relaxada no momento em que x foi inserido em S, fazendo com que d[y] se tornasse δ(s,y).
Caminhos Mínimos Com Uma Fonte 52/ 74 Algoritmo de Dijkstra Corretude do algoritmo de Dijkstra Demonstração Contudo, temos que: δ(s,u) < d[u] δ(s,y)+w( p 3 ) < d[u] d[y]+w( p 3 ) < d[u] [pois δ(s,y) = d[y]] d[y] < d[u] w( p 3 ) d[y] < d[u] [pois w( p 3 ) 0] Mas isto é uma contradição. O algoritmo teria escolhido y como o próximo vértice a ser inserido em S, não teria escolhido u.
Caminhos Mínimos Com Uma Fonte 53/ 74 Algoritmo de Dijkstra Análise do algoritmo de Dijkstra Vetor como fila de prioridades Neste caso, extract-min leva tempo O(n) e há n operações extract-min, com n = V e m = E. Uma vez que cada aresta é examinada no máximo uma vez, a operação relax é executada no máximo uma vez, levando tempo O(1). Podemos concluir que o algoritmo leva tempo O(n 2 +m) = O(n 2 ).
Caminhos Mínimos Com Uma Fonte 54/ 74 Algoritmo de Dijkstra Análise do algoritmo de Dijkstra Heap binário como fila de prioridades Quando o grafo é esparso, entretanto, é mais prático utilizarmos uma fila de prioridades implementada com heap binário. Neste caso, extract-min leva tempo O(lgn) e há n operações extract-min, com n = V e m = E. Cada aresta (u,v) é examinada uma vez, forçando uma operação relax(u,v,w) que custa no máximo O(lgn), quando a distância d[v] for reduzida. Portanto o algoritmo executa em tempo O(nlgn+mlgn) = O(mlgn) assumindo que m n.
Caminhos Mínimos Com Uma Fonte 55/ 74 Algoritmo de Dijkstra Análise do algoritmo de Dijkstra Heap Fibonacci como fila de prioridades Neste caso, extract-min leva tempo O(lgn) e há n operações extract-min, com n = V e m = E. Cada aresta (u,v) é examinada uma vez, forçando uma operação relax(u,v,w) que custa no máximo O(1) (tempo amortizado), quando a distância d[v] for reduzida. Portanto o algoritmo executa em tempo amortizado O(nlgn+m). Quando o grafo é denso, temos m = n 2 e o algoritmo executa em tempo O(n 2 ). Quando o grafo é esparso, temos O(nlgn) já que m = Θ(n).
Caminhos Mínimos Com Uma Fonte 56/ 74 Algoritmo de Dijkstra Dijkstra: grafo u 1 v 10 s 2 3 9 4 6 7 5 x 2 y
Caminhos Mínimos Com Uma Fonte 57/ 74 Algoritmo de Dijkstra Dijkstra: iteração 1 u 1 v 10 s 0 2 3 9 4 6 7 5 x 2 y
Caminhos Mínimos Com Uma Fonte 58/ 74 Algoritmo de Dijkstra Dijkstra: iteração 2 u 10 1 v 10 s 0 2 3 9 4 6 7 5 5 x 2 y
Caminhos Mínimos Com Uma Fonte 59/ 74 Algoritmo de Dijkstra Dijkstra: iteração 3 8 u 1 v 14 10 s 0 2 3 9 4 6 7 5 5 x 2 7 y
Caminhos Mínimos Com Uma Fonte 60/ 74 Algoritmo de Dijkstra Dijkstra: iteração 4 u 1 v 8 13 10 s 0 2 3 9 4 6 7 5 5 x 2 7 y
Caminhos Mínimos Com Uma Fonte 61/ 74 Algoritmo de Dijkstra Dijkstra: iteração 5 8 u 1 9 v 10 s 0 2 3 9 4 6 7 5 5 x 2 7 y
Caminhos Mínimos Com Uma Fonte 62/ 74 Algoritmo de Dijkstra Dijkstra: iteração 6 8 u 1 9 v 10 s 0 2 3 9 4 6 7 5 5 x 2 7 y
Caminhos Mínimos Com Uma Fonte 63/ 74 Grafos Acíclicos Sumário Algoritmo Bellman-Ford Algoritmo de Dijkstra Grafos Acíclicos
Caminhos Mínimos Com Uma Fonte 64/ 74 Grafos Acíclicos Grafos Acíclicos Relaxando as arestas segundo a ordem topológica de um grafo direcionado acíclico G = (V,E), leva ao cômputo da árvore de caminhos mínimos em tempo Θ( V + E ). Caminhos mínimos são sempre definidos em grafos acíclicos, pois mesmo na presença de arestas com pesos negativos, não existe ciclo de comprimento negativo.
Caminhos Mínimos Com Uma Fonte 65/ 74 Grafos Acíclicos Algoritmo Dag-Shortest-Paths(G, w, s) 1) topologically sort the vertices of G 2) Initialize-Single-Source(G, s) 3) for each u taken in topologically sorted order 4) do for each vertex v Adj[u] 5) do Relax(u,v,w)
Caminhos Mínimos Com Uma Fonte 66/ 74 Grafos Acíclicos Tempo de Execução Ordenação topológica pode ser realizada em tempo Θ( V + E ) utilizando o algoritmo de busca em profundidade. Cada vértice é examinado exatamente uma vez, quando sua lista de adjacência é examinada e a operação Relax é executada. Logo, o laço 3-5 executa em tempo Θ( V + E ). O tempo total de execução é, portanto, Θ( V + E ).
Caminhos Mínimos Com Uma Fonte 67/ 74 Grafos Acíclicos Exemplo 6 1 r s t u v x 5 2 7 0 1 2 3 4 2
Caminhos Mínimos Com Uma Fonte 68/ 74 Grafos Acíclicos Vértice r 6 1 r s t u v x 5 2 7 0 1 2 3 4 2
Caminhos Mínimos Com Uma Fonte 69/ 74 Grafos Acíclicos Vértice s 6 1 r s t u v x 5 2 7 0 2 6 1 2 3 4 2
Caminhos Mínimos Com Uma Fonte 70/ 74 Grafos Acíclicos Vértice t 6 1 r s t u v x 5 2 7 0 2 6 1 2 6 4 3 4 2
Caminhos Mínimos Com Uma Fonte 71/ 74 Grafos Acíclicos Vértice u 6 1 r s t u v x 5 2 7 0 2 6 1 2 5 4 3 4 2
Caminhos Mínimos Com Uma Fonte 72/ 74 Grafos Acíclicos Vértice v 6 1 r s t u v x 5 2 7 0 2 6 1 2 5 3 3 4 2
Caminhos Mínimos Com Uma Fonte 73/ 74 Grafos Acíclicos Vértice x 6 1 r s t u v x 5 2 7 0 2 6 1 2 5 3 3 4 2
Caminhos Mínimos Com Uma Fonte 74/ 74 Grafos Acíclicos Conclusões Fim! Obrigado pela presença