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.
Relacionado:
- La propuesta de Kramnik del «ajedrez sin enroque»
- Un IBM 704 jugando al ajedrez en 1958 contra Alex Bernstein
- El wiki de la programación de ajedrez
- La evolución de las aperturas en el ajedrez a lo largo de 170 años
- Todas las aperturas de ajedrez, visualizadas en una imagen
- Contando todas las posibles aperturas en ajedrez
- Ordenadores que juegan al ajedrez en el Museo de las Computadoras
- Tal vez, el mejor programa jamás escrito: el ajedrez en 1 KB del ZX-81
- Nuevo récord de Ajedrez: mate en 290
- Kasparov vs Deep Blue
- El juego de las Damas ya está matemáticamente resuelto (y es tablas)
- Ordenadores y matemáticas
- Un precioso robot de madera construido con Arduino
- Square Off: el ajedrez como siempre lo habíamos soñado
- Un ajedrez mecánico para jugar a distancia con otras personas
- Robots que acojonan a Grandes Maestros del ajedrez
- Los análisis computerizados del Carlssen-Caruana
- Las aperturas de ajedrez a modo de diagramas de flujo
- Batalla ajedrecística a muerte: Stockfish 8 vs. Chess 1K en un ZX‑81
- El problema de hace 400 años que los ordenadores no pueden resolver
- Otro problema de ajedrez capaz de «derrotar» a los ordenadores
- Matemáticas y ajedrez, máquinas y algoritmos sobre el tablero
- El reto de las damas de ajedrez y el millón de dólares
- Estudios sobre aprendizaje automático en las damas (allá por 1959)
- Juegan blancas y mate en 549
- El ajedrez de la Thinking Machine 6 permite ver qué se está calculando
- Hordas vs. hordas en ajedrez poco convencional
- El rey de la noche: historias de ajedrez en Nueva York
- Nanochess, Picochess y otros ajedreces minimalistas