Vocês já viram o vídeo no qual o Mario se move automaticamente ao encontrar um obstáculo ou inimigo e no topo dele aparecem algumas linhas e quadrados? Então, vamos entender um pouco sobre ele.
Por mais que o conteúdo do vídeo seja um jogo da década de 90, a técnica utilizada foi desenvolvida em 2002 e aplicada nele.
O trabalho desenvolvido por Kenneth O. Stanley e Risto Miikkulainen pode ser encontrado aqui.
O autor utilizou uma técnica chamada NeuroEvolution of Augmenting Topologies (NEAT), na qual a topologia de uma rede neural artificial é produzida pela utilização de Algoritmo Genético. Um tempo atrás fiz um texto introdutório a Redes Neurais Artificiais aqui no portal.
O Algoritmo Genético utilizado recebe uma série de topologias diferentes e evolui estas a fim de encontrar a melhor para o problema em questão.
De maneira simples, o Algoritmo Genético é um modelo computacional desenvolvido baseado na teoria da evolução natural. Nesse algoritmo uma população formada por Redes Neurais evoluirá com o objetivo de encontrar a melhor topologia para o problema.
A técnica foi desenvolvida com o objetivo de ser utilizada para problemas em que o ambiente está sempre em modificação. Isso ocorre porque o algoritmo busca por um comportamento que será utilizado no decorrer do tempo, ao invés de uma solução para um estado determinado.
No vídeo o autor relata como a inteligencia por trás das escolhas das jogadas funciona.
Na parte superior do vídeo, é possível ver linhas coloridas e caixas piscantes. Essa é a rede neural que será evoluída para selecionar os botões que serão “pressionados”.
A caixa à esquerda, com pequenos quadrados brancos e pretos, representa a entrada. É o que o modelo realmente enxerga, sendo que os brancos representam os locais onde o Mario pode ficar de pé e obstáculos, e os pretos os inimigos.
No lado direito estão representadas as saídas, que são os botões que devem ser “pressionados” e irão fazer o Mario se mover.
E no meio disso estão as linhas e caixas, que representam a rede neural encontrada, sendo que as caixas brancas são os neurônios e as linhas são os axiomas e dendritos que conectam os neurônios.
Ao todo, para alcançar a maestria das jogadas, foram necessárias 24 horas de processamento. No início a máquina não conseguia nem sair do lugar, até que conseguiu uma topologia que ativou o movimento para a direita.
Nesse exemplo, a melhora entre uma rede e outra é avaliada utilizando a distância que o Mario percorre.
MarI/O foi escrito utilizando Scratch e a linguagem Lua, e o código fonte pode ser encontrado no link do vídeo no Youtube.