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.