Oxiuro: Inteligencia artificial en tu colon

Started by grisendo, February 14, 2010, 02:59:06 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

grisendo

Aquí os dejo un jueguecillo que estoy haciendo tipo Worms...

La idea no es el juego en sí, sino practicar un poco temas de inteligencia
artificial... y darles una aplicación práctica :D En concreto los elementos que
implementa este juego son la lógica borrosa y los algoritmos genéticos, pero
es posible que más adelante le intente meter alguna cosa más.

El funcionamiento es el típico de los worms: elijes ángulo y potencia de disparo,
la bala sigue una trayectoria parabólica y debes acertar a tu oponente. En este
caso, el ángulo y la potencia se fuzzyfican (alto, muy bajo, fuerte...) sin
tener ninguna aplicación práctica más que mostrarlo por pantalla.

Otra variable que se fuzzyfica es la distancia al enemigo, y ésta si que se utiliza
para la inteligencia del sistema, de forma que:

angulo_correcto = %muy_lejos*a1+%lejos*a2+%angulo_normal*a3+%cerca*a4+%muy_cerca*a5;
potencia_correcta = %muy_fuerte*p1+%fuerte*p2+%potencia_normal*p3+%debil*p4+%muy_debil*p5;

Hay que elegir los parámetros a1, a2, a3, a4, a5, p1, p2, p3, p4 y p5 para que a cualquier distancia,
el gusanito acierte su disparo. Como los ángulos van de 1 a 90, y las potencias de 30 a 120, calcular
esto por fuerza bruta requiere (90^5 * 80^5) = 19.349.176.320.000.000.000 fases de entrenamiento!!!
Cada fase de entrenamiento significa un gusano disparando en 800 posiciones distintas (desde la posición
exacta del enemigo retrocediendo pixel a pixel hasta la distancia máxima definida a 800 pixels)

Por ello, se utiliza otro concepto de inteligencia artificial: los algoritmos genéticos.
Concretamente utilizo una colonia de 128 gusanos que entrenan, y solo los mejores sobreviven,
los peores son reemplazados por nuevos gusanos aleatorios, mutaciones de los mejores y descendientes
de los mejores. Así, en aproximadamente 18 generaciones se llega muchas veces a la solución óptima
(o a un mínimo local muy bueno), lo que hace 128*80 = 2.304 fases de entrenamiento solamente!!

Y ya basta de rollos, el funcionamiento del juego es:

A - Moverse a la izquierda
D - Moverse a la derecha
Arriba - Aumentar el ángulo de tiro
Abajo - Disminuir el ángulo de tiro
Izquierda - Reducir la potencia de tiro
Derecha - Aumentar la potencia de tiro
T - Entrenar una fase
P - Resetear el entrenamiento
F - Apuntar con el ángulo y fuerza ideales
Espacio - Disparar

No sé si queda muy claro... Puedes mover al worm, ajustar la potencia de tiro y disparar, todo manualmente. Si pulsas F, apuntará a donde le dé la gana (ya que no está entrenado). Cada vez que pulses T, el entrenamiento mejora (se ve la puntuación en la consola, el máximo es 800). Cada vez que pulses T (entrenar), verás cómo luego al pulsar F (apuntar automáticamente) y espacio (disparar) va mejorando la puntería, hasta el punto de que cuando llegue a 800 puntos, se acertará a cualquier distancia. Si ves que el entrenamiento se queda atascado y no mejora en cinco o seis turnos, puedes pulsar P y volverá a empezar de cero... (hay que tener en cuenta que los algoritmos genéticos utilizan elementos aleatorios, no son deterministas, y puede llegarse a una solución perfecta o no)... Pero ojo, no siempre hace falta un worm de puntuación ideal, es posible que con una puntuación de 500 ya se tenga uno muy bueno :)

Mejoras que le quiero ir metiendo (con el tiempo):

  • Más métodos de inteligencia artificial (la idea de este juego es aprender IA de forma totalmente práctica)
  • Montañitas agujereables y desniveles, como el original (y nuevos métodos de entrenar teniéndolos en cuenta)
  • Cualquier sugerencia es bienvenida
  • Comentar el código, que soy muy vago para eso :)

Descarga: http://www.grisendo.com/proyectos/oxiuro/oxiuro0.1.rar

Pantallazo:



Prg

 :o
me encanta la idea, sobre todo porque puedo aprender técnicas de inteligencia artificial, que tanta falta me hacen ahora :)
lo revisaré, gracias
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Windgate

Yo lo he probado, pero no lo entiendo muy bien... Es que grisendo es una persona muy especial y hace programas muy especiales...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

grisendo

Es que hacer jueguecitos sin más no me motiva mucho últimamente, le estoy
cogiendo gusto a esto del Bennu de una forma diferente, y eso... además
jamás me perdonaría meterme a hacer juegos nuevos por que sí, teniendo
tan abandonado mi "Final Fantasy Truño"  ;D

Este juego era sólo una escusa para probar de una vez por todas la lógica
borrosa y los algoritmos genéticos, que sabía de qué iban y había leído miles
de cosas sobre ellos, pero nunca me había parado a implementar algo (que
es cuando realmente se aprende), y quiero meterle más temas de IA, tantos
como sea posible, para ir aprendiendo a base de práctica.

Es sólo un esbozo, porque el personaje que va a tener la IA es el de la derecha,
no el de la izquierda: el de la izquierda es el protagonista y lo maneja el usuario,
el de la derecha lo manejará la máquina. El tema del entrenamiento: cuanto más
entrena la lombriz CPU, más puntería tiene. Además hay diferentes formas de
entrenarla: para que sea lo más precisa posible, para que lance con la mayor
fuerza posible, para que acierte sin más... Según eso, se pueden entrenar más
o menos, con distintos parámetros, para conseguir diferentes niveles de dificultad.

Si tengo un rato esta noche la haré más "versión final", de forma que el de la izquierda
lo manejes a mano y el de la derecha lo maneje la CPU, todo por turnos (y lo de las
teclas F y T desaparezca).

Por cierto, si alguien tiene un sprite del interior de un intestino me vendría de perlas
para el juego xDD

grisendo

Ahora sí, el usuario maneja a un bichito (A, D, Arriba, Abajo, Izquierda, Derecha y Espacio)
y la máquina maneja al otro, por turnos un disparo cada uno... al principio la CPU es muy inútil,
pero a cada tiro que hace va entrenando y mejora hasta que se convierte en una máquina de
matar :D

http://www.grisendo.com/proyectos/oxiuro/oxiuro0.2.rar

Drumpi

Juer, cómo se nota la gente que ha estudiado una carrera de informática: les das un rastrillo y una pala y te construyen un bunker anti-nuclear :D :D :D
Tengo ganas de verlo, a ver de qué es capaz el bicho. Lo más complicado que he programado sobre IA está en el concurso, y no es una máquina de matar ni por asomo ;D

PD: que a cuento viene esto, acabo de ver por la tele "yo, robot" ;D
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)