Miniature du projet
Snake IA

Création d'un jeu de Snake et d'une IA par Reinforcement Learning pour y jouer le mieux possible.

GitHub icone Lien GitHub : https://github.com/Tek0ver/python-snake-ai

En cours Débuté le 21-04-2022

Présentation

Pour ce projet j’ai codé un jeu de Snake en Python à l’aide du module Pygame, pour ensuite entraîner une Intelligence Artificielle par Reinforcement learning à y jouer.

Projet

J’ai utilisé un algorithme NEAT, du module NEAT-Python.

Tout d’abord des réseaux de neurones sont générés avec des paramètres aléatoires, un réseau associé à chaque serpent. Ce nombre de réseaux est appelé population, ici 150. Ensuite ils sont évalués tour à tour, c’est l’entraînement, pour cela ils jouent au jeu jusqu’à perdre, et un score est attribué à chaque serpent, il s’agit du fitness du réseau de neurones, dans ma première version le barème est le suivant :

L’algorithme sélectionne les réseaux avec les meilleurs fitness puis les multiplie avec quelques variations de paramètres aléatoires (mutation) afin de reformer la population. Puis les refait jouer, attribue un score, sélectionne les meilleurs et les multiplie avec des mutations. Chaque nouvelle génération de réseaux est appelée une génération.

Il faut plusieurs générations pour arriver à des résultats, au début peu de serpents éviterons les murs, et encore moins iront vers les objectifs, mais ceux qui le feront auront un meilleur score car ils parcourons plus de cases, les réseaux associés seront donc sélectionnés pour la génération suivante. Au bout de plusieurs générations (environs 150 dans mon cas) pratiquement tous les serpents évitent les murs, des générations après, ils se dirigent vers les objectifs.

v0.1 après 94 générations
v0.1 après 94 générations
v0.1 après 406 générations
v0.1 après 406 générations

À la 406ième génération on peut voir que le serpent se dirige bien vers les objectifs mais n’évite pas son propre corps et finit par perdre.

Pour avoir les meilleurs résultats possibles il est important de bien choisir les points qu’on attribue ou retire au fitness, sans quoi le réseau évoluera dans la mauvaise direction, ces points et malus sont pour le réseau le seul moyen de “comprendre” ce qu’on attend de lui.

Pour la première version je donne aux réseaux 8 entrées (voir image suivante):

v0.1 inputs_outputs
v0.1 inputs_outputs

Ici les valeurs envoyées au réseau sont :

  • 1 : 0
  • 2 : 0
  • 3 : 1
  • 4 : 0
  • 5 : 1
  • 6 : 0
  • 7 : 1
  • 8 : 0

Versions du projet

Version actuelle : v0.1

Liens