Una inteligencia artificial sencilla para enseñar al dinosaurio offline de Google Chrome a saltar cactus, utilizando Redes Neuronales y un Algoritmo Genético sencillo.
Mira este vídeo para verlo en acción y aprende cómo funciona: Inteligencia Artificial con el Dinosaurio de Google
Instale Node.js
en su computadora.
Clona/descarga esta carpeta a tu computadora.
ejecute npm install
dentro de esta carpeta
Abra el juego de dinosaurios de Chrome y deje a un lado el terminal (DEBE estar en la misma pantalla) (Consejo: vaya a herramientas de desarrollador y, en red, configúrelo como sin conexión)
ejecute node index
dentro de esta carpeta. Si el juego estaba localizado, moverá el cursor del ratón al origen del floor
del dinosaurio. Presione la tecla s
en la terminal para comenzar a aprender.
Disponemos de 3 entradas diferentes leídas de los píxeles de la pantalla:
También tenemos una salida con 3 estados posibles:
Cada Generación consta de 12 redes neuronales (Genomas).
Cada genoma se prueba con el juego, mapeando constantemente las entradas leídas del juego a las entradas de la red neuronal, y obteniendo la salida/activación de la red y aplicándola a las teclas del teclado.
Mientras probamos cada genoma, realizamos un seguimiento de su "aptitud" contando los cactus saltados en el juego.
Cuando se completa una generación completa, eliminamos los peores genomas hasta conseguir N
genomas. Con esos N
genomas, luego seleccionamos dos al azar y cruzamos sus valores/configuraciones. Después de eso, aplicamos mutaciones aleatorias en los valores/configuraciones de la Red Neural, creando un nuevo genoma.
Hacemos el cruce/mutación hasta obtener nuevamente 12 genomas y lo repetimos constantemente.
Toda la implementación se realizó utilizando Node.js, con Synaptic (biblioteca Neural Network) y RobotJs (una biblioteca para leer píxeles y simular pulsaciones de teclas).
Hay algunos archivos en el proyecto:
index.js
: une todo.
Scanner.js
: capa de abstracción básica sobre la biblioteca RobotJs que lee la pantalla como si fuera un trazado de rayos. También tiene algunas funciones de utilidades.
UI.js
: Alcance global para la gestión de UI. Inicializa y también actualiza la pantalla sobre los cambios.
GameManipulator.js
: Tiene todo el código necesario para leer sensores y aplicar salidas al juego. También es responsable de calcular los puntos, obtener el estado del juego y activar devoluciones de llamadas/oyentes para una implementación real.
Learner.js
: es la implementación central del algoritmo genético. Aquí es donde ocurre la "magia", al correr generaciones, haciendo selección "natural", cruce, mutación...
genomes
con una extensión .json
enter
(luego, para comenzar, presione s
)o
para guardar la generación.Cc
para finalizar el procesoEl juego de dinosaurios tiene un error molesto: comienza a "desviarse" hacia la derecha con el tiempo, lo que hace que el dinosaurio se equivoque y se desplace del origen del juego. Eso, hace que el programa lea al dinosaurio como un cactus, ya que es del mismo color.
Puedes solucionarlo actualizando continuamente la página o pegando este código dentro de la consola en el inspector de elementos:
// Make sure the dino does not drift to the right
setInterval(function (){Runner.instance_.tRex.xPos = 21}, 2000)
Siga la guía de estilo Node.js de Felix. No es complejo y tiene un patrón muy simple para las cosas.