Algoritmo de Bellman-Ford - Por que as bordas podem ser atualizadas fora de ordem?

14

O algoritmo de Bellman-Ford determina o caminho mais curto de uma fonte para todos os outros vértices. Inicialmente, a distância entre s e todos os outros vértices é definida como . Então, o caminho mais curto de s para cada vértice é calculado; isso continua por | V | - 1 iterações. Minhas perguntas são:sss|V|-1

  • Por que precisa haver iterações?|V|-1
  • Importa se eu verifiquei as bordas em uma ordem diferente?
    Por exemplo, se eu checar as arestas 1,2,3, mas na segunda iteração checarei 2,3,1.

Eric disse que a ordem não importava, mas isso me confunde: o algoritmo não atualizaria incorretamente um nó com base na aresta se seu valor dependesse da aresta x 1, mas x 1 é atualizado após x 2 ?x2x1x1x2

user1675999
fonte
Qual implementação você considera? A programação dinâmica não tem problemas com a ordem, obviamente; para outros, pode não ser trivial.
Raphael

Respostas:

15

Considere o caminho mais curto de a t , s , v 1 , v 2 , , v k , t . Este caminho consiste em no máximo | V | - 1 arestas, porque repetir um vértice no caminho mais curto é sempre uma má ideia (ou pelo menos existe um caminho mais curto que não repita vértices), se não tivermos ciclos de peso negativos.sts,v1,v2,...,vk,t|V|-1

Na primeira rodada, sabemos que a aresta será relaxada; portanto, a distância estimada para v 1 estará correta após essa rodada. Observe que não temos idéia do que é v 1 neste momento, mas como relaxamos todas as arestas, devemos ter relaxado essa também. Na segunda rodada, relaxamos ( v 1 , v 2 ) em algum momento. Ainda não temos idéia do que v 1 ou v 2 são, mas sabemos que suas estimativas de distância estão corretas.(s,v1)v1v1(v1,v2)v1v2

Repetindo isso, depois de alguma rodada , relaxamos ( v k , t ) , após o qual a estimativa de distância para t está correta. Não temos idéia do que é k até que todo o algoritmo termine, mas sabemos que isso acontecerá em algum momento (supondo que não haja ciclos de peso negativos).k+1(vk,t)tk

Portanto, a observação crucial é que, após a rodada , o i- ésimo nó do caminho mais curto deve ter sua estimativa de distância definida no valor correto. Como o caminho é no máximo | V | - 1 aresta de comprimento, | V | - 1 rodada é suficiente para encontrar o caminho mais curto. Se um | V | A rodada ainda muda algo, então algo estranho está acontecendo: todos os caminhos já devem estar "estabelecidos" para seus valores finais, portanto, devemos ter a situação de que existe algum ciclo de peso negativo.EuEu|V|-1|V|-1|V|

Alex ten Brink
fonte
Tenho uma pequena dúvida aqui. Acredito que | v | -1 é o pior número de rodadas após o qual o caminho mais curto é calculado de s a t. Suponha que temos os vértices s, v1, v2..vn, t. As arestas são escolhidas nesta ordem, digamos (s, v1), (v1, v2) .. (vn, t), então, em uma única iteração, teremos o caminho mais curto de s para t. Isso é apenas para entender e termos práticos, não sabemos a ordem das arestas sendo escolhidas e, portanto, | v | -1 rodadas. Estou certo?
Whokares
1
@ whokares: sim, você pode ter sorte e encontrar o caminho mais curto na primeira rodada. Até a última rodada, você não tem certeza de que o valor encontrado é realmente o caminho mais curto, mas pode ser. O algoritmo de Dijkstra essencialmente 'faz' isso acontecer: se todas as arestas tiverem pesos não negativos, a fila de prioridade usada no algoritmo de Dijkstra 'prediz' a ordem em que você deve relaxar as arestas para encontrar todos os caminhos mais curtos em sua primeira rodada de relaxações.
Alex-Brink
Obrigado pela atualização. Entendi. Em um dos materiais, ele é mencionado no <br> Slide 6: Uma má escolha da ordem de relaxamento pode levar a muitos relaxamentos exponencialmente: <br> Slide 8: Ordem "inteligente" de relaxamentos nas bordas <br>
whokares 12/12/12
Independentemente da ordem das arestas em cada iteração, os caminhos mais curtos serão calculados nas iterações | v | -1, certo? Por que ele diz exponencial? Ele quer dizer que se escolhermos a mesma ordem para todas as iterações que normalmente fazemos, o código de relaxamento será chamado, mas a atualização do rótulo para um vértice pode acontecer apenas um número menor de vezes por causa da ordem, economizando o processador Tempo ?
whokares
1
@ whokares: o primeiro algoritmo que eles apresentam (que pode ter tempo de execução exponencial) não relaxa todas as arestas em uma rodada, mas encontra alguma aresta para a qual uma operação de relaxamento mudaria alguma coisa e relaxa essa aresta. Se você continuar fazendo isso e não houver um ciclo de peso negativo, eventualmente nenhuma borda ajudará mais e você parará. No entanto, como você não tem rondas e não define em qual borda relaxar a seguir, você pode acabar fazendo um número exponencial de relaxamentos. O algoritmo aprimorado que eles apresentam é o Bellman-Ford, que possui rodadas.
Alex12 Brink
3

O maior caminho que um caminho pode ter sem ciclos é |V|. Começamos com uma fonte; portanto, já temos um caminho de comprimento 1; portanto, precisamos de |V| - 1mais nós para obter o caminho mais longo.

O pedido não importa, pois todo pedido manterá a invariante: após as niterações, o valor de cada nó é menor ou igual ao custo do caminho de custo mínimo sdo nó que contém no máximo narestas.

Se, no início de uma iteração, o custo estiver correto até nnós, no final da iteração, estará correto até n+1nós. Uma reordenação pode fazer com que alguns nós tenham um custo menor antes de serem atualizados normalmente, mas acabam sendo atualizados de qualquer maneira.

fgb
fonte
Não sei se sou apenas eu ou não consigo visualizar esses fatos facilmente. Para mim, ainda acho que pode haver alguns nós que não foram atualizados nas iterações do V-1.
user1675999
Não, você possui | E | = | V | -1 arestas quando possui | V | nós conectados por um caminho simples sem ciclos. E você tem iterações | V | -1, exclua sua resposta porque está errada.
Sam
@ sam Quem é você e o que qualquer coisa que você diz tem a ver com a resposta?
Fgh 16/08/19