Einführung
Die Herausforderung ist eine sehr interessante Variante der Rennstrecke und dieser beiden Herausforderungen:
Quelle dieser Herausforderung ist hier: c't-Racetrack
Diese Herausforderung ist besonders interessant (und unterscheidet sich von den beiden oben genannten Herausforderungen), da sie einen riesigen Suchraum mit einigen genauen Bedingungen kombiniert, die erfüllt werden müssen. Aufgrund des riesigen Suchraums sind erschöpfende Suchtechniken schwer zu verwenden, da aufgrund der genauen Bedingungen auch ungefähre Methoden nicht einfach zu verwenden sind. Aufgrund dieser einzigartigen Kombination (plus der zugrunde liegenden Intuition aus der Physik) ist das Problem faszinierend (und alles im Zusammenhang mit Rennwagen ist sowieso faszinierend ;-)
Herausforderung
Schauen Sie sich folgende Rennstrecke an ( Quelle ):
Sie müssen (120,180)
genau bei beginnen und enden, (320,220)
ohne eine der Wände zu berühren.
Das Auto wird durch Beschleunigungsvektoren der Form gesteuert (a_x,a_y)
- als Beispiel:
(8,-6)
(10,0)
(1,9)
Die erste Zahl ist die Beschleunigung für den x-Vektor, die zweite für den y-Vektor. Sie müssen Ganzzahlen sein, da Sie nur die Ganzzahlpunkte im Raster verwenden dürfen. Zusätzlich muss folgende Bedingung erfüllt sein:
a_x^2 + a_y^2 <= 100,
Dies bedeutet, dass die Beschleunigung in jede Richtung unter oder gleich sein muss 10
.
Um zu sehen, wie es funktioniert, schauen Sie sich das folgende Bild ( Quelle ) an:
Als Beispiel: Ausgehend von (120,180)
Ihnen beschleunigen Sie 8
in x-Richtung und -6
in y-Richtung. Für den nächsten Schritt ist dies Ihre Geschwindigkeit, bei der Sie Ihre Beschleunigung hinzufügen (10,0)
, um Ihre nächste resultierende Bewegung (zum Zeigen) (physisch korrekt) zu erhalten (146,168)
. Die resultierende Bewegung ist entscheidend, wenn Sie prüfen möchten, ob Sie eine der Wände berührt haben. Im nächsten Schritt Sie addieren erneut Ihren nächsten Beschleunigungsvektor zu Ihrer aktuellen Geschwindigkeit, um die nächste Bewegung usw. zu erhalten. Bei jedem Schritt hat Ihr Auto eine Position und eine Geschwindigkeit. (In der Abbildung oben sind die blauen Pfeile für die Geschwindigkeit die orangefarbenen Pfeile für die Beschleunigung und die dunkelroten Pfeile für die resultierende Bewegung.)
Als zusätzliche Bedingung müssen Sie die (0,0)
Endgeschwindigkeit haben, wenn Sie sich am Endpunkt befinden (320,220)
.
Die Ausgabe muss eine Liste von Beschleunigungsvektoren in der oben genannten Form sein.
Der Gewinner ist derjenige, der ein Programm bereitstellt, das eine Lösung mit den wenigsten Beschleunigungsvektoren findet.
Tiebreaker
Zusätzlich wäre es großartig, wenn Sie zeigen könnten, dass dies eine optimale Lösung ist und ob dies die einzig optimale Lösung ist oder ob es mehrere optimale Lösungen gibt (und welche es sind).
Es wäre auch gut, wenn Sie einen allgemeinen Überblick über die Funktionsweise Ihres Algorithmus geben und den Code kommentieren könnten, damit wir ihn verstehen können.
Ich habe ein Programm, das prüft, ob eine bestimmte Lösung gültig ist, und ich werde Feedback geben.
Nachtrag
Sie können jede Programmiersprache verwenden, aber ich würde mich besonders freuen, wenn jemand R verwendet, weil ich es in meiner täglichen Arbeit häufig benutze und mich irgendwie daran gewöhnt habe :-)
Nachtrag II
Zum ersten Mal habe ich ein Kopfgeld gestartet - hoffentlich bringt das den Ball ins Rollen (oder besser: bringt das Auto zum Fahren :-)
print "(10,42)\n(62,64)..."
?