Une simple intelligence artificielle pour apprendre au dinosaure hors ligne de Google Chrome à sauter des cactus, en utilisant des réseaux de neurones et un algorithme génétique simple.
Regardez cette vidéo pour le voir en action et découvrez comment il fonctionne : Intelligence artificielle avec le dinosaure de Google
Installez Node.js
sur votre ordinateur.
Clonez/téléchargez ce dossier sur votre ordinateur.
exécutez npm install
dans ce dossier
Ouvrez le jeu de dinosaures de Chrome et mettez le terminal de côté (il DOIT être sur le même écran) (Conseil : allez dans les outils de développement, et sous réseau, réglez sur hors ligne)
exécutez node index
dans ce dossier. Si le jeu a été localisé, il déplacera le curseur de la souris jusqu'à l'origine du floor
du dino. Appuyez sur la touche s
du terminal pour commencer l'apprentissage.
Nous avons 3 entrées différentes lues à partir des pixels de l'écran :
Nous avons également une sortie avec 3 états possibles :
Chaque génération se compose de 12 réseaux de neurones (génomes).
Chaque génome est testé avec le jeu, en mappant constamment les entrées lues du jeu aux entrées du réseau neuronal, et en obtenant la sortie/activation du réseau et en l'appliquant aux touches du clavier.
Tout en testant chaque génome, nous suivons sa « condition physique » en comptant les cactus sautés dans le jeu.
Lorsqu’une génération entière est terminée, nous supprimons les pires génomes jusqu’à atteindre N
génomes. Avec ces N
génomes, nous en sélectionnons ensuite deux au hasard et croisons leurs valeurs/configurations. Après cela, nous appliquons des mutations aléatoires dans les valeurs/configurations du réseau neuronal, créant ainsi un nouveau génome.
Nous effectuons le croisement/mutation jusqu'à ce que nous obtenions à nouveau 12 génomes, et nous le répétons constamment.
Toute l'implémentation a été réalisée à l'aide de Node.js, avec Synaptic (bibliothèque Neural Network) et RobotJs (une bibliothèque pour lire les pixels et simuler les pressions sur les touches).
Il y a quelques fichiers dans le projet :
index.js
: Cela resserre tout ensemble.
Scanner.js
: couche d'abstraction de base au-dessus de la bibliothèque RobotJs qui lit l'écran comme un lancer de rayons. Dispose également de quelques fonctions utilitaires.
UI.js
: Portée globale pour la gestion de l'UI. Il initialise et met également à jour l'écran en cas de modifications.
GameManipulator.js
: possède tout le code nécessaire pour lire les capteurs et appliquer les sorties au jeu. Est également responsable du calcul des points, de l'obtention de l'état du jeu et du déclenchement des rappels/auditeurs vers une implémentation réelle.
Learner.js
: C'est l'implémentation principale de l'algorithme génétique. C'est là que la "magie" opère, en faisant courir les générations, en faisant la sélection "naturelle", le croisement, la mutation...
genomes
avec une extension .json
enter
(puis, pour commencer, appuyez sur s
)o
pour enregistrer la générationCc
pour terminer le processus.Le jeu de dinosaure a un bug ennuyeux : il commence à « dériver » vers la droite avec le temps, ce qui fait que le dinosaure est mal décalé par rapport à l'origine du jeu. Cela fait que le programme lit le dinosaure comme un cactus, puisqu'il est de la même couleur.
Vous pouvez résoudre ce problème en actualisant continuellement la page ou en collant ce code dans la console dans l'inspecteur d'éléments :
// Make sure the dino does not drift to the right
setInterval(function (){Runner.instance_.tRex.xPos = 21}, 2000)
Veuillez suivre le guide de style Node.js de Felix. Ce n’est pas complexe et le schéma des choses est très simple.