Ich bin ein echter Geschwindigkeitsfreak, wenn es um Algorithmen geht, und in den Plugins, die ich für ein Spiel gemacht habe.Schnellere Alternativen zu Dijkstra-Algorithmus für GPS-System
Die Geschwindigkeit ist .. ein bisschen .. nicht befriedigend. Vor allem während man mit dem Auto herumfährt und man nicht seinem Weg folgt, muss der Weg neu berechnet werden. Und es braucht etwas Zeit. So stapelt das In-Game-GPS viele "falsche" Signale (und stapelt die Signale auf bedeutet mehr Berechnungen danach, für jeden falschen Weg) weil ich ein schnelles, Live-GPS-System haben möchte, das ständig aktualisiert.
änderte ich den alten Algorithmus (einige einfache dijkstra Implementierung) boost :: Dijkstra einen Weg vom Knoten A zum Knoten B um
(Gesamtknotenliste zu berechnen ist ~ 15k Knoten mit ~ 40k-Verbindungen, für neugierige Leute hier ist die Karte: http://gz.pxf24.pl/downloads/prv2.jpg (12 MB), Kanten in den roten Linien sind die Knoten),
, aber es hat nicht wirklich an Geschwindigkeit zu erhöhen. (Zumindest nicht merklich, vielleicht 50 ms).
Die Informationen, die in dem Knoten-Array gespeichert sind:
The ID of the Node,
The position of the node,
All the connections to the node (and which way it is connected to the other nodes, TO, FROM, or BOTH)
Distance to the connected nodes.
Ich bin neugierig, ob jemand ein paar schnelleren Alternativen in C/C++ kennt? Irgendwelche Vorschläge (+ Codebeispiele?) Werden geschätzt!
Wenn jemand an dem Projekt interessiert ist, hier ist es (Quelle + Binärdateien):
https://gpb.googlecode.com/files/RouteConnector_177.zip
In diesem Video können Sie sehen, was das GPS-System ist wie:
http://www.youtu.be/xsIhArstyU8
wie Sie sehen können, die rote Route wird langsam aktualisiert (gut, für uns - Gamer - es ist langsam).
(Bytheway: die Lücken zwischen den roten Linien haben vor langer Zeit fest: p)
Haben Sie A * probiert? Es ist der gebräuchlichste (sicherlich der einfachste) heuristikbasierte Pfadfindungsalgorithmus. Und in einer GPS-artigen Situation funktioniert die Heuristik "Luftlinie in der Luftlinie" meist recht gut. – biziclop
@biziclop hat Boost eine A * Implementierung? Ich kann nichts finden google = ein * boost oder ein * algorythm boost –
Die zweite Optimierungsmöglichkeit kommt von der Tatsache, dass in einer GPS-Neuberechnung Situation Ihr Ziel immer gleich ist und Ihre Quelle nicht weit von der vorherigen Iteration entfernt ist, also wenn Sie die kürzeste speichern Von der vorherigen Berechnung ausgehend müssen Sie nur suchen, bis Sie einen Knoten erreichen, der bereits in dieser Liste enthalten ist. – biziclop