Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Nueva demo de IA / New AI Demo

Iniciado por Vicente, 14 de Junio de 2006, 12:17:16 AM

« anterior - próximo »

Vicente

Hola

Este mensaje tiene dos partes (parte 1 para todos, parte 2 para la gente que sepa de IA).

(parte 1)

Estoy preparando una nueva demo de IA para Haddd. La demo consiste en una versión muy simple del Asteroids donde mostraré una máquina jugando usando una red neuronal y un arbol de decisión (esa es la teoría).

Pero para entrenar a la red y al arbol, necesito patrones, y que mejor que los genere otra gente :) Por eso, he colgado el juego aqui:

//www.funmangames.com/haddd/downloads/Asteroids.zip

El juego tiene todos los requisitos de Haddd (Shaders 2.0, DirectX instalado, etc etc).

Los controles son:

WSAD y el ratón para la cámara.
Las flechas para mover la nave (el cubo azul. Tiene inercia)
El espacio para disparar
R para comenzar una partida nueva
P para pausar
H para poner a la IA en control (no hay IA, así que no le deis, pero por si acaso le dais sin querer)
Escape para terminar de jugar

La nave es el cubo azul, los asteroides las esferas rojas, los disparos son esferas verdes. La cámara empieza más o menos centrada, pero colocarla antes de empezar a jugar. Cada vez que termináis un nivel u os matan el juego se pausa. Después de morir tenéis 3 segundos de invencibilidad. Y creo que no me dejo nada.

Cuando salís de la partida o comenzáis una nueva partida se crea un fichero que se llama AsteroidsLog_numerajo.txt. Ese fichero es el fichero de patrones. Si me lo podéis enviar (comprimido, que suele ser tochillo) a

zaor81 AT hotmail DOT com

Con los puntos que hicistéis en la partida y si fuera posible, vuestra forma de jugar (esto es un poco chungo de describir...). Es para hacerme a la idea de cuando entrene a las máquinas si son capaces de diferenciar las formas de jugar de cada uno.

Si no de todas formas entrenaré yo a las máquinas, pero se me hacía gracioso comparar con gente diferente.

Se que el cubo no indica muy bien cual es el "frente" de la nave, pero bueno, es un problema menor creo (espero que no sea muy molesto).

(parte 2)

Para la gente que sabe del tema de la IA. Esto muestreando 60 patrones por segundo (la tasa a la que actualizo la pantalla y la lógica del juego), y cada patrón está compuesto de lo siguiente:

- Posición de la nave
- Velocidad de la nave
- Posición del asteroide más cercano (relativa a la nave)
- Velocidad del asteroide más cercano (relativa a la nave)
- Posición del segundo asteroide más cercano (relativa)
- Velocidad del segundo asteroide más cercano (relativa)
- Densidad de asteroides en zonas de la pantalla (divido la pantalla en 16 zonas y calculo la superficie de todos los asteroides cuyo centro está en ese trozo).
- Si la nave es invencible o no
- Si la nave aceleró o no
- Si la nave frenó o no
- Si la nave giró a la izquierda o no
- Si la nave giró a la derecha o no
- Si la nave disparó o no

Ese es mi patrón. No estoy diciendo que vaya a usar toda la información (para la red ni de coña, para el árbol no lo se). Alguien tiene opiniones sobre la elección de los parámetros que mido, la frecuencia de muestreo, comentarios varios?

Seguramente a los patrones luego les aplique algún método para reducir su dimensionalidad (PCA o algo así). Pero eso es para jugar luego con ellos, me gustaría intentar que de buenas a primeras tengan información relevante sin tener que operar los atributos.

Un saludo!

Vicente

P.D.: sorry it´s a little late to translate it :(

Warchief

Así de primeras me salen unas cuestiones sobre los parámetros:

[list=a]

  • ¿La posición de la nave es realmente necesaria? Podría ser que sólo en los bordes, por lo que puede ser un parámetro molesto si se mide con coordenadas 2D o 3D. ¿Y por distancia al borde?

  • ¿Por qué la posición de los asteroides? ¿No es mejor la distancia?

  • No me gusta mucho lo de segundo asteroide más cercano. En muchos casos el cuarto puede estar un poco más lejos pero ir mucho más rápido que segundo y tercero. Ciertamente tenderá a ser el segundo o incluso el más cercano, pero puede ser demasiado tarde. Supongo que es una simplificación, por lo que tampoco es tan importante.

    [/list:o]

    Espero que no sean comentarios erróneos. :)

    PD: No he podido ejecutarlo, me sale error de güindous.

Vicente

(English parth)

Hi!

this message has two parts (part 1 for everyone, part 2 for AI people).

(part 1)

I´m preparing a new AI demo for Haddd. The demo is a very simple Asteroids where I´ll show a computer playing using a neural net and a decision tree (in theory). To train the net and the the tree I need patterns, and what´s better than have other people generate them :) So I´ve uploaded the game here:

//www.funmangames.com/haddd/downloads/Asteroids.zip

The game has all Haddd requisites (Shaders 2.0, DirectX installed,...)

The controls are:

WSAD and the mouse to move the camera
Arrow keys to move the ship (the blue cube, it has inertia)
Space to fire
R to start a new game
P to pause
H to put the AI in charge (there´s no AI yet, so don´t hit this key)
Escape to end the game

The ship is the blue cube, the asteroids are the red spheres, the bullets are the green spheres. The camera starts more or less centered, but better move it before starting playing. Every time you finish a level or you die the game is paused. After dying you have 3 seconds of invulnerability. I think that´s all.

When you exit the game or you start a new game a file called AsteroidsLog_uglynumber.txt is created. That´s the patterns file. If you can send it to me (compressed if possible) to:

zaor81 AT hotmail DOT com

With the game score and if possible, a brief description of your "way of playing" (I know that´s hard to write...). It´s to see if when training the computer they are able to play differently if they were trained by different people.

I know that the blue cube is not very good as ship, as it´s hard to know where it´s facing (I hope it´s not too bad...).

(part 2)

To the people who know about AI. I´m sampling 60 patterns per second (the update rate of the game render and logic), and each pattern has the following attributes:

- Ship position
- Ship velocity
- Closest asteroid position (relative to the ship)
- Closest asteroid velocity (relative)
- Second closest asteroid position (relative)
- Second closest asteroid velocity (relative)
- Asteroids density in screen zones (I divide the screen in 16 zones and calculate the surface of all asteroids in every zone)
- If the ship is invulnerable or not
- If the ship thrusted or not
- If the ship reverse thrusted or not
- If the ship turned left
- If the ship turned right
- If the ship fired

That´s my pattern. I´m not sure if I´m going to use all the information (surely not for the net, no idea about the tree yet). Someone has any oppinion about the parameters I´m taking into account, sampling frecuency, other comments?

Probably I´ll apply some statistic method to the patterns later (PCA or similars). But that´s to play with them, I would like to start with a set of attributes as good as possible without having to operate them.

Greetings!

Vicente

Vicente

Hola,

- la posición de la nave solo tiene dos coordenadas (XZ, todos los objetos tienen la Y a cero). No entiendo muy bien a que te refieres con distancia al borde... De todas formas si tengo que tener la distancia a los 4 bordes del mapa son 4 valores en vez de los 2 que uso ahora (pero lo mismo no te entiendo).

- elegí la posición de los asteroides y no su distancia, por saber como estaban colocados respecto al jugador. Yo al jugar tiendo a girarme hacia el asteroide más cercano para dispararlo cuando viene hacia mí (bueno, no al más cercano, al que creo que va a colisionar conmigo). Solo con la distancia no se si podría tener esa clase de información para decidir como moverme.

- respecto a lo del segundo: a mi tampoco me gusta :p Quizás debería filtrar un poco los asteroides y en vez de calcular contra todos, solo calcular contra los que se mueven más o menos hacía mi ajustando por lo rápido que se mueven hacia mi (por lo que tu comentabas).

Respecto al error, los tutoriales de Haddd te ejecutaban?

Gracias por los comentarios y un saludo!

Vicente

TheAzazel

Hola Vicente,

60 ejecuciones logicas por segundo se me antoja un pelin elevado, mas aun si encima vas a estar muestreando 60 veces por segundo toda esa informacion...vas a terminar loco! jajaja. Pero esta claro que el muestreo debe ser igual a las ejecuciones logicas por segundo para no perder informacion del jugador. No se como de factible seria dejar el rate grafico a una velocidad sin limitar(asi iria a velocidad del refresco del monitor si hubiera vsync activado, y se consigue el aspecto mas suave) y el logico a digamos, unos 20 por segundo, que si no es un juego de accion muy rapida, puedes vivir con un retraso maximo de respuesta de 50ms (a un ratio de 20 por segundo).

Bueno, dejo de liarte jeje. Lo que has posteado me parece muy interesante, asi que esta tarde lo voy a probar en mi casa y te mando los ficheros, me imagino que el codigo lo tendras disponible no? es que me gustaria echarlo un vistazo :), que pena que este todo en C# jajaja, si estuviera en C++.... :P

Saludos!

Warchief

Cita de: "Vicente"la posición de la nave solo tiene dos coordenadas (XZ, todos los objetos tienen la Y a cero). No entiendo muy bien a que te refieres con distancia al borde... De todas formas si tengo que tener la distancia a los 4 bordes del mapa son 4 valores en vez de los 2 que uso ahora (pero lo mismo no te entiendo).
Me refiero a guardar sólo un dato "distancia" (al centro por ejemplo), de forma que se trace conceptualmente un círculo que separe: zona central de zona de borde ( ya que me parece más complicado asociar un comportamiento a la posición 13,8, que a la zona Borde).

Cita de: "Vicente"elegí la posición de los asteroides y no su distancia, por saber como estaban colocados respecto al jugador. Yo al jugar tiendo a girarme hacia el asteroide más cercano para dispararlo cuando viene hacia mí (bueno, no al más cercano, al que creo que va a colisionar conmigo). Solo con la distancia no se si podría tener esa clase de información para decidir como moverme.
¿Uhm, distancia y ángulo en Y? (ejemplo: asteroide1  a 20uds y 18º)
La idea de guardar el ángulo me parece interesante, porque a veces se dispara un asteroide lejano sólo porque en el camino de giro al más cercano pasas por la dirección del lejano y puedes enchufarle.

Cita de: "Vicente"respecto a lo del segundo: a mi tampoco me gusta :p Quizás debería filtrar un poco los asteroides y en vez de calcular contra todos, solo calcular contra los que se mueven más o menos hacía mi ajustando por lo rápido que se mueven hacia mi (por lo que tu comentabas)
Uhm, por eso dije que como simplificación me parece bien, no estimar todos los asteroides dará situaciones extrañas (como que la nave dispara sin estar apuntando al primero o al segundo, como dije por lo de cruzar el ángulo de uno lejano por el camino).

Cita de: "Vicente"Respecto al error, los tutoriales de Haddd te ejecutaban?

Nunca probé :oops: ; probaré esta noche en mi casa.

Vicente

Hola,

gracias por los comentarios!

Aza: no he subido el código porque sigo haciendole ñapas y tal de vez en cuando, pero vamos, que te lo paso si eso (la demo completa la subiré a Haddd cuando esté con la IA entrenada). Sobre las ejecuciones lógicas: tomo nota de bajarlas a menos (tantas no valen para mucho creo :p).

Warchief: una cosa, el mapa es circular (se me olvido comentarlo, fallo). Vamos, que si te sales por un lado entras por el otro, con lo cual, no se muy bien si la distancia ya tendría sentido... Lo del ángulo y distancia si que me parece interesante. Le voy a dar una pensada porque no se me había ocurrido enfocarlo así la verdad.

Cuando pruebes los tutos, si te dan error, pues no hay nada que hacer :( Si te funcionan y esto no, pues me pongo a investigarlo porque es algo raro raro...

Un saludo!

Vicente

gdl

Hola Vicente,

Quiero recordar haber hecho algo similar con redes neuronales también y no me funcionó hasta que no introduje parámetros de segundo orden (tipo vx*vx, vx*vy, vy*vy, etc.) Por eso también creo que deberías pensar en un vector más elaborado basado en distancias y ángulos en vez de posiciones y velocidades cartesianas.

Vicente

Hola,

gracias por el consejo gdl, lo tengo en cuenta. Al final usaré distancias porque eso me permite tener en cuenta el radio del asteroide (la distancia de centro a centro tenía ese problema...).

También me han dado otro consejo (lo pongo aquí para el que le interese), es un poco de cajón pero se me había pasado  :oops: La base de datos para entrenar debe tener más o menos el mismo número de patrones de cada clase (ahora mismo había muuuuuuuuuchos patrones con la clase "no hacer nada").

También me han comentado que quite el disparo y solo enseñe a la red a esquivar, ya que hay demasiadas clases de salida (y lo peor es que pueden activarse algunas a la vez como disparar y girar).

Voy a ponerme a hacer pruebas a ver que sale. Un saludo!

Vicente

gdl

Otra forma que hay de entrenar las redes neuronales es mediante un algoritmo genético y de esta forma no necesitas patrones de entrada.

En vez de poner una nave, pones 25 (o más) inicializando las redes neuronales aleatoriamente. La mayoría de las naves mueren rápidamente porque no esquivan los asteroides y terminan chocándose con ellos.

Cuando una nave muere, tomas dos naves supervivientes al azar y haces la media de sus redes neuronales. Entonces resucitas la nave muerta con esa red neuronal media en un sitio seguro.

Las naves peor adaptadas a esquivar asteroides van muriendo antes que las que lo hacen bien. Poco a poco las naves que sobreviven son las que han aprendido a esquivar asteroides. En unas cuantas generaciones tendrás naves "inteligentes" que esquivan los asteroides (o no, con lo que te tendrás que replantear si el vector de entrada es suficientemente expresivo).

Es simple, funciona bien y no necesitas patrones. Además, si tienes representación gráfica, puedes ver la evolución que siempre queda bonito.

Vicente

Hola!

lo de los genéticos lo había pensado, pero se van para otra demo (de un Space Invaders ;)). En esta prefiero enseñar otras cosas, pero tomo en cuenta la sugerencia gdl ;)

Un saludo!

Vicente






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.