introduction
Le défi est une variante très intéressante du circuit de jeu et de ces deux défis:
La source de ce défi est ici (en allemand): c't-Racetrack
Ce défi est particulièrement intéressant (et différent des deux défis susmentionnés) car il combine un immense espace de recherche avec certaines conditions exactes qui doivent être remplies. En raison de l'immense espace de recherche, les techniques de recherche exhaustives sont difficiles à utiliser, en raison des conditions exactes, les méthodes approximatives ne sont pas non plus facilement utilisables. En raison de cette combinaison unique (plus l'intuition sous-jacente de la physique), le problème est fascinant (et tout ce qui concerne les voitures de course est fascinant de toute façon ;-)
Défi
Jetez un oeil à l'hippodrome suivant ( source ):
Vous devez commencer (120,180)
et terminer exactement à (320,220)
("Ziel" en allemand) sans toucher l'un des murs.
La voiture est contrôlée par des vecteurs d'accélération de la forme (a_x,a_y)
- à titre d'exemple:
(8,-6)
(10,0)
(1,9)
Le premier nombre est l'accélération pour le vecteur x, le second pour le vecteur y. Ils doivent être des entiers car vous n'êtes autorisé à utiliser que les points entiers sur la grille. De plus, la condition suivante doit être remplie:
a_x^2 + a_y^2 <= 100,
ce qui signifie que l'accélération dans n'importe quelle direction doit être inférieure ou égale à 10
.
Pour voir comment cela fonctionne, regardez l'image suivante ( source ):
Par exemple: à partir de (120,180)
vous, accélérez 8
dans la direction x et -6
dans la direction y. Pour l'étape suivante, c'est votre vitesse à laquelle vous ajoutez votre accélération (10,0)
pour obtenir (physiquement correct) votre prochain mouvement résultant (à pointer (146,168)
. Le mouvement résultant est ce qui compte quand il s'agit d'examiner si vous avez touché l'un des murs. À l'étape suivante vous ajoutez à nouveau votre prochain vecteur d'accélération à votre vitesse actuelle pour obtenir le prochain mouvement et ainsi de suite. Ainsi, à chaque étape, votre voiture a une position et une vitesse. (Dans l'illustration ci-dessus, les flèches bleues sont pour la vitesse, les flèches orange pour l'accélération et les flèches rouges foncées pour le mouvement résultant.)
Comme condition supplémentaire, vous devez avoir (0,0)
une vitesse terminale lorsque vous êtes sur le point d'arrivée (320,220)
.
La sortie doit être une liste de vecteurs d'accélération sous la forme susmentionnée.
Le gagnant est celui qui fournit un programme qui trouve une solution avec le moins de vecteurs d'accélération.
Tiebreaker
De plus, ce serait bien si vous pouvez montrer qu'il s'agit d'une solution optimale et s'il s'agit de la seule solution optimale ou s'il existe plusieurs solutions optimales (et quelles sont-elles).
Il serait également bon que vous puissiez donner un aperçu général du fonctionnement de votre algorithme et commenter le code afin que nous puissions le comprendre.
J'ai un programme qui vérifie si une solution donnée est valide et je donnerai des commentaires.
Addendum
Vous pouvez utiliser n'importe quel langage de programmation mais je serais particulièrement ravi que quelqu'un utilise R parce que je l'utilise beaucoup dans mon travail de jour et que je m'y suis habitué :-)
Addendum II
Pour la première fois, j'ai commencé une prime - j'espère que cela fait rouler la balle (ou mieux: que la voiture roule :-)
print "(10,42)\n(62,64)..."
?