Voici le code source d'un projet HTML5 qui implémente un algorithme d'apprentissage automatique dans le jeu vidéo Flappy Bird à l'aide de réseaux de neurones et un algorithme génétique. Le programme enseigne à un petit oiseau comment se battre de manière optimale afin de voler en toute sécurité à travers les barrières aussi longtemps que possible.
Le tutoriel complet avec beaucoup plus de détails et une démo que vous pouvez trouver ici:
http://www.askforgametask.com/tutorial/machine-learning-algorithm-flappy-bird
Ici, vous pouvez également regarder une courte vidéo avec une présentation simple de l'algorithme:
https://www.youtube.com/watch?v=aewmdojejf0
Tout le code est écrit en HTML5 à l'aide de Phaser Framework et de la bibliothèque de réseaux neuronaux synaptiques pour l'implémentation de réseau neuronal.
Pour jouer au jeu, chaque unité (oiseau) a son propre réseau neuronal composé des 3 couches suivantes:
Une couche d'entrée avec 2 neurones présentant ce qu'un oiseau voit:
1) horizontal distance between the bird and the closest gap
2) height difference between the bird and the closest gap
une couche cachée avec 6 neurones
Une couche de sortie avec 1 neurone utilisé pour fournir une action comme suit:
if output > 0.5 then flap else do nothing
Il y a une bibliothèque de réseaux neuronaux synaptiques utilisés pour implémenter un réseau neuronal artificiel entier au lieu d'en faire un nouveau à partir de zéro.
Le concept principal de l'apprentissage automatique mis en œuvre dans ce programme est basé sur la forme de neuro-évolution. Il utilise des algorithmes évolutifs tels qu'un algorithme génétique pour former des réseaux de neurones artificiels. Voici les étapes principales:
créer une nouvelle population de 10 unités (oiseaux) avec un réseau neuronal aléatoire
Laissez toutes les unités jouer au jeu simultanément en utilisant leurs propres réseaux de neurones
Pour chaque unité, calculez sa fonction de fitness pour mesurer sa qualité:
fitness = total travelled distance - distance to the closest gap
Lorsque toutes les unités sont tuées, évaluez la population actuelle à la suivante à l'aide d'opérateurs d'algorithmes génétiques (sélection, croisement et mutation) comme suit:
1. sort the units of the current population in decreasing order by their fitness ranking
2. select the top 4 units and mark them as the winners of the current population
3. the 4 winners are directly passed on to the next population
4. to fill the rest of the next population, create 6 offsprings as follows:
- 1 offspring is made by a crossover of two best winners
- 3 offsprings are made by a crossover of two random winners
- 2 offsprings are direct copy of two random winners
5. to add some variations, apply random mutations on each offspring.
Revenez à l'étape 2
Étant donné que le programme est écrit en HTML5 à l'aide de Phaser Framework et de la bibliothèque de réseau neuronal synaptique, vous avez besoin de ces fichiers:
Toute la logique du jeu est implémentée dans le fichier gameplay.js . Il se compose des classes suivantes:
App.Main
, la routine principale avec les fonctions essentielles suivantes:
TreeGroup Class
, classe de groupe de phaser étendu pour représenter une barrière en mouvement. Ce groupe contient un haut et un sprite d'arbre inférieur.
Tree Class
, classe de sprite phaser étendue pour représenter un sprite d'arbre.
Bird Class
, classe de sprite de phaser étendue pour représenter un sprite d'oiseaux.
Text Class
, classe BitmapText phaser étendue utilisée pour dessiner du texte.
L'algorithme génétique est mis en œuvre dans le fichier génétique.js qui se compose de la classe suivante:
GeneticAlgorithm Class
, la classe principale pour gérer toutes les opérations d'algorithme génétique. Il a besoin de deux paramètres: Max_Units pour définir un nombre total d'unités dans la population et les top_units pour définir un certain nombre de meilleures unités (gagnants) utilisées pour l'évolution de la population. Voici ses fonctions essentielles: