Aqui está o código -fonte para um projeto HTML5 que implementa um algoritmo de aprendizado de máquina no videogame de pássaros de Flappy usando redes neurais e um algoritmo genético. O programa ensina um passarinho a retirar de maneira ideal para voar com segurança através de barreiras o maior tempo possível.
O tutorial completo com muito mais detalhes e demo que você pode encontrar aqui:
http://www.askforgametak.com/tutorial/machine-learning-algorithm-flappy-bird
Aqui você também pode assistir a um pequeno vídeo com uma apresentação simples do algoritmo:
https://www.youtube.com/watch?v=AEWMDOJEJF0
Todo o código foi escrito no HTML5 usando a estrutura do Phaser e a biblioteca de rede neural sináptica para implementação de rede neural.
Para jogar o jogo, cada unidade (pássaro) possui sua própria rede neural consistia nas próximas três camadas:
Uma camada de entrada com 2 neurônios apresentando o que um pássaro vê:
1) horizontal distance between the bird and the closest gap
2) height difference between the bird and the closest gap
Uma camada oculta com 6 neurônios
Uma camada de saída com 1 neurônio usado para fornecer uma ação da seguinte forma:
if output > 0.5 then flap else do nothing
Há uma biblioteca de rede neural sináptica para implementar toda a rede neural artificial em vez de fazer uma nova a partir do zero.
O principal conceito de aprendizado de máquina implementado neste programa é baseado na forma de neuro-evolução. Ele usa algoritmos evolutivos, como um algoritmo genético para treinar redes neurais artificiais. Aqui estão as principais etapas:
Crie uma nova população de 10 unidades (pássaros) com uma rede neural aleatória
Deixe todas as unidades jogarem o jogo simultaneamente usando suas próprias redes neurais
Para cada unidade, calcule sua função de condicionamento físico para medir sua qualidade como:
fitness = total travelled distance - distance to the closest gap
Quando todas as unidades forem mortas, avalie a população atual para a próxima usando operadores de algoritmos genéticos (seleção, crossover e mutação) da seguinte forma:
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.
Volte para a etapa 2
Como o programa é escrito no HTML5 usando a estrutura do Phaser e a biblioteca de rede neural sináptica, você precisa desses arquivos:
A lógica inteira do jogo é implementada no arquivo GamePlay.js . Consiste nas seguintes aulas:
App.Main
, a principal rotina das seguintes funções essenciais:
TreeGroup Class
, aula de grupo de phaser estendido para representar uma barreira em movimento. Este grupo contém um sprite de topo e uma árvore inferior.
Tree Class
, aula de sprite de phaser estendida para representar um sprite de árvore.
Bird Class
, aula de sprite de phaser estendida para representar um sprite de pássaro.
Text Class
, classe BitmapText estendida de phaser usada para desenhar texto.
O algoritmo genético é implementado no arquivo genético.js , que consiste na seguinte classe:
GeneticAlgorithm Class
, a classe principal para lidar com todas as operações de algoritmo genético. Ele precisa de dois parâmetros: Max_units para definir um número total de unidades na população e TOP_UNITS para definir várias unidades principais (vencedores) usadas para a população em evolução. Aqui estão suas funções essenciais: