NEAT sobre emulador Python

B

Bien, pues llegan las entregas de la uni y una de las partes de mis prácticas es desarrollar una red neuronal evolutiva de topología aumentada (NEAT) (algoritmo evolutivo con evolución de pesos y topología de una red neuronal). Mi idea, en principio era programar algo muy similar a esto:

Pero con un emulador de GameBoy y el videojuego Motocross Maniacs.
Como hay git del marIO con el codigo en LUA pues algo podré rascar, pero lo tengo que hacer en python obligatoriamente. Y ahi está mi problema, he programado muy poco con python (hasta ahora poco mas que un ejercicio con un algoritmo genético simple) y tengo serias dudas de como y que usar para desarrollar la practica.

La duda principal seria, a todos aquellos que tengais experiencia en python, de que herramientas tirarías para hacer algo así. De momento he investigado un poquillo, pero no me queda claro si programando directamente sobre el emulador sería posible realizarlo todo, o necesitaría alguna cosa mas como Selenium para hacer el scrap de la pantalla.

Lo dicho mis fellows... ¿Como procederíais?

n40k1

Quiza esto te sirva:

Te has metido en un fregao' bueno xD

1 respuesta
B

#2 Ostias, pues eso para empezar esta dpm xD
¿De verdad lo ves tan complejo? El motocross maniacs es un juego muy sencillito xD es en 2D, se maneja con 3 botones...

HeXaN

¿Tienes que desarrollar tú al 100% la red neuronal o puedes usar algo intermedio como Keras/neat-python?

1 respuesta
B

#4 Pretendia usar el codigo del marIO en lua y traducir la parte correspodiente a la red neuronal a python. Pero de momento no descarto nada... con entregar un ejercicio libre de python que se ciña un poco a la temática no creo que se pongan tontos por usar una librería.

1 respuesta
HeXaN

#5 Pues si puedes tirar de librería con neat-python te quitas de en medio un tocho de trabajo. Para las capturas de pantallas puedes usar Pillow. Te recomiendo que uses un juego simple con entradas fáciles y una función fitness fácil. Cuanto más complejo sea el juego más difícil será codificar las entradas y hacer que aprenda decentemente.

1 respuesta
B

#6 Si, lo de un juego sencillo ya lo había planeado, motocross madness es un juego muy básico, en cuanto termine lo que estoy haciendo le echaré un ojo a la libreria y ejemplos de uso. Gracias.

B

@HeXaN he conseguido un emulado de gameboy que admite scripts, aunque no excesiva funcionalidad, pero si trae un ejemplito de "bot" de tetris que me puede ayudar... ¿tu por donde tirarías antes? script externo que haga scrapping con Pillow y procese el NEAT y las pulsaciones de teclas, o tratar de usar el api del propio emulador?
El emulador es este:
https://github.com/Baekalfen/PyBoy
En el readme te aparecen las funciones que estan implementadas.

1 respuesta
HeXaN

#8 Buah, es cremísima ese emulador. Te da ya implementada la función getScreenBuffer() que te irá muchísimo mejor que ponerte a sacar capturas con Pillow.

1 respuesta
B

#9 Ok, gracias, tomaré el camino de la implementación como script dentro del emulador, a ver si me da tiempo y no la jodo por mi inexperiencia con python :S

B

He estado trasteando un poco hoy...
Para la funcion fitness solo necesito tener en cuenta un timeout y la posicion del "mapa" de la consola por frame, no necesito hacer capturas en principio. Las necesitaria si me diese tiempo e implementase que el bicho hiciera algo mas que acelerar para que actuara en funcion de ciertos sprites de determinada manera, cosa que solo haré en caso de tener tiempo. Con que evolucione lo suficiente para llegar a acelerar me llega.

Luego he pillado por ahí un ejemplo con neat-python del flappy bird, a parte de que está estructurado de una manera un poco rara, el sistema de pygame no se parece demasiado al del emulador (en el flappy por ejemplo puedes coger 15 genomas diferentes y testearlos a la vez y en el caso de la pyboy tiene que ser de manera secuencial) por lo que adaptarlo me va a costar un poco mas. Procuraré buscarme algun ejemplo de neat-python que venga incrustado en un emulador, así lo tendré mas facilito.

8 días después
B

Pues bumpeo esto, he estado por la tarde testeando cosas del emulador y planteando el desarrollo que voy a seguir. De momento tengo una complicación y es que tengo que hacer un ajuste un tanto jodido porque las coordenadas que dan de los sprites son de la pantalla que es una sección del tileview completo y el tileview tiene sus propias coordenadas. Entonces necesito calcular las posiciones que hay en el tileview justo debajo de los sprites del screen que conforman la moto.

Con eso podría sacar que es lo que se está pisando, por si hay que usar un turbo o inclinar la moto.

Aunque ese no es mi principal problema, el principal es hacer los inputs de las funciones de activación, he pillado una del neat que hay para el flappy bird pero no la entiendo nada bien, se que mide unas distancias a las tuberías próximas y a la tubería inferior futura pero tampoco acabo de controlar bien que hace la formula y como es procesado el dato resultante.

Buscaré otro ejemplo de neat-python a ver si encuentro un input más claro para la función de activación.

9 días después
B

Bueno, pues al final ya tengo algo, no está perfecto pero funciona en la mayoría de casos:

www.github.com/ccokee/Neat-MManiacs

Por cierto, no puedo subir la BIOS de la Gameboy ni la imagen de Motocross Maniacs por razones obvias. Las tenéis que conseguir a parte, o engañándome por MP