En version réduite, ca ressemble à ca:
Code:class Pod { private const int MINDIST ... ; private const int MINANGLE ... ; private const int MAXANGLE ... ; private Position pos; private List<Position> checkpointsList = new List<Position>(); private Vector speedVect; private Vector destVect; private double vectAngle = -1; private string goalX = "0"; private string goalY = "0"; {...} private struct Position { public int X; public int Y; public Position(int x, int y) { X = x; Y = y; } } private struct Vector { public int X; public int Y; public Vector(int x, int y) { X = x; Y = y; } } public Pod (int check, int lap) {...} public void UpdatePos(int x, int y, int vx, int vy, int nextCp, int angle) {... vectAngle = CalculateAngle(destVect, speedVect); } public void ComputeDirection() {... else if ((vectAngle > MINANGLE | vectAngle < -MINANGLE) & vectAngle < MAXANGLE & vectAngle > -MAXANGLE) { Position compensation = CalculateCompensationPosition(); goalX = compensation.X.ToString(); goalY = compensation.Y.ToString(); } } private double CalculateAngle(Vector vect1, Vector vect2) //calculate the angle between the speed vector and the destination checkpoint { double sin = vect1.X * vect2.Y - vect2.X * vect1.Y; double cos = vect1.X * vect2.X + vect1.Y * vect2.Y; return Math.Atan2(sin, cos) * (180 / Math.PI); } private Position CalculateCompensationPosition() { double k = 1.0*(speedVect.X*destVect.X + speedVect.Y*destVect.Y)/(destVect.X*destVect.X + destVect.Y*destVect.Y); Vector dotProduct = new Vector((int)Math.Round(k*destVect.X), (int)Math.Round(k*destVect.Y)); int xDist = dotProduct.X - speedVect.X; int yDist = dotProduct.Y - speedVect.Y; Vector compensateVector = new Vector(speedVect.X + xDist*2, speedVect.Y + yDist*2); Console.Error.WriteLine("Vect[{0},{1}] is {2}° away from destination", compensateVector.X, compensateVector.Y, CalculateAngle(compensateVector, destVect)); return new Position(speedVect.X + xDist*2 + pos.X, speedVect.Y + yDist*2 + pos.Y); } }
J'ai rajoute la fonction qui va tout me faire gagner: le generateur de message de taunt aleatoire
https://www.codingame.com/replay/82050261
Dernière modification par Naity ; 01/03/2016 à 20h43.
Classe
C'est vrai que les messages c'est un bon moyen de s'amuser pour pas cher niveau code, surtout quand t'es une quiche comme moi
Chambrer le groupe de tête ça reste un plaisir de fin gourmet qu'on ne peut pas nous enlever
C'est tellement vrai
Ceci dit, j'ai bien fait attention à prendre un replay ou je met la misère à rOut (ca à mis du temps, le bougre à un algo bien ficelé).
- - - Mise à jour - - -
GG
On est pas (tous) balése. De mon côté j'ai réussi à galérer sur à peu près tous les faciles à l'époque
Le bougre a surtout un vilain bug qui fait qu'un choix du meilleur parmi un tirage de n vecteurs d'accélération aléatoires est plus efficace qu'un recuit simulé (qui est censé converger plus rapidement vers une accéleration optimale).
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
La strat gagnante semple clairement être celle qui consiste à utiliser l'un des pods en blocker pour ralentir l'adversaire. Après tout est dans l'efficacité du blocker... Chez moi il a tendance à faire du zèle et à bloquer mon autre pod
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
Bon, moi je pense que j'aurais pas le temps de bosser dessus cette semaine.
Have fun :D
Attention, un Max_well peut en cacher un autre
Equipe Highlander La Rache
Hop, je m'y suis mis tranquillement.
V'la mon lien pour l'OP : https://www.codingame.com/profile/30...c9394e34267031
J'ai du boulot
https://www.codingame.com/replay/84028683
Pour une fois que je gagne contre lui
Vous apprécierez les petites esquives !
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
Allez dernière ligne droite
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
C'est trop la misère, je change des trucs et ça n'a aucun effet sauf de me faire redescendre. Le classement bouge tellement avec les gens qui soumettent que c'est de la torture mentale de se voir 18e puis redescendre 30e quand ca se stabilise.
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
C'est quoi ton algorithme en gros ? Tu accélères tes pods vers un point calculé en fonction de (position courante, vitesse courante, position du prochain checkpoint) ?
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."
C'est ca. Acceleration rapide en compensant le vecteur vitesse, deceleration (vitesse 0) pour "glisser" en direction du point tout en commencent a s'aligner vers le point suivant. Les deux pods ont la meme strategie mais commecent avec 3 tours de decalage pour pas qu'ils ne se gene l'un-l'autre.
C'est basique, j'ai pas retouche au code du weekend dernier pour cause de semaine pas glop avec trop de taff.
Purée c'est toujours aussi serré le classement? La moindre modif de code, la moindre baisse du perf et tu degringoles 50 places plus bas.
Au fait c'est un truc répandu les algos du top 10, les neural network?
Ouais c'est toujours un peu serré, d'autant plus qu'il y a assez peu de match finalement, donc pas mal d'aléa dans le classement. Pour bien faire il faudrait laisser tourner pendant plusieurs jours pour stabiliser le tout.
A la fin du challenge ils rajoutent quand même 100 matchs supplémentaires sans modif possible.
Personne ne fait du neural network je crois. Jeff et pb en ont parlé et ont essayé mais je ne pense pas qu'ils aient utilisé ça pour finir.
En gros la stratégie la plus utilisée et la plus efficace pour ce genre de challenge ou il y a trop de coups possible à chaque tour pour tous les évaluer, et ou les deux joueurs jouent simultanément, c'est d'avoue une fonction qui donne une valeur de gain étant donné un coup joué, et de tenter de trouver le coup qui va maximiser le gain potentiel au tour courant. Pour ça, il faut définir cette fonction, et ensuite tu tires des coups potentiels aléatoirement et tu gardes celui qui donne le gain maximum. Mieux encore, tu tires aléatoirement une série de coups aléatoires et tu cherches la série qui maximise le gain potentiel.
En gros ici, par exemple, le gain pour un pod "coureur" serait la proximité du pod avec le checkpoint suivant, voire un bonus si l'on passe un checkpoint. On tire aléatoirement des trajectoires potentielles (soit un angle random au début et on suppose que l'on s'y colle pendant n tours, soit un point ciblé aléatoire, etc...) et on prédit l'avenir en calculant les états successifs sur les n tours, et en supposant également ce que les ennemis vont faire à partir de la situation initiale (par exemple continuer d'accélérer dans la dernière direction prise). On évalue la fonction de gain à chaque tour, on l'intègre sur l'ensemble des coups (par exemple avec une somme pondérée décroissant au fil des tours) et on garde le coup initial de la trajectoire qui donne le meilleur résultat.
Toute la subtilité consiste à définir une bonne fonction d'évaluation: quels critères retenir pour un runner, il faut qu'il passe les CP rapidement, mais pas qu'il reste bloqué si un pod ennemi s'interpose, ainsi qu'une bonne stratégie pour le choix des coups jouées : par exemple des trajectoires avec un angle et un thrust aléatoire à chaque tour simulé ne sont pas très réalistes et sans doute assez peu efficaces par rapport à des trajectoires ciblant un point initial et un thrust constant choisis aléatoirement pour chaque trajectoire.
"Dieu est mort" · "Si le téléchargement c’est du vol, Linux c’est de la prostitution."