En esta partida reviviremos la lucha entre los incas y los españoles con piezas de ajedrez temáticas.
Veamos la batalla desde el lado español antes de que comience
Hagamos lo mismo con el lado inca
Como todos ya sabemos los españoles abren la batalla
Los incas se preparan, saben defenderse de la ofensiva española
Hacen retroceder al alfil
La lucha es feroz, después de una larga batalla tanto los incas como los españoles quedan acuartelados en una esquina
Tanto los españoles como los incas creen que pueden lograr la victoria
En este momento es difícil decir quién saldrá victorioso, las bajas son muchas pero pronto la batalla llegar a su fin
Los incas toman ventaja, la situación para los españoles se ve perdida
Los incas aún no celebran, un error les puede costar la batalla.
Los españoles lloran amargamente, la reina inca ha dado jaque y atacado la torre al mismo tiempo
Los incas celebran, ya sabían que los españoles no podían ganar pero aún no cantaban victoria. El empate todavía era posibilidad más después de este movimiento ya no lo es.
El rey se ha quedado solo, con lo que le queda de fuerza intenta evadir el ataque inca pero es en vano
Se ha quedado acorralado, ya no hay nada más que hacer, solo pronunciar las palabras finales…
Jaque mate.
Hay una gran variedad de tableros de ajedrez con distintos temas, los hay clásicos, con pequeñas modificaciones, los hay temáticos como en este caso donde las blancas son representadas por los conquistadores españoles y las negras son representadas por los incas.
Tras jugar una partida con este tablero me he dado cuenta de lo importante que es tener piezas de ajedrez bien definidas. El tablero que poseo es hermoso pero es algo más ornamental que funcional. A media partida ya con el cansancio mental a veces es difícil distinguir entre las distintas piezas.
Como pasa con todo si llegara a jugar suficientes juegos con este tablero muy probablemente debería dejar de costarme trabajo pero las pocas partidas que he jugado con este han sido más complicadas, más difíciles por el simple hecho de que se confunden las piezas
Supongamos que de repente tenemos que jugar y tenemos 15 segundos para decidir, independientemente de si somos novatos o grandes maestros si tenemos poco tiempo estamos propensos a cometer errores. Sin embargo si tuviéramos todo el tiempo que quisiéramos para pensar la jugada, probablemente no haríamos lo mismo. Esto es similar al problema del horizonte que tienen los algoritmos del ajedrez.
A diferencia de las computadoras, si tuviéramos más tiempo no necesariamente jugaremos mejor, esto debido a la presión del tiempo. Cuando una computadora tiene 15 segundos más para decidir no se pone a contemplar si es buena idea la jugada que hizo por tercera vez o: «demonios, se acabando el tiempo que hago» simplemente es más tiempo para el algoritmo.
Entonces para los humanos el problema no está en la parte lógica del ajedrez, sino en el preámbulo, el contexto, el lado psicológico el juego, para algunas personas añadir la variable del tiempo es demasiado y los convierte de buenos jugadores a pésimos.
Me ha tocado ver partidas de ajedrez cronometrado donde un jugador vence al otro por paliza, en contraste esos mismos jugadores tienen partidas más cortas donde el jugador derrotado suele ganar la mayoría incluso en tiempo menor que el reglamentado en una partida de ajedrez cronometrado.
En un movimiento las blancas pueden forzar un Zugzwang a las negras, el movimiento no es totalmente trivial sin embargo tampoco es muy complicado para un jugador experto o incluso alguien medianamente experimentado (1.Rh6!! y las negras están obligadas a empeorar su posición). La razón de esto tiene mucho que ver con las heuristicas y el horizonte que le asignemos a cada una.
El Zugzwang anterior causa problemas en Stockfish 6, uno de los motores de ajedrez mas fuertes(si no el mas fuerte) debido a una de sus estrategias llamada «Null move pruning» en pocas palabras lo que hace esto es corta muchas posibilidades del árbol de búsqueda para revisar jugadas mas interesantes, el problema principal con esto es que posiciones como estas fallan en ser detectadas. La explicación de esto es un poco mas complicada, para entenderla primero veamos que es un «Null move» o movida nula.
Una movida nula en los motores de ajedrez es dejar el tablero igual y ver si esto genera un cambio para revisar si esto altera una parte de la función de evaluación o seguir con ella deja las cosas igual. Algo tan sencillo tiene repercusiones importantes en las jugadas analizadas ya que podemos tener muchas movidas nulas, «Null move pruning» se dedica a cortar movidas nulas y al no ser analizadas esto mejora la eficiencia en un 99.99% de los casos conocidos.
Como ya habrán adivinado en el 0.01% restante se encuentran los Zugzwang, aquí esta otra posición donde Stockfish 6 falla en ver el mate:
1.Kg7 Bh2 2.Kg6 Bg1 3.Kf5 Bh2 4.Ke5 Bg1 5.Kd4 Bh2 6.Ke3 Bg1 7.Ke2 Bh2 8.Kf1 Bg1 9.Kxg1 Nh3+ 10.Kf1 Nf2 11.Ke2 Nd3 12.Bxe4# aunque siendo justos yo tampoco lo encontre y tuve que revisar la respuesta
Hay que mencionar que no solo Stockfish tiene este tipo de fallas por ejemplo, si le ponemos esta posición a Komodo 4:
No puede encontrar el mate(cabe notar que esto ya fue arreglado en una versión posterior) errores de este estilo los podemos encontrar en todos los motores de ajedrez excepto en los «Mate Finder»(Programas para encontrar jaque mates) que están hechos precisamente para evitar que se les escape estas jugadas. Pero a gran costo de elo en el resto de las posiciones. Para dar un ultimo ejemplo veamos la siguiente jugada:
Dejando de lado la probabilidad de que nos toque un juego así(0%) la posición es interesante debido a que muchos motores fallan en detectar el zugzwang y la manera de ganar la partida(1. h3 gana, 1. h4 empata) para quien quiera ver el desenlace ponga esta posición en Houdini 15a que ve el mate correctamente, esta posición también es muy interesante debido a que otros motores como Toga II consideran que h4 da la victoria cuando en realidad es un empate. Cada motor tiene sus pequeñas fallas y como es de esperarse en cuanto se descubren se tienden a arreglar. Lo interesante de los zugzwang es que siguen siendo un gran problema para los motores de ajedrez aun después de mucho tiempo que se detecto el problema.
¿Cuantas jugadas de peones valdría la pena analizar? Cualquiera que haya jugado mas de 10 o 15 juegos sabría que la respuesta es 0 ya que cualquier jugada que no sea mover la reina nos lleva a perderla sin ganar nada a cambio.
Las heuristicas en el ajedrez funcionan asignando distintos horizontes de búsqueda dependiendo al conjunto de reglas del motor de ajedrez, entonces el problema del horizonte se vuelve un poco mas complejo, ya que no tenemos un horizonte si no muchos.
Por supuesto que esto es preferible, ya que si no solo seria una fuerza bruta recortada a profundidad X donde X seria el numero máximo de jugadas a buscar.
Lo que hay que notar en este juego aparentemente sin gracia es que tras la primera jugada es solo 1 de los posibles 400 que pudo ocurrir, tras solo 4 jugadas este numero se dispara a mas de 288 mil millones entonces resolverlo revisando todas las jugadas es imposible(para el que este interesado en como se haría esto la manera se llama BFS) entonces necesitamos recurrir a una heurística(en pocas palabras una manera de revisar el árbol sin checar todas las posibilidades) uno se preguntaría ¿Como? Esa es la parte importante.
Para decidir que partes buscar y cuales no a cada pieza se le asigna un valor numérico donde por ejemplo el rey vale infinito(o un numero arbitrariamente grande) la dama vale 9, un peón vale 1(tabla completa aquí) y como la pieza con menor valor es el peón y la posición también es importante se tiene una medida fraccionaria que vale centésimas(o milésimas de peón) en base a esto se toman las decisiones.
La razón de los valores numéricos es que las computadoras solo manejan 0 y 1, así que para poder calcular cualquier cosa(quien va ganando, la siguiente jugada etc…) se necesita una medida que las computadoras puedan entender.
El valor de las piezas en cada motor de ajedrez suele ser el mismo(aunque nada nos impide crear un motor con valores distintos) debido a que son valores que funcionan. Donde suele variar es a los valores que se le da a una posición, a las combinaciones de piezas etc.
Existen bastantes algoritmos que se ocupan en el ajedrez para determinar que jugadas vale la pena explorar (el código de stockfish es abierto para el que quiera ver los detalles algorítmicos de como funciona un motor de ajedrez) y cuales no, en base a un conjunto de reglas se define una función de evaluación y en base a esa función de evaluación se decide cuales ramas del árbol(o sea posibles jugadas) analizar y la jugada que se mueve al final es la que nos haya regresado mejor puntuación en la función de evaluación.
En general los distintos niveles de un motor de ajedrez es decidir que reglas se ocupan para la función de evaluación, donde el nivel 0(o mono en algunas) es no ocupar ninguna regla y tirar al azar, y el nivel máximo es ocupar todas las reglas. En base a esas reglas una computadora actual puede analizar millones de jugadas en pocos segundos.
En pocas palabras se podría decir que es similar a la fuerza bruta en el sentido de que se revisan millones de posibles jugadas, pero distinto en el hecho de que se tiene una idea de donde buscar.
Una analogía bastante tonta(y no 100% correcta) pero que deja claro el punto seria que la fuerza bruta es como tratar de escribir el quijote usando letras al azar, y usar una función de evaluación seria como ocupar palabras completas, una función de evaluación burda es como ocupar palabras de muchos idiomas(por ejemplo árabe, chino, ingles, español) una función de evaluación buena seria solo ocupar palabras de el español y una función de evaluación muy buena seria solo ocupar palabras del español que se ocupan en el quijote. Claramente es posible escribir el quijote completo con cualquiera de estas 3 estrategias, sin embargo bajo estas restricciones es obvio porque una buena función de evaluación tardaría mucho menos que teclear letras al azar.
Escribir buenas reglas para la función de evaluación es una tarea bastante difícil y ahí es donde difieren los distintos motores de ajedrez, cada motor de ajedrez tiene un conjunto de reglas distintas(puede que algunas coincidan pero no todas), por supuesto que también hay otros factores mas relacionados con la eficiencia en la programación y las distintas maneras en la que se puede calcular la función, como se guarden las posibles jugadas entre muchos otros.
Pero lo importante(y aunque sea una simplificación algo inexacta) es que cada pieza tiene un valor, y en base a esos valores se crea una función que ocupa unas reglas, se toma el mejor valor de la función y esa es la jugada que se mueve.
Esta es solo la idea principal de como funciona un motor de ajedrez sin tablas syzygy ni nalimov ni explicar el problema del horizonte ni las técnicas especificas para calcular cuales reglas sirven y cuales no. Ya abra mas entradas sobre eso.
También hay que notar que esto solo explica como funciona un buen motor de ajedrez bajo las nociones estándar, también es posible crear motores de ajedrez sin funciones de evaluación y solo ocupando reglas o motores de ajedrez que su objetivo sea perder todas las piezas(para jugar losing chess por ejemplo) pero su funcionamiento es muy parecido. O algún motor de ajedrez que funcione radicalmente distinto, sin embargo esos actualmente son la excepción y no la regla.
No hace falta decir que no es muy divertido jugar seguido contra un oponente que te hace pedazos cada vez que juegas. Pero probar de vez en cuando no esta tan mal.
Se tienen muchas mas posibles movidas que en esta otra
Pero lo que nos importa es la cantidad promedio de ramificación promedio entre los juegos empezando desde el inicio.
Aclaro que todos los números mencionados son aproximados si quieren saberlo con exactitud les dejo unas referencias.