Bellman-Ford-Algorithmus - Warum können Kanten nicht in der richtigen Reihenfolge aktualisiert werden?


14

Der Bellman-Ford - Algorithmus bestimmt den kürzesten Weg von einer Quelle zu allen anderen Ecken. Anfangs ist der Abstand zwischen s und allen anderen Scheitelpunkten auf ∞ eingestellt . Dann wird der kürzeste Weg von s zu jedem Scheitelpunkt berechnet; das geht weiter für | V | - 1 Iterationen. Meine Fragen sind:sss|V|1

  • Warum muss es Iterationen?|V|1
  • Würde es etwas ausmachen, wenn ich die Kanten in einer anderen Reihenfolge überprüfe?
    Angenommen, ich überprüfe zuerst die Kanten 1, 2, 3 und dann bei der zweiten Iteration die Kanten 2, 3, 1.

MIT Prof. Eric sagte, dass die Reihenfolge keine Rolle spielt, aber das verwirrt mich: Würde der Algorithmus einen Knoten, der auf Kante basiert, nicht fälschlicherweise aktualisieren, wenn sein Wert von Kante x 1 abhängt, aber x 1 nach x 2 aktualisiert wird ?x2x1x1x2


Welche Implementierung sehen Sie? Bei der dynamischen Programmierung hat man natürlich kein Problem mit der Reihenfolge; für andere mag es nicht trivial sein.
Raphael

Antworten:


15

Betrachten Sie den kürzesten Weg von nach t , s , v 1st . Dieser Pfad besteht aus höchstens | V | - 1 Kanten, da das Wiederholen eines Scheitelpunkts auf einem kürzesten Pfad immer eine schlechte Idee ist (oder zumindest gibt es einen kürzesten Pfad, der keine Scheitelpunkte wiederholt), wenn wir keine negativen Gewichtszyklen haben.s,v1,v2,,vk,t|V|1

In Runde 1 wissen wir, dass die Kante gelockert wird, sodass die Entfernungsschätzung für v 1 nach dieser Runde korrekt ist. Beachten Sie, dass wir zu diesem Zeitpunkt keine Ahnung haben, was v 1 ist, aber da wir alle Kanten entspannt haben, müssen wir auch diese entspannt haben. In Runde zwei entspannen wir uns(s,v1)v1v1 . Wir haben noch keine Ahnung, was v 1 oder v 2 sind, aber wir wissen, dass ihre Entfernungsschätzungen korrekt sind.(v1,v2)v1v2

Wiederholen Sie dies nach einer Runde wir k + 1 , so haben wir uns entspannt ( v k , t ) , wonach die Entfernungsschätzung für t korrekt ist. Wir haben keine Ahnung, was k ist, bis der gesamte Algorithmus beendet ist, aber wir wissen, dass es irgendwann passieren wird (vorausgesetzt, es gibt keine negativen Gewichtszyklen).k+1(vk,t)tk

Die entscheidende Beobachtung ist also, dass nach Runde die Entfernungsschätzung des i- ten Knotens des kürzesten Pfades auf den richtigen Wert gesetzt werden muss. Da der Weg höchstens ist | V | - 1 Kanten lang, | V | - 1 Runden reichen aus, um diesen kürzesten Weg zu finden. Wenn ein | V | Die Runde ändert noch etwas, dann passiert etwas Seltsames: Alle Pfade sollten bereits auf ihre endgültigen Werte "festgelegt" sein, also müssen wir die Situation haben, dass ein negativer Gewichtszyklus existiert.ii|V|1|V|1|V|


Ich habe hier einen kleinen Zweifel. Ich glaube, dass | v | -1 die ungünstigste Anzahl von Runden ist, nach der der kürzeste Weg von s nach t berechnet wird Kanten werden in dieser Reihenfolge ausgewählt, sagen wir (s, v1), (v1, v2). (vn, t), dann haben wir in einer einzelnen Iteration selbst den kürzesten Weg von s nach t. Dies ist nur zum Verständnis und in In der Praxis wissen wir nicht, in welcher Reihenfolge Kanten ausgewählt werden und daher | v | -1 Runden. Habe ich recht?
Whokares

1
@whokares: ja, du könntest Glück haben und den kürzesten Weg in der ersten Runde finden. Sie wissen bis zur letzten Runde nicht genau, dass der Wert, den Sie finden, der kürzeste Weg ist, aber es könnte sein, dass dies der Fall ist. Der Dijkstra-Algorithmus bewirkt im Wesentlichen Folgendes: Wenn alle Kanten nicht negative Gewichte aufweisen, "sagt" die Prioritätswarteschlange, die im Dijkstra-Algorithmus verwendet wird, die Reihenfolge voraus, in der Sie Kanten entspannen sollten, damit Sie in Ihrer ersten Runde der Relaxationen alle kürzesten Pfade finden.
Alex ten Brink

Vielen Dank für das Update. Ich habe es bekommen. In einem der Materialien wird es als <br> Folie 6 erwähnt: Eine schlechte Wahl der Relaxationsreihenfolge kann zu exponentiell vielen Relaxationen führen: <br> Folie 8: „Intelligente“ Reihenfolge der Kantenrelaxationen <br>
whokares

Unabhängig von der Reihenfolge der Kanten in jeder Iteration werden die kürzesten Pfade in | v | -1 Iterationen berechnet, richtig? Warum sagt er exponentiell. Bedeutet er, dass, wenn wir für alle Iterationen, die wir normalerweise ausführen, dieselbe Reihenfolge wählen, der Relaxationscode aufgerufen wird, die Aktualisierung der Bezeichnung für einen Scheitelpunkt jedoch aufgrund der Reihenfolge möglicherweise nur seltener erfolgt, wodurch der Prozessor gespart wird Zeit?
Whokares

1
@whokares: Der erste Algorithmus, den sie präsentieren (der eine exponentielle Laufzeit haben kann), lockert nicht alle Kanten in einer Runde, sondern findet eine Kante, für die eine Relaxationsoperation etwas ändern würde, und lockert diese Kante. Wenn Sie so weitermachen und es keinen negativen Gewichtszyklus gibt, helfen Ihnen eventuell keine Kanten mehr und Sie hören auf. Da Sie jedoch keine Runden und keine festgelegte Reihenfolge haben, an der Sie sich als Nächstes entspannen müssen, werden Sie möglicherweise eine exponentielle Anzahl von Relaxationen durchführen. Der verbesserte Algorithmus, den sie präsentieren, ist Bellman-Ford, der Runden hat.
Alex ten Brink

3

Der längste Weg ohne Zyklen ist |V|. Wir beginnen mit einer Quelle, also haben wir bereits einen Pfad der Länge 1, also brauchen wir |V| - 1mehr Knoten, um den längsten Pfad zu erhalten.

Die Reihenfolge spielt keine Rolle, da bei jeder Reihenfolge die Invariante beibehalten wird: Nach nIterationen ist der Wert für jeden Knoten kleiner oder gleich den Kosten des minimalen Kostenpfads von szu dem Knoten, der höchstens nKanten enthält.

Wenn zu Beginn einer Iteration die Kosten bis zu den nKnoten korrekt sind, sind sie am Ende der Iteration bis zu den n+1Knoten korrekt . Eine Neuordnung kann dazu führen, dass einige Knoten niedrigere Kosten verursachen, bevor sie normalerweise aktualisiert werden, aber sie werden schließlich trotzdem aktualisiert.


Ich weiß nicht, ob es nur ich ist, oder ich kann mir diese Fakten nicht so leicht vorstellen. Ich denke immer noch, dass es einige Knoten gibt, die in den V-1-Iterationen nicht aktualisiert wurden.
user1675999

Nein, Sie haben | E | = | V | -1 Kanten, wenn Sie | V | haben Knoten, die durch einen einfachen Pfad ohne Zyklen verbunden sind. Und Sie haben | V | -1 Iterationen, löschen Sie Ihre Antwort, weil es falsch ist.
Sam

@sam Wer bist du und was haben deine Aussagen mit der Antwort zu tun?
fgb
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.