La aventura de crear desde cero un programa para jugar al ajedrez, explicada paso a paso



Sebastian Lage tiene este estupendo vídeo acerca de Chess AI*, que es un resumen en 30 minutos sobre la creación de un programa que juega al ajedrez desde cero. Está escrito en C# en el motor de Unity (el código está en Github) y está todo tan bien explicado que no debe ser difícil adaptarlo a otros lenguajes. Se puede descargar para jugar y verlo en acción. No lo hace mal, aunque parece un tanto glotón.

Todo resulta sumamente didáctico: los primeros minutos del vídeo explican cómo representar el tablero y las piezas con números y variables, luego gráficamente y también cómo generar los movimientos, turnos, etcétera. Luego analiza cómo optimizarlo y probarlo todo, al principio con movimientos aleatorios y luego metódicamente. El resto de reglas del juego se van añadiendo poco a poco, incluyendo los avances y capturas de los peones, el enroque y sus excepciones, la captura al paso y demás (quizá la de las tablas tras 50 movimientos sin capturas ni avances de peón no esté incluida).


Un detalle interesante es cómo utiliza posiciones de prueba conocidas (lo que se suele llamar un testbed) para encontrar bugs y otros problemas. Otro es la técnica de contabilizar metódicamente todas las posibilidades (por ejemplo, los movimientos generados y posiciones evaluadas) para confirmar los datos en las pruebas. Hay que tener paciencia: como se suele decir con el 10% del código el programa hará el 90% de lo que se supone que tiene que hacer pero se necesitará el 90% del tiempo para depurar el otro 10%.

Poco a poco la cosa va tomando forma: se añade la función de evaluación de cada posición, que asigna un valor numérico como «bueno o malo» a cada posible movimiento, las tablas de transposiciones (posiciones repetidas) para ahorrar tiempo y se comprueban los finales utilizando posiciones del Chess Programming Wiki. (Se utiliza el formato PGN, el estándar más común.) Son interesantes las explicaciones sobre cómo resolvió algunos de los problemas a los que se enfrentó, que suelen pasar por entender el problema, idear la solución y luego una o dos líneas de código.

También se añade una técnica para mejorar las aperturas y que no sean tan robóticas: incluir un «mapa de bonus» a cada casilla para cada tipo de pieza de modo que los caballos tiendan a ir al centro, el rey a retirarse a las esquinas y cosas así. A eso se unen 8.000 posiciones de los libros de aperturas, procedentes de grandes maestros, para jugarlas aleatoriamente –cuando es posible– y darle un poco más de variedad. El resto son disquisiciones sobre los algoritmos minimax, la poda alfa-beta y sus complicaciones, entre ellas la dificultad de calcular el tiempo de evaluación y hasta qué profundidad evaluar. La madriguera del conejo, vamos.

Como suele suceder, lo interesante en este caso no es lo bien o mal que juega el programa, sino el viaje de su creación. Se pueden ver muchas ideas y conceptos que sirven para otro tipo de desarrollos y proyectos, aparte de lo entretenido que resulta. Si lo descargas y pruebas descubrirás que Chess AI resulta bastante implacable, aunque no es inmortal, ni tiene el nivel de Stockfish, claro. Se le puede ganar por su querencia a no proteger bien su rey y a no entender en los finales las estructuras de peones. Pero si antes de llegar a ese punto te dejas alguna pieza… date por perdido.

_____ * A pesar de llamarse Chess AI esta «inteligencia artificial para jugar al ajedrez» no utiliza aprendizaje automático, redes neuronales ni otras ideas similares que tan de moda están hoy en día. Es todo puro algoritmo directo aplicado a una única función, gracias a la potencia de cálculo de los equipos actuales. Lo mismo, pero diferente.




180 visualizaciones0 comentarios

Entradas Recientes

Ver todo