Uma inteligência artificial simples para ensinar o dinossauro offline do Google Chrome a pular em cactos, usando Redes Neurais e um Algoritmo Genético simples.
Assista a este vídeo para vê-lo em ação e saber como funciona: Inteligência Artificial com o Dinossauro do Google
Instale Node.js
no seu computador.
Clone/baixe esta pasta para o seu computador.
execute npm install
dentro desta pasta
Abra o jogo de dinossauro do Chrome e deixe o terminal de lado (DEVE estar na mesma tela) (Dica: vá para ferramentas de desenvolvedor e, em rede, defina como offline)
execute node index
nesta pasta. Se o jogo foi localizado, moverá o cursor do mouse até a origem do floor
do dinossauro. Pressione a tecla s
no terminal para começar a aprender.
Temos 3 entradas diferentes lidas nos pixels da tela:
Temos também uma saída com 3 estados possíveis:
Cada geração consiste em 12 redes neurais (genomas).
Cada genoma é testado com o jogo, mapeando constantemente as entradas lidas do jogo para as entradas da rede neural, e obtendo a saída/ativação da rede e aplicando-a às teclas do teclado.
Ao testar cada genoma, monitoramos sua “adequação” contando os cactos saltados no jogo.
Quando uma geração inteira se completa, removemos os piores genomas até atingir N
genomas. Com esses N
genomas, selecionamos dois aleatoriamente e cruzamos seus valores/configurações. Depois disso, aplicamos mutações aleatórias nos valores/configurações da Rede Neural, criando um novo genoma.
Fazemos o cruzamento/mutação até obtermos 12 genomas novamente e repetimos constantemente.
Toda a implementação foi feita usando Node.js, com Synaptic (biblioteca de Rede Neural) e RobotJs (uma biblioteca para ler pixels e simular pressionamentos de teclas).
Existem alguns arquivos no projeto:
index.js
: reúne todas as coisas.
Scanner.js
: camada de abstração básica acima da biblioteca RobotJs que lê a tela como traçado de raio. Também possui algumas funções utilitárias.
UI.js
: escopo global para gerenciamento de UI. Ele inicializa e também atualiza a tela nas alterações.
GameManipulator.js
: Possui todo o código necessário para ler sensores e aplicar saídas ao jogo. Também é responsável por computar pontos, obter o estado do jogo e acionar callbacks/listeners para implementação real.
Learner.js
: É a implementação central do Algoritmo Genético. É aqui que a “mágica” acontece, percorrendo gerações, fazendo seleção “natural”, cruzamento, mutação...
genomes
com uma extensão .json
enter
(então, para começar, pressione s
)o
para salvar a geraçãoCc
para finalizar o processoO jogo do dinossauro tem um bug irritante: ele começa a "desviar" para a direita com o tempo, fazendo com que o dinossauro fique deslocado incorretamente da origem do jogo. Isso faz com que o programa leia o dinossauro como um cacto, já que é da mesma cor.
Você pode corrigir isso atualizando continuamente a página ou colando este código dentro do console no inspetor de elementos:
// Make sure the dino does not drift to the right
setInterval(function (){Runner.instance_.tRex.xPos = 21}, 2000)
Por favor, siga o guia de estilo Node.js do Felix. Não é complexo e tem um ótimo padrão simples para as coisas.