Battlecode

Participation en équipe de Battlecode, une compétition mondiale organisée par le MIT.

Projet d'équipe!

La compétition demande au participant développer un algorithme contrôlant une colonie de robots autonomes. La performance de cet algorithme est évaluée lors de matchs contre les autres équipes. La difficulté récurrente de cette compétition vient de la coordination entre tous les robots afin d'accomplir un objectif commun malgré:

  1. une communication entre les robots très limitée

  2. une capacité de computation individuelle presque nulle

  3. un environnement dynamique et compétitif

Dans l'image, on voit le roi de l'équipe orange (1), des
            mines de fromage (2), un chat (3) et plusieurs rats
            des deux équipes (4) Dans l'image, on voit le roi de l'équipe orange (1), des mines de fromage (2), un chat (3) et plusieurs rats des deux équipes (4)

En 2026, la thématique tournait autour des rats. Chaque équipe commençait avec un Rat King, capable de créer des petits rats en utilisant du fromage. Pour gagner, l'équipe devait éliminer le roi adverse ou récupérer plus de point quand la limite de tour est atteint. Finalement, sur chaque carte, il y avait des chats qui étaient hostiles aux deux équipes et qui pouvaient changer le cours d'une partie autrement décidé!

Contribution des membres

Xavier Sercia
Encodage et décodage des messages de 32 bits. Pathfinding. Logique du roi. Logique générale des rats. Logique de stratégie générale.

Charles-Olivier Lacoste
Encodage et décodage des messages du tableau global. Logique du mineur et de l'ingénieur. Pathfinding. Logique du roi.

Marc-Alexandre Lacoste
Encodage et décodage des messages de 32 bits et tableau global. Logique du scout et du soldat. Logique générale des rats.

Stratégies utilisés

Spécialisation des tâches

Dès le début de la compétition, on a réalisé qu'une difficulté majeure allait être de coordonner efficacement les rats. Plus précisément, on devait trouver une façon de balancer le nombre de rats qui se concentrait sur ces différents éléments : récupérer du fromage, attaquer l'équipe adverse, défendre notre roi et les autres rats, attaquer le chat, explorer la carte, poser des pièges, etc...

Pour pallier à ce problème, l'équipe s'est concentrée à créer des spécialisations pour les rats. En fonction des besoins immédiats de la partie, le roi crée un rat et lui assigne le rôle qui est le plus urgent. Par exemple, si le stock de fromage diminue trop, le roi pourrait créer des mineurs pour aller chercher du fromage.

En tout, on a créé 4 rôles distincts:

Exploration

Comme la carte était différente à chaque manche, une partie importante d'une manche était donc de déterminer où sont les ressources, les chats et le roi ennemis. Notre stratégie était de créer, dès le début de la partie, plusieurs rats (scout) qui avaient comme objectif de trouver les points d'intérêts sur la carte. Une fois un point trouvé, le scout rapportait l'information au roi.

En centralisant l'information sur le roi, on pouvait former une stratégie globale. Par exemple, si un scout trouvait la position du roi adverse, alors le roi créait une troupe de soldats qui allait attaquer le roi ennemi.

Système intelligent de création des rats

Un point de friction important était la logique de création de nouveaux rats. Chaque rôle était créé selon des évènements différents et certains de ces évènements étaient plus prioritaires que d'autres. Par exemple, on créait périodiquement (à chaque ~100 tours) un scout pour trouver des points qu'on aurait manqués précédemment. Sauf que si au même moment on réalise qu'on a presque plus de fromage, c'est probablement des ressources qu'on préférait utiliser pour créer un mineur qui pourra renflouer nos stocks. Finalement, si au même moment, on réalise que l'ennemi organise une attaque sur notre roi, alors la priorité devrait aller à la création de soldats pour défendre notre roi.

Pour résoudre proprement ce problème, l'équipe a opté pour une solution s'inspirant d'un ordonnanceur de tâches FCFS (First Come, First Serve) à priorité multiple. La logique du roi contient trois files de priorités:

  1. La file la moins prioritaire contient les tâches qui peuvent être faites quand le fromage est abondant et que notre roi n'est pas en danger. Créer un scout ou organiser une attaque avec des soldats était placé dans cette file.
  2. En deuxième priorité, on a les tâches qui répondent à un problème rencontré, mais n'annoncent pas immédiatement une défaite si le problème n'est pas adressé. Les tâches de création mineures, quand le stock de fromage atteint un certain niveau, rentrent dans cette catégorie.
  3. La dernière file représente les tâches les plus urgentes, ces tâches sont marqué par des situations qui demandent une action immédiate, sans quoi on risque une défaite certaine.

Ainsi, à chaque tour, le roi pige dans la file avec la plus haute prioritée pour savoir quel type de rat créer.

Une carte où les deux rois commencent à proximité l'un de l'autre.
            On voit le roi rouge communiquer de l'information au rat
            alentour. Une carte où les deux rois commencent à proximité l'un de l'autre. On voit le roi rouge communiquer de l'information au rat alentour.

Transmission de l'information

Comme chaque robot est sur une instance isolée, le partage de l'information ne peut pas se faire par le biais de variables. Chaque rat est isolé l'un de l'autre, la seule façon pour un petit rat de communiquer de l'information est par le biais d'une action qui envoie un message de 32 bits. L'un des premiers systèmes qu'on a codés est un système qui encode et décode un message selon une spécification. Avec ce système, on a été en mesure d'ajouter rapidement de la communication pour la position des mines de fromages, la position du roi ennemi, la position des chats, etc...