ABK-GOFAI: Una Inteligencia Artificial Clásica para Jugar Abak Evolution Backgammon.
Sin la ayuda de una Red Neuronal, el desarrollo de una Inteligencia Artificial (IA) para Abak resultó ser una tarea desafiante y, con el tiempo, alcanzó un límite aparente. Sin embargo, fue un proceso divertido de desarrollar, y aún está en servicio para jugar en nivel "fácil", "normal" y "avanzado". Este post explica cómo funciona y cómo se hizo.
Fase 1, GOFAI PHP
La primera versión de IA de Abak fue escrita en PHP y estaba destinada a colapsar el sistema con errores de 'falta de memoria', pero pavimentó el camino para una versión en C++. Fue el campo de prototipado para que yo descubriera cómo diablos se hace una IA. La primera vez que la ejecuté conectada al servidor web (así que efectivamente estaba jugando contra ella), necesitó 15 largos segundos para seleccionar un movimiento, y cuando vi al servidor moverse solo, me volví loco y posiblemente hice un pequeño baile. No estoy seguro.
Fase 2, GOFAI C
Entonces, la versión C/C++ de la IA, la primera en llegar a un ambiente productivo, mi querido motor GOFAI, nació sobre cenizas de PHP. Ejecuta 29 algoritmos de análisis sobre miles de posiciones en nanosegundos, y funciona así:
- Dada una posición del tablero y un conjunto de dados.
- Calcular un estado
- Obtener cada movimiento posible.
- Analizar cada movimiento y darle una puntuación.
- Seleccionar la 'mejor' puntuación.
Aquí hay un diagrama del proceso.
Está compuesto por cuatro funciones principales:
- Obtener Acciones (Calcular Movimientos Válidos):
Dada una Posición del Tablero y una tirada de dados, calcula cada movimiento válido.
Los movimientos válidos pueden ir de 0 a decenas de miles.
En cada lenguaje en que he escrito esto, he tomado un enfoque recursivo innecesario que hace el código tan difícil de depurar, pero es tan hermoso. Tiene un par de cientos de líneas de código pero me tomó semanas escribirlo, y luego más semanas traducirlo a C.
- Obtener Estado (Calcular Estado del Tablero):
Dada una Posición del Tablero, calcula un estado semántico, son bastante autoexplicativos:
- Inicio
- Medio Juego
- Carrera sin Esperanza
- Carrera con Esperanza
- Final del Juego
- Entrando a Casa
-
Analizar Movimiento (Calcular Puntuaciones para una Posición):
Este es por mucho el algoritmo más extenso de todos. Analiza las características del tablero, cada una devolviendo una puntuación, y luego, basándose en el estado calculado antes, aplica factores a ellas, para que puedas dar importancia a diferentes aspectos del análisis según el estado del juego.
La IA comenzó con 8 algoritmos y terminó con 29, una muestra:
- Altura de Columnas
- Riesgo de Ser Capturado
- Riesgo de Ser Atrapado
- Fuerza del Tablero Interior
- Pivotes de Escape
- Fichas en la Barra
- Fichas Seguras
Muchos de estos algoritmos eran muy básicos al principio o simplemente no existían.
Con el tiempo trabajé en ellos, añadiendo características y afinando factores.
-
Seleccionar Acción (Seleccionar el "Mejor" Movimiento):
Este algoritmo es relativamente trivial si solo quieres la puntuación más alta (como hace el Nivel Avanzado).
Para Nivel Normal y Fácil, selecciona un movimiento al azar entre una lista de mejores acciones; el tamaño de ella (o su tolerancia a movimientos pobres) está dado por el nivel.
Gracias a C, este motor es increíblemente rápido, así que siempre lo usaré como la función principal de obtener acciones.
Fase 3, Afinación GOFAI C
Para depurar, diagnosticar y afinar este motor, tuve que construir muchas herramientas para monitorear el proceso de toma de decisiones. A diferencia de la Red Neuronal, cada decisión aquí es auditable, así que al menos tenías eso.
El proceso fue divertido pero dolorosamente lento. Jugué mucho contra la CPU, y cada vez que veía un movimiento pobre, venía a estas herramientas a verificar qué salió mal. A veces eso me enviaba por un camino de arreglar un algoritmo, afinar un factor, o simplemente construir un nuevo modelo de análisis. A veces, y esto era hermoso, me llevaba a reconsiderar mis Estrategias de Abak Evolution.
Con el tiempo, tenía una IA bastante sólida, pero perfeccionarla más se estaba volviendo cada vez más difícil. Había tantas líneas de código, tantos escenarios, operaciones tan masivas, que depurar a nivel de código era una tarea pesada, y afinar factores manualmente no daba resultados.
Fase 4, Desesperación
Pero quería más porque yo juego Abak, y necesitaba un jugador sólido para divertirme, y no había muchos humanos que lo jugaran en ese momento (e incluso mientras escribo esto).
Y este enfoque tiene muchas desventajas:
- Calcula el estado del tablero dada su posición actual, y ese estado se usa para cambiar los factores de los algoritmos de análisis para cada acción válida. Esa acción, sin embargo, podría haber alterado el estado, pero el motor no toma eso en cuenta.
- El ajuste manual de factores necesitaba una cantidad tremenda de tiempo. Tiempos divertidos, pero toneladas igualmente.
- El estado es brutalmente difícil de calcular, dado el número de escenarios posibles. Siempre ha sido un algoritmo imperfecto.
- La equidad del juego es imposible de calcular con precisión, porque este motor tiene un sistema de puntuación arbitrario para cada algoritmo de análisis, y la puntuación final no refleja una probabilidad de ganar, solo funciona como una puntuación comparable entre diferentes posiciones del tablero. Se puede decir que tiene un valor relativo en vez de uno absoluto.
Fase 5, El Despertar
Y entonces, un día, en 2018, Google venció al Campeón de GO con su Red Neuronal AlphaGo, y hubo tanto revuelo, y nuevas increíbles bibliotecas de Machine Learning de código abierto se volvieron disponibles, y estaban usando GPUs domésticas para acelerar el proceso de entrenamiento.
Por supuesto, ya sabía un poco sobre Redes Neuronales, pero nunca había construido una, y honestamente, las veía como una tarea más allá de mis capacidades.
Así que simplemente no pude resistir, y el nivel experto ya no corre en el motor GOFAI, salvo por la parte de obtener acciones.
Pero esta historia termina aquí.
Si leíste todo hasta aquí, estoy asombrado.
Este texto fue escrito con propósitos de SEO por el honesto Equipo de Abak Evolution,
Alias Samy Garib.