Jugando con programas evolutivos

El fin de semanas, estuve escribiendo un ejercicio casi tipo codekata. Me gusta explorar la idea de programas evolutivos (como agentes con programas incorporados que van evolucionando en ambientes simulados), así que puse manos a la obra, y creé una solución dedicada a experimentar con una ejemplo de prueba de concepto. Está escrito en C#, usando VS 2008, usando el soporte de test de la herramienta. He publicado el código dentro de mi Google code project ajcodekatas en:

http://code.google.com/p/ajcodekatas/source/browse/#svn/trunk/EvolveExample

La solución es EvolveExample:

(Si no tienen el soporte de test de VS, pueden remover el proyecto Evolve.Test).

Las clases principales residen en el proyecto de librería de clases Evolve :

Animal representa un agente. Tiene una lista de Instructions, que son generadas al azar. El animal habita un campo con comida. Su programa tiene instrucciones como Eat, Move East, North, West, South, o Predate (tomar energía/comida de otro animal que esté en la misma celda de la grilla). Cada instrucción tiene un costo: un punto de energía. Eat es una instrucción que toma 10 puntos de energía o menos, tomando comida de la celda actual. Predate toma 100 puntos de energía o menos, restándoselo a otro animal que esté en la misma celda.

Para ver el programa en acción, lanzar el proyecto winform Evolve.GUI, seleccionar la opción Evolve -> Run. Veremos:

El campo es una grilla (en este ejemplo, de 20×20). Cada celda tiene un nivel de comida (verde está llena, negro es vacía). A la derecha, una lista muestra los mejores animales y sus programas. Los animales son rankeados de acuerdo a su nivel de energía al final de cada ronda de simulación. El programa continúa con más simulaciones, usando nuevos campos. En cada nueva simulación, la población es ordenada por energía descendente, y los mejores son incluidos en la nueva simulación, los lugares vacantes son ocupados por mutaciones de esos mejores, y algunos animales son inyectados con programas aleatorios.

Durante una simulación, aparece información sobre el nivel de comida y el animal que mejor se desempaña, al pie de la ventana.

Con las opciones de menú Food y Population podemos establecer el nivel de comida y el número de animales, a usar al comienzo de cada simulación. Estos valores se usan recién la próxima vez que elijamos Evolve -> Run. La opción Evolve -> Stop puede ser usado para terminar una serie de simulaciones.

Próximos pasos

Este es un primer ejemplo, una prueba de concepto que sirva de base. Tengo algunas ideas, para explorar en futuras versiones:

- Tener un conjunto de instrucciones más interesantes, con condicionales, y que sea sensible al ambiente. Me gustaría añadir instrucciones como “Si hay comida en tal dirección, ir hacia allí”. En vez de un programa lineal, podría armar un árbol de instrucciones, algo como un programa Lisp.

- Los valores de ejecución (tamaño del campo, nivel de comida, energía inicial para cada animal), deberían poder establecerse por un formulario, y leer y grabarse de archivos XML.

- Serializar los resultados y poblaciones en archivos XML

- Evolución en un cluster. Podría usar AjMessages, AjAgents, o MPI sobre unc luster HPC, para simular evolución en una grilla o cluster de máquinas.

Como es habitual, ¡me divertí escribiendo este código!

Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez
http://delicious.com/ajlopez

This entry was posted in 1389, 3036, 5374. Bookmark the permalink.

One Response to Jugando con programas evolutivos

  1. Interesante le pegare un vistazo a fondo!
    Esto me recuerda mucho al “project hoshimi” no se porque pero lo hace!

    un saludo!
    http://dotnetpodcast.blogspot.com/

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>