Wie schlagen Kartenanbieter (wie Google oder Yahoo! Maps) Wegbeschreibungen vor?
Ich meine, sie verfügen wahrscheinlich über reale Daten in irgendeiner Form, sicherlich einschließlich Entfernungen, aber vielleicht auch Dinge wie Fahrgeschwindigkeiten, Vorhandensein von Gehwegen, Zugfahrpläne usw. Aber nehmen wir an, die Daten hätten ein einfacheres Format, z. B. einen sehr großen gerichteten Graphen mit Kantengewichten, die die Entfernungen widerspiegeln. Ich möchte in der Lage sein, schnell die Richtung von einem beliebigen Punkt zu einem anderen zu berechnen. Manchmal liegen diese Punkte nahe beieinander (innerhalb einer Stadt), manchmal weit auseinander (quer durchs Land).
Graph-Algorithmen wie der Dijkstra-Algorithmus funktionieren nicht, weil der Graph riesig ist. Glücklicherweise werden heuristische Algorithmen wie A* wahrscheinlich funktionieren. Unsere Daten sind jedoch sehr strukturiert, und vielleicht könnte eine Art von abgestuftem Ansatz funktionieren? (Speichern Sie z. B. vorberechnete Richtungen zwischen bestimmten, weit voneinander entfernten "Schlüsselpunkten" sowie einige lokale Richtungen. Dann werden die Richtungen für zwei weit entfernte Punkte lokale Richtungen zu einem Schlüsselpunkt, globale Richtungen zu einem anderen Schlüsselpunkt und dann wieder lokale Richtungen beinhalten).
Welche Algorithmen werden in der Praxis tatsächlich verwendet?
PS. Diese Frage wurde durch die Entdeckung von Macken in Online-Kartenanleitungen motiviert. Entgegen der Dreiecksungleichung denkt Google Maps manchmal, dass X-Z dauert länger und ist weiter als die Verwendung eines Zwischenpunkts wie in X-Y-Z . Aber vielleicht optimieren sie ihre Laufwege auch für einen anderen Parameter?
PPS. Hier ist ein weiterer Verstoß gegen die Dreiecksungleichheit, der (für mich) darauf schließen lässt, dass sie eine Art abgestuften Ansatz verwenden: X-Z 対 X-Y-Z . Ersterer scheint den prominenten Boulevard de Sebastopol zu nutzen, auch wenn er etwas abgelegen ist.
bearbeiten : Keines dieser Beispiele scheint mehr zu funktionieren, aber zum Zeitpunkt des ursprünglichen Beitrags funktionierten beide.
3 Stimmen
Übrigens ist der A*-Algorithmus "eine Verallgemeinerung des Dijkstra-Algorithmus, die die Größe des zu untersuchenden Teilgraphen verringert, wenn zusätzliche Informationen verfügbar sind, die eine Untergrenze für die "Entfernung" zum Ziel darstellen".
0 Stimmen
Zu A*: Ja, in der Tat. Glücklicherweise ist diese "zusätzliche Information" in unserem Fall z.B. durch die Verwendung der geradlinigen Entfernung verfügbar. Wenn ich oben "Dijkstra" sage, meine ich Vanilla Dijkstra.
0 Stimmen
Eine Wegbeschreibung? Ich weiß nicht, wie es anderswo ist, aber hier (Hampshire, UK) hat Big G keine Fußgängerdaten - es leitet mich entlang der Straßen um Fußgängerzonen herum usw. Das Einzige, wofür es gut ist, ist die Änderung der geschätzten Zeit für die Route :)
0 Stimmen
Es ist mir egal, ob die Wegbeschreibung für das Auto oder für den Fußgänger gedacht ist. Ich will nur wissen, wie sie funktionieren! Der Grund, warum ich Links zu Fuß habe, ist, dass ich einen Weg gesucht habe, um durch Paris zu laufen und alle 66 Wallace-Brunnen zu sehen. (Die Endpunkte dieser Karten sollten Wallace-Brunnen sein.)
0 Stimmen
Das Kopfgeld auf diese Frage soll zu mehr und besseren Antworten anregen, insbesondere von Personen, die bei einem der großen Anbieter arbeiten. Kommentare zu Datenstrukturen, Algorithmen, wie viel vorberechnet wird usw. sind erwünscht.
0 Stimmen
Sie wissen, dass eine Verallgemeinerung des Problems nicht notwendigerweise bedeutet, dass die Lösung in der gleichen Problemklasse liegt. Eine Wegbeschreibung von A nach B ist ein NP-Problem, die Berechnung eines Weges zwischen allen 66 Brunnen ist ein NPC-Problem (TSP). Dies läuft darauf hinaus, dass Verzweigungen beschnitten werden, um große Problemmengen zu lösen
0 Stimmen
@John: Das weiß ich. Ich habe in der Tat versucht, ein Beispiel für das Problem des reisenden Händlers zu lösen. Als Unterprogramm habe ich Google nach einer Wegbeschreibung gefragt und zum Spaß die Dreiecksungleichung überprüft.
0 Stimmen
Antwortete auf ähnliche Fragen hier stackoverflow.com/a/39256428/2173016 mit Illustration des Algorithmus und mit schrittweiser Anleitung