Aquí está el código fuente para un proyecto HTML5 que implementa un algoritmo de aprendizaje automático en el videojuego Flappy Bird utilizando redes neuronales y un algoritmo genético. El programa enseña a un pequeño pájaro cómo colocar de manera óptima para volar de manera segura a través de barreras el mayor tiempo posible.
El tutorial completo con muchos más detalles y demostración que puede encontrar aquí:
http://www.askforgametask.com/tutorial/machine-letarning-algorithm-flappy-bird
Aquí también puede ver un video corto con una presentación simple del algoritmo:
https://www.youtube.com/watch?v=aewmdojEjf0
Todo el código está escrito en HTML5 utilizando el marco Phaser y la biblioteca de redes neuronales sinápticas para la implementación de la red neuronal.
Para jugar el juego, cada unidad (Bird) tiene su propia red neuronal consistió en las siguientes 3 capas:
Una capa de entrada con 2 neuronas que presentan lo que ve un pájaro:
1) horizontal distance between the bird and the closest gap
2) height difference between the bird and the closest gap
una capa oculta con 6 neuronas
Una capa de salida con 1 neurona utilizada para proporcionar una acción de la siguiente manera:
if output > 0.5 then flap else do nothing
Se utiliza una biblioteca de redes neuronales sinápticas para implementar completa red neuronal artificial en lugar de hacer una nueva desde cero.
El concepto principal de aprendizaje automático implementado en este programa se basa en la forma neuro-evolución. Utiliza algoritmos evolutivos, como un algoritmo genético para entrenar redes neuronales artificiales. Estos son los pasos principales:
crear una nueva población de 10 unidades (aves) con una red neuronal aleatoria
Deje que todas las unidades jueguen el juego simultáneamente usando sus propias redes neuronales
Para cada unidad, calcule su función de aptitud para medir su calidad como:
fitness = total travelled distance - distance to the closest gap
Cuando se matan todas las unidades, evalúe la población actual a la siguiente utilizando operadores de algoritmos genéticos (selección, cruce y mutación) de la siguiente manera:
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.
Vuelve al paso 2
Dado que el programa está escrito en HTML5 utilizando el marco Phaser y la biblioteca de redes neuronales sinápticas, necesita estos archivos:
Toda la lógica del juego se implementa en el archivo Gameplay.js . Consiste en las siguientes clases:
App.Main
, la rutina principal con las siguientes funciones esenciales:
TreeGroup Class
, Clase de Grupo Phaser Extended para representar una barrera móvil. Este grupo contiene un sprite de árbol superior e inferior.
Tree Class
, clase de sprite Phaser extendida para representar un sprite de árbol.
Bird Class
, clase de sprite Phaser extendida para representar un pájaro sprite.
Text Class
, clase Phaser BitMapText extendida utilizada para dibujar texto.
El algoritmo genético se implementa en el archivo Genetic.js que consiste en la siguiente clase:
GeneticAlgorithm Class
, la clase principal para manejar todas las operaciones de algoritmo genético. Necesita dos parámetros: max_units para establecer un número total de unidades en población y top_units para establecer una serie de unidades principales (ganadores) utilizadas para la población en evolución. Aquí están sus funciones esenciales: