2016-07-02 22 views
15

Das ist etwas, was ich selbst erfunden habe, aber es scheint ein lustiges Problem zu sein, und es hat mich ratlos gemacht.Schnellster Pfad mit Beschleunigung bei Punkten

Sie haben eine Reihe von Punkten im zweidimensionalen Raum, wobei ein Punkt als "Start" und ein "Ende" bezeichnet wird. Jeder Punkt hat Koordinaten (in Metern vom Ursprung), aber auch eine "Beschleunigungszahl" (in Metern/Sekunde von Delta-V). Beim Erreichen eines Punktes (einschließlich des Starts) können Sie bis zu dieser Beschleunigungszahl in beliebiger Richtung beschleunigen. Die Kosten für die Kanten hängen von Ihrer aktuellen Geschwindigkeit ab, aber Sie müssen sich auch in die richtige Richtung bewegen.

Gibt es einen effizienten Algorithmus, um den schnellsten Weg bis zum Endpunkt zu finden? Ich habe nichts Besseres gefunden als "Versuche jeden Pfad und überprüfe die Ergebnisse". Djikstras und andere einfache Algorithmen funktionieren nicht, weil man nicht leicht sagen kann, dass ein Pfad zu einem Zwischenpunkt besser oder schlechter als der andere ist, wenn sie mit unterschiedlichen Anfangsgeschwindigkeiten ankommen.

Wenn das zu einfach ist, was ist, wenn Sie die Anforderung hinzufügen, dass Sie am Endpunkt anhalten müssen? (d. h., Sie müssen weniger als seinen Beschleunigungswert haben, wenn Sie das Ende erreichen.)

EDIT: Um klar zu sein, Richtung zählt. Sie behalten einen Geschwindigkeitsvektor bei, während Sie den Graphen durchlaufen, und Beschleunigung bedeutet, dass Sie ihm einen Vektor hinzufügen, dessen Größe auf die Beschleunigungszahl dieses Punktes beschränkt ist. Dies bedeutet, dass es Situationen gibt, in denen der Aufbau einer großen Geschwindigkeit nachteilig ist, da Sie zu schnell gehen werden, um zu anderen wertvollen Punkten/Ihrem Ziel zu "steuern".

+0

Sie müssen weitere Details angeben. Wie würde Ihr Konzept der "Beschleunigung" funktionieren? Reduziert es alle Kantenkosten entlang eines Pfades um die "Beschleunigungszahl"? Was passiert, wenn Sie die "Beschleunigungszahl" weit über die Kosten hinaus akkumulieren? Die Einführung eines Konzepts wie "Beschleunigung" legt nahe, dass es gut wäre, eine entsprechende Idee von Reibung/Widerstand einzuführen, sonst könnte es zu einer "ungeprüften Geschwindigkeit" kommen. Bisher glaube ich nicht, dass Ihre Frage klar genug ist, um eine richtige Lösung zu formulieren, aber ich denke, das ist sehr interessant. – lightalchemist

+2

Ich bezweifle, dass es eine analytische Lösung für dieses Problem gibt. Ich würde damit beginnen, zuerst ein viel einfacheres Problem zu lösen: die schnellste Route, die die Punkte in einer bestimmten Reihenfolge aufnimmt. (Dieser Suchraum hat eine Anzahl von Dimensionen, die der Anzahl der Zwischenpunkte entspricht, und ich kann keinen besseren Ansatz als das Annealing sehen.) Sobald Sie diese Methode haben, können Sie ein modifiziertes Dijkstra erstellen. – Beta

+0

@lightalchemist Mit "Beschleunigung" meine ich "Geschwindigkeitsänderung". (Also, Randkosten = euklidische Distanz/Geschwindigkeit, aber nur erlaubt, wenn du in die richtige Richtung reist ... also) Unkontrollierte Geschwindigkeit ist in Ordnung (es soll ein Mathe-Puzzle sein, keine Simulation ... obwohl ich es getan habe Stellen Sie sich zunächst vor, dass ein Raumschiff Treibstoffcaches aufnimmt, so dass Reibung immer noch keine Sache wäre.) –

Antwort

3

Ich denke, dass die Anforderung, dass Sie nur die Beschleunigung von jedem Punkt verwenden, macht dieses Problem NP im allgemeinen Fall vollständig. Betrachten wir einen Eingang, der wie folgt aussieht:

enter image description here

Wenn die „große Distanz“ zwischen dem Endpunkt und dem Rest der Punkte groß genug ist, um die Kosten der endgültigen Lösung zu beherrschen, um eine optimale Lösung zu finden, wird koche, um einen Weg zu finden, um so viele Geschwindigkeitssteigerungen wie möglich vom Anfang des Graphen zu erhalten. Wenn Sie nur zulassen, dass jeder Punkt einmal übergeben wird, entspricht dies dem Hamilton-Pfadproblem, das NP-vollständig ist.

Das heißt, Ihr Problem hat noch einige zusätzliche Regeln (die Entfernungen sind euklidisch, die Grafik ist immer vollständig), die am Ende das Problem leichter machen könnte.

+1

Ich glaube nicht, es ist ziemlich das Hamilton-Pfad-Problem (es könnte schwieriger sein , nicht einfacher), denn es gibt keine Garantie dafür, dass jeder Besuch am besten wäre. Beschleunigung ist in Geschwindigkeit, nicht nur Geschwindigkeit aufnehmen ... also, wenn Sie die Richtung viel ändern müssen, um jeden Punkt zu treffen, könnten Sie daraus langsamer kommen, als wenn Sie 4 oder 5 treffen, die alle in etwa kolinear mit Ihrem sind Ziel. –

+0

Umm ... Ich denke, Sie müssen möglicherweise Modus deutlich angeben, wie die Physik in Ihrem Modell dann funktioniert. Als ich es las, verstand ich, dass die Beschleunigung ein einfacher "Geschwindigkeitsschub" war, der zukünftige Kanten billiger machte. – hugomg

+0

Okay, bearbeitet das Problem, um es klarer zu machen. Ich hatte gedacht, dass die Richtung wichtig ist (wenn also Ihre Geschwindigkeit hoch genug wäre, wäre es effektiv keine vollständige Grafik). Ich denke, ich stimme zu, dass es in dem Problem, wie Sie es beschrieben haben, in bestimmten Situationen zu einem Hamilton-Pfad kommen kann. –

3

Sie können versuchen, dieses Problem rückwärts zu lösen, indem Sie Pfade vom Ende zum anderen Knoten rekursiv verfolgen und dann die maximale Geschwindigkeit entlang der Linie angeben, um von diesem Knoten zu einem anderen Knoten zu gelangen. Die Culling-Regel wird sein, wenn ein Pfad vom aktuellen zum nächsten Knoten mit weniger Geschwindigkeit und weniger Zeit vom Ende existiert, was bedeutet, dass der andere Pfad standardmäßig optimaler ist, da er mehr Knoten erreichen kann und weniger Zeit benötigt. Sobald ein Pfad den Startknoten erreicht, sollte er basierend auf der maximal erreichbaren Geschwindigkeit neu berechnet und gespeichert werden. Dann sammeln Sie den Pfad mit weniger Zeitaufwand.

Sie müssen hier nach einem verfügbaren Pfad suchen, da die verfügbaren Pfade in Ihrem Diagramm vom vorherigen Zustand mit einer indirekten Mechanik abhängig sind. Wenn Sie weniger Geschwindigkeit verwenden, können Sie mehr Auswahl treffen.

+0

Ich bin mir nicht sicher, ob ich all deine Antwort verstanden habe ... Verstand, der ein paar Dinge klarstellt, die aussehen, als könnten sie falsch für mich sein? "Bestimmt die maximale Geschwindigkeit entlang der Linie, um sich von diesem Knoten zu jedem anderen drehen zu können" klingt, als würde es zu viele Informationen verlieren, weil Sie vielleicht einige Knoten und nicht andere erreichen oder einige Knoten erreichen können, aber nur in Geschwindigkeitsbereichen verhindern, dass Sie noch andere erreichen usw. In "Die Culling-Regel wird sein, wenn ein Pfad vom aktuellen zum nächsten Knoten mit weniger Geschwindigkeit und weniger Zeit vom Ende her existiert", was meinen Sie mit "weniger Geschwindigkeit?" Manchmal ist die Geschwindigkeit gut. –

+0

Über "maximale Geschwindigkeit" - es kann pro Knoten sein, ein Knoten, der näher am Vektor ist, erlaubt höhere Geschwindigkeiten. "Weniger Geschwindigkeit" bedeutet, dass, wenn Sie Pfad AB abfragen, bestimmen Sie, welche Geschwindigkeit erreicht werden kann, wenn Sie bei A um B zu erreichen, finden Sie heraus, dass es einen Pfad bei B gibt, der von A kam, aber weniger Zeit B erreichte und langsamer war AB, das bedeutet, dass dein aktueller Weg zurückliegt und verworfen werden kann. – Vesper

+0

Aber es gibt eine Einschränkung, über die ich nachgedacht habe: Was ist, wenn Sie bei A anfangen und A besuchen können, um zu beschleunigen? Dieser Algorithmus wird dann fehlschlagen, wenn es einen Knoten hinter A gibt. Stellen Sie sich vor config: B --- A --- C, Quelle ist A, Ziel ist C, und Sie können für 5 bei A und für 10 bei B mit beschleunigen AC ist ziemlich lang. Der richtige Weg könnte ABAC enden, sagen Sie, wenn Sie an 4 von A nach B reisen, zurückkommen bei 6 von B nach A und dann 11 von A nach C, was schneller ist als direkt von A nach C bei 5 zu gehen, und schneller als ABC. – Vesper