Ir a Inicio

Vida Artificial: Independencia 08: Jugar...

Esta es la primera versión en la cual los algoritmos genéticos se enfrentan para sacar el mejor jugador. ¿En que consiste el juego?. En independencia 01 se menciona:

  1. Dos jugadores.
  2. El jugador 1 comienza colocando su símbolo en alguna celda vacía de la cuadricula.
  3. Sigue el jugador 2 colocando su símbolo en otra celda vacía de la cuadricula.
  4. El objetivo es hacer líneas horizontales o verticales con N mismos símbolos contínuos.
  5. Ambos jugadores continúan jugando hasta que la cuadricula este llena.
  6. Gana el jugador que complete mas líneas horizontales y verticales.
x 0 x 0 0
0 0 x 0 0
x x x 0 0
0 x x x x

Dado N=4 (gana los de 4 horizontal o vertical) el jugador con símbolo "x" es el vencedor con 1 horizontal y una vertical, es decir 2 puntos, el jugador con símbolo "0" no tiene puntos.

Lo llamativo es que los algoritmos genéticos se generan al azar y por procesos de filtración (selección natural), solo quedan aquellos que juegan bien. Los algoritmos genéticos empiezan sin saber que están en un juego.

¿Cómo se interrelacionan con el juego? El juego o ambiente tiene tres(3) funciones:
1. Retorna el tamaño del tablero (afecta a dos variables).
2. Retorna si determinada casilla esta llena o vacía (el algoritmo envía dos variables o sensores que serían las posiciones X y Y del tablero), en una tercera variable se retorna la posición.
3. Coloca la ficha en determinada casilla (el algoritmo envía dos variables o sensores que serían las posiciones X y Y del tablero).

¿Cómo es el sistema de filtrado?
Son los siguientes pasos:
1. Se genera al azar el algoritmo genético.
2. Prueba 1: ¿El algoritmo llama las tres funciones? Caso negativo. Vuelve a 1.
3. Prueba 2: ¿El algoritmo al menos llena una casilla? Caso negativo. Vuelve a 1.
4. Prueba 3: Mutar el algoritmo hasta que logre llenar un mínimo de casillas.
5. Los algoritmos que hayan pasado las tres pruebas entran en un torneo. Se escogen al azar los contrincantes y comienzan a competir.
6. Finalizado el torneo, los algoritmos con mayor puntaje se reproducen (sus hijos mutan), sobreescribiendo a los algoritmos perdedores. Vuelve a 5.

Al principio los resultados fueron muy pobres, pero mejoraron notablemente cuando el tablero comenzaba con las coordenadas (1,1). Antes el tablero comenzaba con las coordenadas (0,0). ¿En que afecto este cambio tan minúsculo? Las variables de los algoritmos genéticos eran inicializadas en 0, luego cualquier algoritmo que no tocara las variables al menos llenaba la casilla (0,0) pasando la prueba 2, pero en la prueba 3 fallaban estrepitosamente. Al cambiar a (1,1) la prueba 2 se volvió mas estricta y como es rápida, los resultados mejoraron.

Una vez que los suficientes algoritmos genéticos pasaron las tres pruebas, empezó el torneo, una vez finalizaba, los mejores se reproducían (los hijos mutaban y heredaban el puntaje del padre). En varias pruebas, esta herencia del puntaje del padre salió contraproducente porque finalmente los hijos del mejor jugador ocupaban el resto de la tabla de posiciones y después de varios ciclos de torneos, ya ningún jugador ganaba ni perdía. Las mutaciones no afectaban a los hijos. Para solucionar esto, simplemente los hijos heredaban el puntaje del padre - 1 (restándole uno). Los resultados fueron bien interesantes.

¿Que se concluye de todo esto?

  1. Los filtros de algoritmos genéticos deben estar muy bien diseñados.
  2. Hacer muchas pruebas por cada filtro. La "evolución" aprovecha el mas mínimo agujero para irse por el camino del menor esfuerzo.
  3. Verificar los valores que manejan los algoritmos genéticos, para no dejarle agujeros a la "evolución".

Descargar código Fuente