Ich implementiere den Algorithmus zum Aufheben des Zyklus, um eine optimale Lösung für das Problem des minimalen Kostenflusses zu finden. Durch das Auffinden und Entfernen negativer Kostenzyklen im Restnetz werden die Gesamtkosten in jeder Runde gesenkt. Um einen negativen Zyklus zu finden, verwende ich den Bellman-Ford-Algorithmus.
Mein Problem ist: Bellman-ford findet nur Zyklen, die von der Quelle aus erreichbar sind, aber ich muss auch Zyklen finden, die nicht erreichbar sind.
Beispiel: Im folgenden Netzwerk haben wir bereits einen maximalen Fluss angewendet. Die Kante macht es sehr teuer. Im Restnetz haben wir einen negativen Kostenzyklus mit Kapazität . Wenn wir es entfernen, erhalten wir eine billigere Lösung mit den Kanten und , aber wir können es nicht von der Quelle .1( C , T ) S.
Etiketten: Durchfluss / Kapazität, Kosten
Natürlich könnte ich Bellman-ford wiederholt mit jedem Knoten als Quelle ausführen, aber das klingt nicht nach einer guten Lösung. Ich bin ein wenig verwirrt, weil alle Papiere, die ich lese, diesen Schritt zu überspringen scheinen.
Können Sie mir sagen, wie man mit Bellman-Ford jeden negativen Zyklus findet (erreichbar oder nicht)? Und wenn nicht möglich, welchen anderen Algorithmus schlagen Sie vor?
quelle
Antworten:
Um meinen Kommentar zu erweitern, denken Sie daran, dass dieser Algorithmus zum Ermitteln des Min-Cost-Flow auf der Tatsache beruht, dass maximal ist. Mit dem ersten zu finden Ford-Fulkerson laufen f und das resultierende Restnetz G f , die Kosten f wird dann durch Auffinden negative Zyklen in reduzierten G f . Das heißt, indem wir negative Zyklen in G f finden , ändern wir nicht die Durchflussmenge f , sondern lediglich die Kosten.f f Gf f Gf Gf f
Wenn wir nun Bellman-Ford von in G f aus ausführen, können wir Kanten mit nicht negativem Fluss (per Definition von G f ) rückwärts verfolgen . Wenn Zyklen an Kanten in diesen Pfaden angrenzen, können wir eine gewisse Menge an Fluss auf andere Kanten im Zyklus "übertragen". Mit anderen Worten, wir halten den Nettofluss für einige Zyklen gleich, können aber die Kosten ändern.t Gf Gf
Beachten Sie, dass ein nicht erreichbarer Zyklus von einen Nullfluss haben muss. Andernfalls hätten wir einen Widerspruch darin, dass f maximal ist.t f
Ich entschuldige mich für die "Handwelligkeit" dieser Erklärung. Ich werde versuchen, formeller zu sein, wenn ich heute Abend Zeit habe.
quelle
Mein Vorschlag: Sie müssen den Algorithmus von T aus starten, um einen negativen Zyklus in Ihrem Restnetzwerk zu finden. Das Ergebnis sollte das gleiche sein, aber dann können Sie den Kreis erreichen
quelle
Ich denke, es reicht nicht aus, Bellman-Ford von T oder S aus zu betreiben. Betrachten Sie ein Beispiel, bei dem es eine Kante von S nach T und einen Zyklus mit negativen Kosten gibt, der weder von S noch von T erreichbar ist.
Eine Lösung besteht darin, ein Hilfs-S 'hinzuzufügen und eine Kante von S' zu jedem anderen Scheitelpunkt mit 0 Kosten hinzuzufügen. Dann fahren Sie Bellman-Ford von S '. Auf diese Weise sind alle negativen Zyklen von S 'aus erreichbar.
Darüber hinaus müssen Sie diesen Hilfsscheitelpunkt S 'in Ihrer Implementierung nicht wirklich hinzufügen. Initialisieren Sie einfach d (v) = 0 für einen beliebigen Scheitelpunkt v.
Sehen Sie, wie Boost Graph Library es implementiert.
quelle