Welche k-besten Shortest-Path-Algorithmen sollte ich berücksichtigen?

13

Ich löse ein Problem mit der Optimierung der Diagrammsuche. Ich muss die k besten azyklischen kürzesten Wege durch einen gerichteten gewichteten Graphen finden.

Ich weiß, dass es eine Reihe von genauen und ungefähren k-best-Algorithmen gibt, aber die meisten neueren Untersuchungen scheinen sich an sehr großen, sehr spärlich verknüpften Graphen zu orientieren (z. B. Routenführung und Richtungen), und meine Grafik ist keine von beiden.

Unterscheidungsmerkmale meines Problems:

  • Das Diagramm besteht aus ungefähr 160 Scheitelpunkten.

  • Der Graph ist fast vollständig verbunden (bidirektional, also ~ 160 ^ 2 ~ = 25k Kanten)

  • k wird ziemlich klein sein (wahrscheinlich weniger als 10)

  • Die maximale Pfadlänge wird wahrscheinlich begrenzt und auch sehr klein sein (zB 3-5 Kanten)

  • Ich habe oben 'azyklisch' gesagt, aber nur um es noch einmal zu wiederholen - Lösungen dürfen keine Zyklen enthalten. Dies ist kein Problem für den 1-besten kürzesten Weg, aber es wird ein Problem für den k-besten Weg. Betrachten Sie beispielsweise eine Straßenführung eine kurze Reise um einen Block irgendwo. Das ist vielleicht mathematisch optimal, aber keine sehr nützliche Lösung. ;-)

  • Möglicherweise müssen wir die Kanten für jede Berechnung sofort neu gewichten. Ein Kantenkosten besteht aus einer gewichteten Summe mehrerer Faktoren, und die endgültigen Anforderungen (wann immer wir sie erhalten) können es einem Benutzer ermöglichen, seine eigene Priorisierung dieser Gewichtungsfaktoren festzulegen und die Kantengewichtung zu ändern. Dies ist ein relativ kleines Diagramm (wir sollten es in der Lage sein, es in ein paar hundert KB darzustellen). Es ist daher wahrscheinlich sinnvoll, das Diagramm im Speicher zu klonen, die Neugewichtung anzuwenden und dann die Suche im geklonten Diagramm auszuführen. Aber wenn es eine effektivere Methode gibt, um die Suche durchzuführen, während Gewichte on-the-fly berechnet werden, bin ich interessiert.

Ich beschäftige mich mit den in Santos (K-Algorithmen), Eppstein 1997 (Finding the k Shortest Paths) und anderen beschriebenen Algorithmen. Der Algorithmus von Yen ist vor allem aufgrund der vorhandenen Java- Implementierung von Interesse . Ich habe keine Angst davor, die Forschungsarbeiten zu lesen, aber ich dachte, es lohnt sich, die Details meines Problems zu besprechen und nach Hinweisen zu fragen, um etwas Lesezeit zu sparen.

Und wenn Sie Zeiger auf Java-Implementierungen haben, noch besser.

AaronD
quelle
+1, weil ich an den Vorschlägen interessiert bin, die die Leute haben, und dies scheint genau die Art von Frage zu sein, für die diese Website gemacht wurde.
KChaloux
Bedeutet Ihre azyklische Bedingung nicht, dass JEDER andere Pfad von Anfang bis Ende einen Zyklus mit dem ersten Pfad erzeugen würde? Und wenn sowohl Start als auch Ziel in einer Sackgasse liegen, muss jeder Pfad diese beiden Kanten verwenden.
user470365
Vielleicht war ich nicht klar. Die azyklische Beschränkung gilt nur für einen einzelnen Pfad - natürlich bilden 2 unterschiedliche Pfade von A nach B einen Zyklus.
AaronD
@ AaronD: Also, welches hast du am Ende benutzt?
Montag,
@arnaud: Ich bin nicht sicher, ob ich mich für einen Algorithmus entschieden habe. Ich werde ein Update zu dieser Frage hinzufügen, wenn ich habe. Ich habe Eppstein eliminiert, weil es keine azyklischen (auch "einfachen") Lösungen garantiert. Ich arbeite derzeit mit dem Algorithmus von Yen, habe aber noch keine detaillierte Profilerstellung oder Optimierung durchgeführt, sodass ich ihn möglicherweise durch einen anderen ersetzen muss. Ich werde es in den nächsten ein oder zwei Wochen aktualisieren.
AaronD

Antworten:

2

Um meine eigene Frage teilweise zu beantworten:

Seit dem Posten dieser Frage habe ich festgestellt, dass wir sowohl mit negativen als auch mit positiven Kantengewichten umgehen müssen (die Beschränkung auf azyklische / einfache / schleifenlose Pfade bedeutet, dass die beste Lösung definiert wird, während ohne diese Beschränkung der kürzeste Pfad durch einen Graphen mit negativem Wert definiert wird. Kostenzyklen ist undefiniert).

Der Algorithmus von Yen und die meisten anderen, die ich untersucht habe, hängen von einer Reihe von 1-besten Suchanfragen ab. Die meisten verwenden Dijkstra für diese Zwischensuchen. Dijkstra unterstützt keine negativen Kantengewichte, aber wir können stattdessen Bellman-Ford einsetzen (zumindest in Yen; vermutlich auch in Lawler oder Eppstein). Ich habe eine Modifikation von Bellman-Ford mit einer Pfadlängenbegrenzung (in Kanten) und einer expliziten Zyklusprüfung während der Suche (anstelle der Standard-Zykluserkennung nach der Suche) entwickelt. Die rechnerische Komplexität ist schlimmer, aber für meine Anforderungen noch nachvollziehbar. Ich bearbeite diese Antwort und verknüpfe sie mit einem technischen Bericht, wenn ich die Erlaubnis zum Posten erhalte.

AaronD
quelle
1

Ich würde sagen, diese Frage kann leicht gegoogelt werden und ist auch ein Duplikat:

Davon abgesehen habe ich Eppstein bereits genutzt und implementiert und empfehle es weiter. Ich fand es ziemlich elegant. Wenn ich mich recht erinnere, kann es auch optimal sein, und das folgende Papier erklärt es sehr schön:

http://pdf.aminer.org/001/059/121/finding_the_k_shortest_paths.pdf

dagnelies
quelle
Zunächst einmal vielen Dank für die Empfehlung von Eppstein. Ich werde dort mehr suchen. Ich würde argumentieren, dass dies kein genaues Duplikat ist, noch ist es einfach zu googeln; Es ist einfach, einen k-best-Algorithmus zu finden, aber nicht so einfach, vernünftig zwischen ihnen zu wählen. Ich gehe davon aus, dass ich für einen dünn zusammenhängenden Graphen mit Millionen von Scheitelpunkten einen ganz anderen Algorithmus haben möchte als für dieses Problem. Ich würde mich viel mehr für die Komplexität in k interessieren, wenn ich die 1000 Besten anstelle der 10 Besten haben möchte. Und während konstante Faktoren bei der Veröffentlichung von Papieren nicht so wichtig sind, sind sie es sicherlich auch, wenn Produktionscode ausgeliefert wird.
AaronD
@ AaronD: Nur zu Ihrer Information, ich denke, der Algorithmus ist in jedem Fall sehr effizient. Vielleicht gibt es spezielle Fälle, in denen heuristisch motivierte Suchanfragen erfolgreich sind, aber für den allgemeinen Fall denke ich, dass dies sehr gut funktioniert. Die genaue Leistung hängt wahrscheinlich mehr davon ab, wie genau Sie sie implementieren, wie effizient Ihre Datenstrukturen sind und wie genau sie auf Ihr Problem zugeschnitten sind.
dagnelies
@arnaud Hallo, ist es Ihnen möglich, die Implementierung Ihres Eppsteins mitzuteilen? Ich habe eine ähnliche Frage hier gepostet: math.stackexchange.com/questions/1661737/…
Tina J