Learn2Slither est une implémentation personnalisée du jeu Snake où un agent d’intelligence artificielle apprend à jouer grâce à l’apprentissage par renforcement (Reinforcement Learning). L’objectif : entraîner un serpent pour qu’il survive et atteigne la plus grande taille possible, tout en évitant les obstacles et en optimisant ses choix de déplacements.
Le projet combine :
- Un moteur de jeu en C pour la simulation rapide et l’affichage graphique.
- Un agent en Python qui apprend via Q-Learning.
- Plateau de N x N cellules
- Deux pommes vertes (augmentent la taille du serpent).
- Une pomme rouge (diminue la taille du serpent).
- Le serpent ne « voit » que dans les 4 directions cardinales depuis sa tête.
- Informations disponibles : murs (W), tête (H), corps (S), pommes vertes (G), pommes rouges (R), cases vides (0).
- UP, DOWN, LEFT, RIGHT.
- Les décisions sont prises uniquement à partir de la vision du serpent.
- Pomme verte : récompense positive.
- Voir une pomme verte : petite recompense positive
- Pomme rouge : récompense négative.
- Aucune pomme : petite pénalité ou rien.
- Game over : grosse pénalité.
Le Board est la partie C qui simule le jeu Snake et gère :
- Initialisation
- Création de la grille de jeu.
- Placement initial du serpent et des pommes (vertes et rouges).
- Mise à jour
- Déplace le serpent selon l’action reçue.
- Ajoute ou retire des segments en fonction des pommes mangées.
- Détecte les collisions (murs, corps du serpent, taille nulle).
- Communication avec l’agent
- Écrit sur la sortie standard (stdout) la vision du serpent, c’est-à-dire ce qu’il peut “voir” dans les 4 directions depuis sa tête.
- Cette vision est transmise à l’agent via un pipe.
L’agent est écrit en Python et utilise un algorithme de Q-Learning pour apprendre à prendre les meilleures décisions.
Voici le cycle de fonctionnement d’une session :
-
Lecture de la vision
L’interpréteur lit la sortie envoyée par le Board et récupère :- L’état du plateau autour du serpent.
- Une éventuelle récompense liée à la dernière action.
-
Création de l’état
La vision est transformée en un vecteur d’état qui encode :(danger_forward, danger_left, danger_right, green_forward, green_left, green_right, green_close, red_forward, red_left, red_right)
- Exemple :
(1, 1, 0, 0, 0, 1, 0, 0, 0, 0)
→ Il y a danger devant et à gauche, pas de danger à droite, et une pomme verte à droite.
- Choix de l’action
L’agent sélectionne une action (UP,DOWN,LEFT,RIGHT) :
- Soit aléatoirement (exploration) selon un facteur
epsilonqui diminue avec le temps. - Soit en choisissant l’action avec la plus haute valeur dans la Q-table (exploitation).
-
Envoi de l’action
L’action choisie est envoyée au Board via sockets. -
Observation du nouvel état
Le Board exécute l’action, met à jour le plateau et renvoie :
- La nouvelle vision → transformée en nouvel état.
- La récompense obtenue.
- Mise à jour de la Q-table
L’agent ajuste les valeurs associées à(état, action)selon la formule de Q-learning :Q(state, action) ← Q(state, action) + α * [ reward + γ * max_a' Q(next_state, a') - Q(state, action) ]où :
α= taux d’apprentissage (learning rate).γ= facteur de discount (discount factor).
- Fin de session
Si le serpent meurt (reward = DEAD), la session se termine.
Les statistiques (nombre de coups, taille maximale) sont enregistrées.
Le script snake est utilisé pour lancer les deux programmes Board et Agent avec les arguments appropriés. Il simplifie le processus de lancement en combinant les arguments des deux programmes en une seule commande.
| Argument | Description |
|---|---|
nb_cells |
Le nombre de cellules du plateau de jeu. Doit être un entier supérieur ou égal à 8. |
cell_size |
La taille des cellules du plateau de jeu. Doit être un entier compris entre 2 et 100. |
port |
Le numéro de port pour la connexion entre le plateau de jeu et l'agent. |
sessions |
Le nombre total de sessions que l'agent doit jouer ou entraîner. |
board_option |
Option pour le programme Board. Peut être visualoff pour désactiver la visualisation ou run lancer directement l'entrainement. par default ce lance en mode step-by-step |
-s, --save |
Le nom du fichier pour sauvegarder le modèle de l'agent. |
-l, --load |
Le nom du fichier pour charger le modèle de l'agent. |
-dontlearn |
Option pour désactiver l'apprentissage du modèle de l'agent. |
(clavier qwerty)
- S pour run
- espace pour arrêter et Step_by-step
- echap pour quitter
- flèches pour se déplacer si vous jouez vous-même
python3 snake.py 10 30 8080 100 run -l model_load -dontlearnOptionnel : installation du gestionnaire d'environnement virtuel python
apt install venvA lancer à la racine du projet
python3 setup.py; source .pvenv/bin/activatePossible de jouer soi-même au jeu
./board/Board 20 30