2015-10-22 16 views
7

Ich benutze Bellman-Ford, um den kürzesten Weg durch ein Diagramm mit einigen negativen Gewichten zu finden. Das Diagramm hat keine Möglichkeit für Schleifen und keine bidirektionalen Verbindungen. Ich möchte die K kürzesten Pfade durch den Graphen finden, wo die Pfade keine gemeinsamen Knoten haben. Gibt es einen Algorithmus, den ich nachschlagen kann, um zu lernen, wie man das macht? Eine einfache Implementierung ist momentan wichtiger als die Geschwindigkeit.Algorithmus, um Top-K-Pfade im Graphen zu finden, ohne gemeinsame Ecken, negative Gewichte?

Hinzugefügt: Danke für Kommentare. Um klar zu sein, suche ich nach den besten K Möglichkeiten, um von einem bestimmten Startknoten zu einem bestimmten Endknoten zu gelangen, ohne dass andere Knoten gemeinsam sind. Ich brauche ein globales Optimum; Das sequentielle Finden der besten und Löschen von Knoten ergibt kein befriedigendes Ergebnis. Dieser: https://en.wikipedia.org/wiki/Yen%27s_algorithm, gibt den Geschmack von dem, worüber ich spreche, aber in diesem Fall erfordert es nicht-negative Randkosten und es erlaubt auch Knoten geteilt werden.

+1

Ich nehme an, der Graph kann als verbunden angenommen werden? – Codor

+1

K kürzeste Pfade, die keine gemeinsamen Knoten haben, wie in den K kürzesten Pfaden, die zwei Scheitelpunkte verbinden und nur diese beiden Scheitelpunkte teilen? Wenn der Graph loopless ist, könnten Sie alle Pfade ausschöpfen und den kürzesten K nehmen? – opticaliqlusion

+2

Sie haben also eine gerichtete azyklische Grafik? Suchen Sie jetzt immer wieder nach einem kürzesten Pfad und löschen Sie die inneren Knoten oder sind Sie an einer globalen Optimierung interessiert? –

Antwort

2

Ich denke, dass das Problem gelöst werden kann, einen minimalen Kostenfluss zu finden.

Lassen Sie uns den Graphen in der folgenden Weise transformieren:

  1. jeden Knoten ersetzen v andere als Quelle und Senke mit zwei Knoten v1 und v2 durch eine Kante des Gewichts verbunden 0 aus v1 bis v2. Die eingehenden Kanten der ehemaligen v eingeben, um v1 und der scheidenden Urlaub von v2. Damit ist das Problem gleichbedeutend damit, dass diese Kanten nicht mehr als einmal mit verwendet werden.

  2. Stellen Sie die Kapazität 1 auf alle Kanten ein.

einen Fluss von Wert zu finden K Sie K Wege geben, die keinen Knoten teilen (in den neuen Kanten auf 1 wegen setzen die Kapazität). Wenn also dieser Fluss ein minimaler Kostenfluss ist, haben Sie die K Pfade auch die minimal mögliche Summe der Kosten.

Dies setzt voraus, dass Sie keine direkte Verbindung zwischen der Quelle und der Senke haben. Überprüfen Sie für dieses Eckgehäuse separat.

+0

Danke, haben Sie einen empfohlenen Algorithmus zur Lösung des minimalen Kostenflussproblems? – user2364295

+0

Ich würde vorschlagen, den Shortest Augmenting Path-Algorithmus anzuwenden, da er ziemlich einfach zu programmieren ist, aber Bellman-Ford anstelle von Dijkstra verwendet, weil Ihr Graph negative Kanten enthält. – AlexAlvarez