- No existe una posición con más movimientos posibles que la posición de ajedrez de 218 movimientos presentada por Nenad Petrović en 1964
- Como explorar todas las posiciones es imposible en la práctica, se demostró el límite usando optimización matemática y técnicas de modelado por computadora
- Se redujo eficazmente el espacio de búsqueda eliminando piezas innecesarias, permitiendo colocación parcial de piezas y simplificando el enroque, entre otras medidas
- Finalmente, se confirmó con la herramienta de optimización Gurobi que 218 es el máximo, y además se verificaron otros registros, como 144 movimientos (sin promociones)
- Gracias a esta investigación, los desarrolladores de motores de ajedrez y de compresión pueden eliminar la incertidumbre sobre el límite máximo de movimientos
Introducción: la controversia sobre la posición de ajedrez de 218 movimientos
Desde que el gran maestro de composición ajedrecística Nenad Petrović publicó en 1964 una posición con 218 movimientos posibles, han continuado los intentos por superar ese récord. El autor, como científico de la computación, buscó cerrar definitivamente esta pregunta analizando posiciones con ayuda de computadoras. Aunque existen aproximadamente 4.8 × 10^44 posiciones de ajedrez alcanzables, una exploración de tal magnitud es irrealizable en la práctica.
Introducción de la optimización matemática
Minimización de piezas y combinaciones innecesarias
- Los casos en que las piezas negras aumentan adicionalmente la cantidad de movimientos son limitados
- Por ejemplo, cuando permiten que un peón blanco capture o cuando evitan una situación de jaque al rey rival
- La mayoría de las piezas negras pueden eliminarse sin afectar el número máximo de movimientos
- Mientras la cantidad de piezas lo permita, es posible reemplazar piezas negras por piezas más débiles o ajustar su colocación bajo ciertas restricciones (como clavadas)
- En el caso de las piezas blancas ocurre lo contrario: si en una posición óptima se reemplazan todas por piezas fuertes como la dama, puede surgir una posición ilegal, por lo que se requieren ajustes finos
Situaciones de jaque y límites en la cantidad de movimientos
- No es necesario considerar posiciones en las que el rey negro esté en jaque, porque no son posiciones legales
- Cuando el rey blanco está en jaque, su movilidad se restringe severamente (máximo 120 movimientos), por lo que es imposible llegar a 218
- Por lo tanto, la búsqueda puede limitarse únicamente a posiciones sin jaque
Colocación parcial de piezas y modelado matemático
Para reducir la complejidad combinatoria, se adoptó un modelo con colocación parcial (fractional) de piezas, movimientos, y una relajación de algunas reglas del ajedrez
- Por ejemplo, una pieza puede estar con 27.3% de probabilidad en e4 y con 72.7% en otra casilla
- De esta forma, se implementó como un problema de programación lineal entera (ILP, Integer Linear Programming) en herramientas modernas de optimización como Gurobi
- Al principio se toparon con límites de memoria y tiempo (agotamiento de memoria tras unas 55 mil segundos)
- Para simplificar el espacio de búsqueda, se aplicaron medidas adicionales como simplificar las reglas de enroque, ignorar el jaque, ignorar las clavadas y simplificar la condición de captura al paso
Optimización y conclusión
Finalmente, tras mejorar el modelo con restricciones auxiliares que bloqueaban la exploración de combinaciones innecesarias, la optimización se completó con el programa Gurobi
- La cota superior se fue reduciendo de 305 movimientos → 271.67 movimientos → 218 movimientos
- Se confirmó que solo 12 posiciones representativas con 218 movimientos posibles son alcanzables
- Se demostró que estas posiciones son legales y pueden alcanzarse sin problemas mediante partidas de prueba (proof game)
Además, también se verificó un máximo de 144 movimientos sin promociones, 288 movimientos en posiciones ilegales, y 271 movimientos en posiciones legales pero inalcanzables
Resultados e importancia
- Gracias a este resultado, los desarrolladores de motores de ajedrez y los investigadores de algoritmos de compresión pueden tener la certeza de que un límite de 256 movimientos es suficiente para el diseño de memoria y otros aspectos
- Quedó demostrado matemáticamente que no existe ninguna posición con 218 o más movimientos posibles por una vía legal
Resumen del FAQ
- Una partida de ajedrez puede durar más que 218 movimientos, pero este estudio trata el máximo de opciones posibles en un solo turno
- Si algunas posiciones parecen inalcanzables, se menciona que puede haber varias rutas, por ejemplo cuando la jugada previa termina en captura
- Este método de investigación aplicó una técnica de oráculo matemático para descartar rápidamente combinaciones absolutamente imposibles dentro de un espacio combinatorio enorme
- También se publicaron el código utilizado y la validez matemática de la evidencia obtenida para reforzar la confiabilidad
Tareas futuras y propuestas de investigación adicional
Aplicando esta técnica, sería posible abordar otros problemas de ajedrez como el "máximo número de capturas", "máximo número de tablas por ahogado", "máximo número de jaques", "máximo número de jaque mate" o "máximo número de mates en 2". Sin embargo, en algunos casos podrían requerirse algoritmos de optimización creativos adicionales.
Conclusión
- 218 es el máximo número oficial de movimientos posibles en un turno dentro de una posición de ajedrez
- En términos prácticos, el software de ajedrez y los investigadores pueden diseñar sus estructuras en torno a 218 (o 256)
- El código relacionado y los resultados de optimización están publicados en GitHub
Referencia
- Se incluyen enlaces a partidas de prueba y posiciones como la posición de 218 movimientos de Nenad Petrović y la de 144 movimientos de Jenő Bán (sin promociones)
- Para más detalles y el código, se puede consultar el repositorio de GitHub
1 comentarios
Comentarios de Hacker News
En Lichess, el nivel de juego en variantes como 960 o Crazyhouse es muchísimo más alto que en Chess.com
Literalmente es absurdamente bueno. Recomiendo donar si pueden
Lo interesante es que los solucionadores de programación lineal entera mixta (MILP) ya soportan este tipo de manejo. En términos técnicos se llama
row generation, y suele usarse cuando el problema se escribe en forma matricial, donde las filas son restricciones y las columnas son variablesAgregar nuevas filas de forma (dinámica) es equivalente a introducir restricciones solo cuando se violan
Este enfoque se usa sobre todo para resolver el problema del viajante (
Traveling Salesman Problem)(Por cierto, en Wikipedia existe Column generation, pero no
row generation)Relajar u omitir reglas de ajedrez también influyó en la elección de variables. Antes de entrar al modelado matemático, probé cosas como
lazy constraints, pero no hubo una mejora significativa en velocidad. Por ejemplo, solo con no considerar si el rey blanco está en jaque ya se simplificaban muchas cosaslazy constraints(explicación relacionada)(Suponiendo para esta discusión que Gurobi no tiene bugs y que tampoco hay bugs en la definición e implementación del problema por parte del autor)
Me pregunto si existe la posibilidad de que Gurobi se haya quedado atorado en un óptimo local, o si realmente probó que se trata del óptimo global
Si Gurobi y mi código funcionaron como se pretendía, y no hubo errores lógicos al simplificar el modelo de ajedrez, entonces lo que obtuve prueba que "el máximo número posible de jugadas legales entre todas las posiciones de ajedrez alcanzables desde la posición inicial por una secuencia legal de jugadas tiene cota inferior y superior de 218". Es decir, Gurobi demostró mediante cotas sobre todo el espacio de búsqueda que "no existe un caso mejor que este"
Desde la perspectiva computacional, importa más el espacio total del problema. Porque hay que "calcularlas" todas antes de determinar si son legales o no. No existe un método sencillo para iterar solo sobre posiciones legales
Una persona conocida me avisó que mi artículo se estaba discutiendo aquí
Perdón por haber elegido un título poco claro; espero que ahora quede más claro. Gracias por los comentarios y por las palabras amables
Si tienen preguntas sobre probar hechos similares en ajedrez, también puedo responderlas ^^
Gracias
Tobi
Actualización: el artículo dice que hay aproximadamente 8.7x10^45 posiciones de ajedrez alcanzables, y https://github.com/lechmazur/ChessCounter usa esa cifra como cota superior
(Eso equivale a unos 153 bits)
log2(4.8x10^44)da 149 bitsPero para poder decodificarlo eficientemente necesitas 153 bits, usando el techo de
log2del número recomendado por el proyecto ChessPositionRanking (8726713169886222032347729969256422370854716254). ChessCounter no proporciona código de decodificación eficienteLo mismo pasa con torres/reinas/caballos, pero como en ajedrez pueden haber sido capturados, se necesitan 65 estados posibles para cada una de esas 5 piezas
Los alfiles solo pueden ir en la mitad de esas casillas, así que 33 estados cada uno
Los peones tienen 4 promociones posibles, pueden haber sido capturados, y según el caso pueden estar en unas 20 a 30 posiciones distintas; en total, unos 290 estados por peón
Con eso, para un color se necesitan unos 112 bits para representar el estado del tablero; redondeando, 224 bits para ambos lados
En passant y las restricciones de enroque (por ejemplo, imposibilidad de enrocar) no requieren bits extra si redondeas, porque solo añaden algunos estados más a cada pieza
Probablemente esta sea la forma más comprimida de una representación de tablero de longitud fija
En una representación dispersa, como siempre existen ambos reyes, puedes representar las piezas vivas con un número decimal de n dígitos y n+2 números de 64 bits para sus posiciones, además de un poco de información extra para enroque, en passant, etc. Si en promedio ha desaparecido la mitad de las piezas, eso da aproximadamente 180 bits para representar el estado del tablero
El historial de jugadas también requiere unos 10 bits por jugada (una pareja blanco/negro; un
plyson 5 bits), así que alcanzaría para unas 18 jugadas. Eso es algo más corto que la mitad de la duración media de una partida de ajedrezPara comprimir más, parecería necesario implementar un diccionario gigantesco
Así que una codificación de longitud fija de todo el tablero sería 644 = 256 bits = 32 bytes
O bien, si haces una representación de longitud variable solo para las piezas, puedes usar 6 bits por índice de casilla entre las 64, así que serían cantidad10 bits
Por ejemplo, la posición inicial sería 32*10 = 320 bits = 40 bytes
5.68e50 en "general" es la verdadera cota superior y permite todas las promociones posibles
Ese peón solo tiene una jugada posible (capturar al caballo que está al lado). Si ese peón no estuviera, cuatro reinas blancas y un caballo podrían entrar a b2. Pero en realidad esas jugadas no pueden existir porque el rey negro ya estaría en jaque mate
Resulta tentador poner la reina de e5 en otro lugar para que no sea jaque mate inmediato, y al mismo tiempo abrir más la casilla b2
Posdata: parece que ese peón debe sobrevivir ahí para evitar el ahogado
Si fuera el turno de negras, el rey también estaría inmovilizado por la reina blanca en e5 (está clavado), así que tampoco podría moverse. Si no estuviera clavado, podría tener 4 movimientos. También serían posibles las subpromociones
La posición es con White to move. Incluso si el peón de b2 no clavara al rey por la reina blanca, el peón negro tampoco podría moverse
El peón de b2 es absolutamente necesario para proteger al rey negro del jaque. Si no estuviera, la posición en sí no sería legal
Revisé todo con muchísimo cuidado, así que pueden estar tranquilos: fue imposible construir algo con más de 218 jugadas para blancas. Aun así, me sorprende y me alegra que tanta gente se interesara en mi artículo, jaja ^^
Parece que podrías aumentar la cantidad de jugadas cambiando uno de los peones negros por un caballo blanco, pero ambos caballos ya existen y todos los peones ya fueron promocionados, así que no es posible. (Si cambias ambos peones, entonces negras no podrían haber llegado a este estado en el turno anterior)
¿Leíste el artículo completo?
No es 271, sino 271.666... :) Ese valor sale de un modelo en el que todas las decisiones (0 o 1) se relajan a valores continuos (0.0~1.0 y los intermedios). O sea, puedes asumir que una pieza existe en un 0.23, por ejemplo. Y la posibilidad de hacer cierta jugada también se trata como algo tipo 0.843
Con esa clase de "magia negra", el cálculo se vuelve mucho más rápido y puede arrojar más jugadas de las que realmente existen
Entonces esta técnica sirve para descartar rápidamente subespacios particularmente malos. Sin técnicas así, sería imposible revisar exhaustivamente todo el espacio de búsqueda
Por cierto, creo que entendiste mal eso de que los peones negros están en sus posiciones iniciales. En realidad, el peón negro avanzó hasta el lado opuesto del tablero (el campo blanco)