0% acharam este documento útil (0 voto)
9 visualizações30 páginas

MC558 13 Handout

Enviado por

stylegamesbr
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd
0% acharam este documento útil (0 voto)
9 visualizações30 páginas

MC558 13 Handout

Enviado por

stylegamesbr
Direitos autorais
© © All Rights Reserved
Levamos muito a sério os direitos de conteúdo. Se você suspeita que este conteúdo é seu, reivindique-o aqui.
Formatos disponíveis
Baixe no formato PDF, TXT ou leia on-line no Scribd

Algoritmo de

Bellman-Ford MC558 - Projeto e Análise de


Algoritmos II

13
09/24

Santiago Valdés Ravelo


[Link]
ravelo@[Link]
“A menor distância entre pontos é uma linha reta.”

Arquimedes
Aulas anteriores
Aulas anteriores

Representando caminhos mínimos

I Para cada v ∈ V[G], associamos um PREDECESSOR π[v].

I O vetor π induz uma ÁRVORE DE CAMINHOS


MÍNIMOS com raiz em s.

I Um caminho de s a v na árvore é um caminho mínimo


de s a v no grafo G.
Aulas anteriores

Inicialização

Algoritmo: Initialize-Single-Source(G, s)
1 para cada v ∈ V [G]
2 d[v ] ← ∞
3 π[v ] ← NIL
4 d[s] ← 0
Aulas anteriores

Relaxação

Tenta melhorar a estimativa d[v] examinando (u,v).


d[a] = 5 d[b] = 9 d[a] = 5 d[b] = 6
2 2
a b a b

Relax Relax

d[a] = 5 d[b] = 7 d[a] = 5 d[b] = 6


2 2
a b a b

Algoritmo: Relax(u, v , w )
1 se d[v ] > d[u] + w (u, v )
2 d[v ] ← d[u] + w (u, v )
3 π[v ] ← u
Aulas anteriores

Algoritmos baseados em relaxação

Características:
1. Inicializam d e π com uma sub-rotina
Initialize-Single-Source.
2. Alteram d e π apenas com uma sub-rotina Relax.

Esses algoritmos mantêm algumas invariantes:


I Existe um caminho de s a v com peso d[v].
I Esse caminho pode ser recuperado por meio π.
I Assim, d[v] é sempre MAIOR OU IGUAL a dist(s,v).
I Queremos que no final valha d[v] = dist(s,v).
Aulas anteriores

Propriedade de algoritmos baseados em relaxação

I Limite superior: Vale d[v] ≥ dist(s,v) e, tão logo d[v] alcança dist(s,v),
nunca mais muda.
I Inexistência de caminho: Se não existe caminho de s a v, então
d[v] = ∞.
I Subgrafo de predecessores: Se d[v] < ∞, então o subgrafo dos
predecessores induzido por π é um caminho de peso d[v].
I Convergência: Se p é um caminho mínimo de s até v terminando com a
aresta (u,v) e d[u] = dist(s,u), então ao relaxar (u,v), d[v] = dist(s,v),
que nunca mais muda.
I Relaxamento de caminho: Se p = (v0 , v1 , . . . , vk ) é um caminho mínimo
de s = v0 a vk e relaxamos as arestas de p na ordem
(v0 , v1 ), (v1 , v2 ), . . . , (vk−1 , vk ), então d[vk ] = dist(s, vk ).
A propriedade vale mesmo se tivermos realizado quaisquer outras
relaxações durante a execução.
Algoritmo de
Bellman-Ford
Algoritmo de Bellman-Ford

Arestas vs ciclos de peso negativo

I O algoritmo de Dijkstra resolve o Problema dos Caminhos


Mínimos quando (G, w ) NÃO TEM ARESTAS DE PESO
NEGATIVO.

I Quando (G, w ) possui arestas negativas, o algoritmo de


Dijkstra não funciona.

I Uma das dificuldades com arestas negativas é a possível


existência de CICLOS DE PESO NEGATIVO ou
simplesmente ciclos negativos.
Algoritmo de Bellman-Ford

Ciclos negativos — uma dificuldade

I O Problema dos Caminhos Mínimos para instâncias com ciclos


negativos é NP-DIFÍCIL.

I Acreditamos que NÃO existem algoritmos eficientes para


resolver problemas NP-difíceis.

I Assim, vamos nos restringir ao Problema de Caminhos


Mínimos SEM CICLOS NEGATIVOS.

I Um algoritmo que resolve o problema restrito é o algoritmo de


Bellman-Ford, que também é baseado em relaxação.
Algoritmo de Bellman-Ford

Definição do problema

Problema
Entrada: Um grafo direcionado G = (V, E), uma função de peso
w nas arestas e um vértice origem s.

Saída: FALSE, se existe um ciclo negativo atingível a partir de s.


Caso contrário, além de TRUE, também devolve um vetor d com
d[v] = dist(s,v) para v ∈ V e um vetor π definindo uma ÁRVORE
DE CAMINHOS MÍNIMOS.
Algoritmo de Bellman-Ford

Ideia do algoritmo de Bellman-Ford

Relaxamento de caminho: Para QUALQUER caminho mínimo


(v0 , v1 , . . . , vk ), queremos relaxar (v0 , v1 ), (v1 , v2 ), . . . , (vk−1 , vk ) em ordem.

1. Executamos Relax para todas as arestas:


⇒ (v0 , v1 ) relaxada.
2. Executamos novamente Relax para todas as arestas:
⇒ (v0 , v1 ), (v1 , v2 ) relaxadas em ordem.
3. Executamos novamente Relax para todas as arestas:
⇒ (v0 , v1 ), (v1 , v2 ), (v2 , v3 ) relaxadas em ordem.
4. Repetimos esse passo até |V | − 1 vezes. Por quê?
⇒ (v0 , v1 ), (v1 , v2 ), . . . , (vk−1 , vk ) relaxadas em ordem.

Podemos verificar se o grafo contém CICLOS NEGATIVOS executando mais


uma vez:
I Se algum valor d[v] diminuir, então há ciclo negativo.
Algoritmo de Bellman-Ford

Exemplo

5 −4
a −2 e
66

b 8 −3
−3 7

77
c d
9

a b c d e
d ∞
6 0 ∞
2 ∞
2 ∞
7 −2 4

Ordem: (a,c),(a,d),(a,e),(c,d),(c,e),(d,b),(d,e),(e,a),(b,a),(b,c).
Algoritmo de Bellman-Ford

O algoritmo de Bellman-Ford

Algoritmo: Bellman-Ford(G, w , s)
1 Initialize-Single-Source(G, s)
2 para i ← 1 até |V [G]| − 1
3 para cada (u, v ) ∈ E [G]
4 Relax(u, v , w )

5 para cada (u, v ) ∈ E [G]


6 se d[v ] > d[u] + w (u, v )
7 devolva FALSE

8 devolva TRUE, d, π

Complexidade de tempo: O(VE )


Algoritmo de Bellman-Ford

Correção do algoritmo Bellman-Ford

Teorema
Bellman-Ford devolve:

I FALSE, se existe um ciclo negativo atingível a partir de s.

I TRUE, caso contrário; neste caso devolve também:

I Um vetor d com d[v] = dist(s,v) para v ∈ V.

I Um vetor π definindo uma ÁRVORE DE CAMINHOS


MÍNIMOS.
Algoritmo de Bellman-Ford

Correção do algoritmo Bellman-Ford

Primeiro, suponha que não há ciclos negativos atingíveis por s.

Considere v ∈ V[G] e os valores de d e π após o primeiro laço:

I Se v não é atingível, d[v] = ∞ (por Inexistência de caminho).

I Senão, existe caminho mínimo (v0 , v1 , . . . , vk ) de s = v0 a v = vk .

I Como k ≤ |V | − 1, então (v0 , v1 ), (v1 , v2 ), . . . , (vk−1 , vk ) foram


relaxadas NESTA ORDEM.
I Por Relaxamento de caminho, d[v] = dist(s,v).

I Também, por Sugrafo de predecessores: π induz um caminho


mínimo de s a v.
Algoritmo de Bellman-Ford

Correção do algoritmo Bellman-Ford

Também temos que mostrar que nesse caso Bellman-Ford


devolve TRUE.

I Considere d imediatamente após o primeiro laço.

I Nesse instante, d[v] = dist(s,v) para todo vértice v.

I Por Convergência, sabemos que d nunca mais muda.

I Portanto, o teste da linha 6 falha sempre.

I Concluindo que o algoritmo devolve TRUE.


Algoritmo de Bellman-Ford

Correção do algoritmo Bellman-Ford

Suponha agora que (G, w ) contenha CICLO NEGATIVO


alcançável por s.

Queremos mostrar que o algoritmo devolve FALSE:

I Seja C = (v0 , v1 , . . . , vk = v0 ) um ciclo tal que

w (C ) = ki=1 w (vi−1 , vi ) < 0.


P

I Suponha, por contradição que o algoritmo devolve TRUE.

I Como relaxamos cada aresta (vi−1 , vi ):

d[vi ] ≤ d[vi−1 ] + w (vi−1 , vi ).


Algoritmo de Bellman-Ford

Correção do algoritmo Bellman-Ford

I Somando as desigualdades anteriores para cada aresta do ciclo,


temos:
k
X k
X
d[vi ] ≤ (d[vi−1 ] + w (vi−1 , vi ))
i=1 i=1
k
X k
X
= d[vi−1 ] + w (vi−1 , vi ).
i=1 i=1

Pk Pk
I Como v0 = vk , temos que i=1 d[vi ] = i=1 d[vi−1 ].
Pk
I Logo, 0 ≤ i=1 w (vi−1 , vi ) = w (C ).
I Mas isso é uma contradição, pois C é ciclo negativo.

I Concluindo que, nesse caso, o algoritmo devolve FALSE.


Sistemas de
restrições de
diferenças
Sistemas de restrições de diferenças

Exemplo
Uma aplicação de caminhos mínimos é encontrar x1 , x2 , . . . , xn que
satisfaçam:
x1 − x2 ≤ 0
x1 − x5 ≤ −1
x2 − x5 ≤ 1
x3 − x1 ≤ 5
x4 − x1 ≤ 4
x4 − x3 ≤ −1
x5 − x3 ≤ −3
x5 − x4 ≤ −3

Onde:
I xi representa a hora do evento i
I xj − xi ≤ bk significa que deve haver um intervalo de pelo menos bk
horas entre eventos i e j
Sistemas de restrições de diferenças

Exemplo

Podemos reescrever as restrições de forma matricial:

1 −1
   
0 0 0 0
 1
 0 0 0 −1  
 x1
 
 −1 

 0
 1 0 0 −1 
  x2 

 1 

 −1 0 1 0 0     5 
   x3  ≤  
 −1 0 0 1 0 
   4 
  x4   
 0
 0 −1 1 0  x5

 −1 

 0 0 −1 0 1   −3 
0 0 0 −1 1 −3

Algumas soluções:
I x = (−5, −3, 0, −1, −4),
I x 0 = (0, 2, 5, 4, 1),. . .
Sistemas de restrições de diferenças

Soluções de sistemas de restrições de diferenças

Lema
Seja x = (x1 , . . . , xn ) uma solução de um sistema de restrições de
diferença Ax ≤ b e d uma constante. Então

x + d = (x1 + d, . . . , xn + d)

também é uma solução de Ax ≤ b.

Mostraremos a seguir como encontrar uma solução de um sistema


Ax ≤ b de restrições de diferença resolvendo um problema de
caminhos mínimos.
Sistemas de restrições de diferenças

Grafo de restrições

Construímos o chamado GRAFO DE RESTRIÇÕES fazendo o


seguinte:

1. Primeiro criamos um grafo em que:


I Cada vértice vi corresponde a uma variável xi .

I Cada aresta (vi , vj ) tem peso bk e corresponde a uma restrição


xj − xi ≤ bk .
I Logo, a matriz A do sistema de restrições corresponde à
transposta matriz de incidência desse grafo obtido

2. Finalmente, adicionamos um vértice especial v0 e uma aresta


de v0 a cada outro vértice vi com peso 0.
Sistemas de restrições de diferenças

Grafo de restrições

Formalmente, dado o sistema Ax ≤ b de restrições de diferença,


construímos o grafo G = (V, E) tal que:

I V = {v0 , v1 , . . . , vn }.

I E = {(v0 , v1 ), . . . , (v0 , vn )} ∪ {(vi , vj ) : xj − xi ≤ bk é restrição}

E associamos pesos:
(
bk se xj − xi ≤ bk é restrição
I w (vi , vj ) =
0 se i = 0
Sistemas de restrições de diferenças

Grafo de restrições

v1

0 −1 0

0 1
v0 v5 v2
4 5
0
−3
−3 −3

−1
v4 v3
0

Uma solução viável é x = (−5, −3, 0, −1, −4).


Sistemas de restrições de diferenças

Grafo de restrições

Teorema
Seja Ax ≤ b um sistema de restrições de diferença e G = (V, E) o
grafo de restrições associado. Então:
I Se G não contém ciclos negativos,

x = (dist(v0 , v1 ), dist(v0 , v2 ), . . . , dist(v0 , vn ))

é uma solução viável do sistema.


I Se G contém ciclos negativos, o sistema não possui solução.
viável.
Sistemas de restrições de diferenças

Resolvendo um sistema de restrições de diferença

Para RESOLVER O SISTEMA, basta resolver caminhos mínimos:


I Executamo Bellman-Ford a partir de v0 no grafo de
restrições G.
I Como todo vértice é atingível de v0 , se houver ciclo negativo,
o algoritmo devolve FALSE.
I Se não existir ciclo negativo, então obtemos a solução
x = (d[v1 ], d[v2 ], . . . , d[vn ]).
O TEMPO DE EXECUÇÃO é calculado como segue:
I A matriz A tem dimensões m × n.
I Então, G possui n + 1 vértices e n + m arestas.
I Logo, o tempo de execução de Bellman-Ford em G é
O((n + 1)(n + m)) = O(n2 + nm).
Algoritmo de
Bellman-Ford MC558 - Projeto e Análise de
Algoritmos II

13
09/24

Santiago Valdés Ravelo


[Link]
ravelo@[Link]

Você também pode gostar