IA Dinosaur game
Dinosaur AI
El juego de dinosaurio del navegador Google Chrome siendo ejecutado por una inteligencia artificial.
Destacables del main.py
4 clases: Dinosaur, Obstacles, SmallCactus y LargeCactus.
En el interior de la clase Dionsaur
__init__(self, img)
. Se definen las características del dinosaurio.update(self)
. Actualiza posición dinosauriojump(self)
. Permite saltar al dinosaurio.run(self)
.draw(self, SCREEN)
. Dibuja al dinosaurio
En el interior de la clase Obstacle
Contiene funciones de inicializar, dibujar y actualizar.
En el interior de las clases SmallCactus(Obstacle)
y LargeCactus(Obstacle)
Inicializa el obstáculo, con la diferencia entre ambos de que el Large tiene mayor cota y con la particularidad ambos de que se le pasa un parámetro number_of_cacti
.
### Otras funciones
remove(index)
. Para borar el dinosaurio. Tiene enlace coneval_genomes()
porque elimina tanto el dinosaurio como su generación y sus valores de la red generada.distance(pos_a, pos_b)
. Cálculo de distancia entre dos puntos
Entrenamiento
Se realiza mediante NEAT (NeuroEvolution of Augmenting Topologies) que está inspirado en el proceso de la evolución.
Generamos muchos dinosaurios y los dejamos jugar (de forma aleatoria). Cuanto más lejos lleguen, mejor puntuación obtienen.
Ordenamos toda la población de dinosaurios según resultado y nos quedamos con los mejores, para hacer una evolución del comportamiento de ellos.
Cada Dinosaurio está representado por una red neuronal, por lo que cogemos las redes que llegan más lejos y las utilizamos para la mutación de la siguiente generación.
Fichero config.txt
fitness_criterion
. Determina qué dinosaurios utilizar.fitness_threshold
. Límite para terminarpop_size
. Número de dinosaurios en cada interacción.activation_default
. Determina cómo se calcula la salida dada una entrada.network parameters
(num_hidden -0-, num_inputs -2-, num_outputs -1-).num_inputs
. 1) Coordenada Y del dinosaurio 2) Distancia al captus.num_outputs
. 1) Determina si saltar o no.
El resto de parámetros en NEAT-Python.
En el interior de run(config_path)
config
. Contiene parámetros de configuración.pop
. Poblaciónpop.run()
.- Loop sobre la generación.
En el interior de eval_genomes()
ge
. Para guardar los diccionarios de datos de cada dinosaurio.nets
. Para guardar el fichero de configuración de los objetos neuronales de cada dinosaurio.score()
. Cada vez que se llama la función, se incrementa un punto. A los 100 puntos se incrementa la velocidad del juego.background
Bucle infinito de obstacles
Para puntuar los dinosaurios conforme caen, se ejecuta fitness -= 1
sobre la generación concreta del dinosaurio.
Bucle de dinosaurs
De cada dinosaurio se almacena su (Y, distCactus)
en cada posición
Toques finales
Nueva propiedad en clase dinosaurio para hacer un rectangulo alrededor del dinosaurio de un color aleatorio.
Línea entre el dinosaurio y el cactus siguiente.
54
y12
son valores agregados de forma manual y determinan el offset.Dashboard para controlar la cantidad de dinosaurios de la generación actual, y el número de generación.
Para correr el código
Genera una ambiente en conda para esto. (yo utilicé python 3.7.10). Instalar conda
conda create --name dinosaurai python=3.7.10
Accede al ambiente de conda creado
conda activate dinosaurai
Instala requirements.txt dentro del ambiente creado (snakeai)
pip3 install -r requirements.txt
Ejecuta el fichero
main.py
desde el ambiente creado (snakeai)