Showing posts sorted by relevance for query patrones. Sort by date Show all posts
Showing posts sorted by relevance for query patrones. Sort by date Show all posts

Friday, December 07, 2012

Patrones en Ajedrez (III)



Mi idea sobre los patrones en ajedrez parece que está dando resultados. Ya he hablado de esto aquí, aquí y aquí. Por mucho tiempo he estado atorado con la manera de representar posiciones y creo que finalmente este asunto está relativamente bien resuelto. Me parece que estamos ante una posible caracterización de las posiciones en ajedrez.

Consideremos el patrón inicial con el que he comenzado toda esta discusión:



Patrón inicial ¿Cómo caracterizarlo?

El problema a resolver es cómo caracterizar este patrón de manera que pueda ser leído por una computadora para después pedirle que busque similitudes, es decir, patrones similares. Una opción sería crear un lenguaje de descripción, como el que permiten las matemáticas, por ejemplo, en el caso de la geometría analítica, en donde la función f(x) = mx + b, que identifica a una línea recta. En lugar de esto, ¿por qué no representar el patrón sobre qué piezas atacan, qué piezas defienden, qué casillas son importantes y dónde deben estar las piezas? Por ello, podemos decir, “el alfil de c2 ataca el peón de h7” y punto final. Este es un enunciado del patrón. Para este particular ejemplo tenemos el patrón definido de la siguiente manera:

  • Dama blanca en h6
  • Alfil blanco (de casillas blancas) atacando el punto h7. De hecho, con esta descripción no tenemos que indicar en dónde está el alfil, si en b1, c2, d3, etcétera.
  • Rey negro en g8
  • Peón negor en f7, defendido solamente por el rey.
  • Puede haber un peón negro opcionalmente en h7 pero éste solamente debe estar defendido por el rey.
  • Solución del patrón: Juegan las blancas y ganan con la combinación 1. Axh7+ Rh8 2. Ag6+ Rg8 3. Dh7+ Rf8 4. Df7 mate.

Hemos caracterizado simplemente la posición en términos de ataques y defensas. Ahora se trata de que esta descripción sea pasada a un lenguaje de programación, o a un mecanismo que permita guardar el patrón y así buscar similitudes.

Para ello hay las siguientes alternativas:

  • Escribir un programa que permita, por una parte, crear los patrones que se necesitan. Una vez hecho esto, escribir el código que busque las descripciones de estos patrones en las partidas de ajedrez o en las posiciones que se deseén. Es claro que como el sistema debe buscar si existen los patrones correspondientes, el sistema debe, en cada partida analizada, buscar todos los ataques y defensas que se encuentren en cada posición de la partida y entonces comparar contra los patrones definidos. Si el patrón existe, entonces el sistema debe poder guardar o desplegar la información sobre en qué momento de la partida se encontraron uno o más patrones.



Esquema para un programa que busque patrones


Ambas posibilidades son factibles. Si se desea crear un programa que haga toda la tarea, lo cual da más versatilidad porque el programador puede añadir lo que considere necesario, hay que decidir en qué lenguaje escribirlo. Hay dos opciones:

  • Lenguajes de cuarta generación imperativos (Pascal, C)
  • lenguajes lógicos y funcionales (Prolog)

La primera opción tiene una ventaja: ya hay mucho código fuente de terceros para manejar posiciones de ajedrez, que leen partidas en formato PGN, entre multitud de tareas que realizan. La segunda opción tiene la virtud de poder expresar de manera muy sencilla predicados en Prolog, claúsulas de Horn, para expresar posiciones. Tal vez un esquema híbrido sea una buena opción, pero por el momento esto son especulaciones.

Usar CQL tiene una virtud importante: es un sistema probado. Entonces habría que escribir quizás un programa que permitiese a cualquier ajedrecista crear los patrones de interés y que como resultado se generara una consulta de búsqueda en CQL. Esto parece una idea interesante pues implica menos trabajo de programación.

Cabe decir que Zobrist y Carlson, a principios de los años setentas del siglo pasado, escribieron un artículo llamado An Advice Taking Chess Computer (Scientific American, circa 1972), en donde crean "snapshots" de posiciones. ¿Le suena familiar? Sí, hablamos de los patrones. Otro artículo del propio Zobrist y Carlson, llamado The USC Chess Program, describe el lenguaje que usaron, el cual es obsoleto y parece una versión (in-house) de lo que sería un antecesor de un lenguaje basado en la lógica. Ese lenguaje de programación ya no existe, pero los "snapshots" de las posiciones podrían bien ser usados ahora. Ambos artículos están a disposición de quien los quiera leer.

Otro esfuerzo en este sentido lo hizo Chris Donninger, autor de Hydra, un programa que nunca perdió contra ningún gran maestro en partida oficial (aunque el proyecto ya ha terminado), el cual anteriormente escribió el programa Nimzo, el cual lo dotó de un lenguaje de descripción de posiciones llamado Che, el cual derivó en Che++. En este caso, un interesante artículo mencionando las ventajas de este enfoque puede hallarse en el ICCA Journal, de diciembre de 1996, titulado A Graphical Language for Expressing Chess Knowledge (también disponible a quien le interese).

Finalmente otro artículo que busca estas definiciones de patrones, los cuales llaman chunks, como lo definiría Adrian de Groot en su libro clásico sobre cómo los jugadores perciben el tablero de ajedrez, Thought and choice in chess, (disponible en muchos sitios web), es el escrito por Michael George y Jonathan Schaeffer, de la Universidad de Alberta, llamado Chunking for Experience, en donde plantea un software de ajedrez llamado MACH (a Master Advisor for CHess), que utiliza patrones para encontrar buenas jugadas en el tablero. (Este documento también está disponible a quien le interese).

Todo esto suena muy bien, pero ¿de dónde saldrán los patrones? Para ello habría que hacerse de un jugador fuerte, el cual pudiese darnos la información de los patrones más típicos. Sin embargo, eso no es necesario realmente si consideramos que tenemos abundante literatura ajedrecística en el tema de la táctica. En ese sentido, existen muchísimos libros que hablan sobre los temas más típicos en la táctica: doble ataque, clavada, diversión, subpromoción, etcétera.

Dos libros llaman la atención. Chess Tactics Art, de Max Blokh y la Antología del Medio Juego, publicada por el Chess Informant. En este último libro, los autores del mismo han hecho un esfuerzo por crear una clasificación para las combinaciones en el medio juego, incluyendo los temas clásicos de la táctica. El problema es que no se dan ejemplos de los patrones. Simplemente vienen las posiciones clasificadas, lo cual se ha hecho "a mano:", es decir, sin ayuda de computadora alguna.


La clasificación de las combinaciones de acuerdo con Chess Informant

El libro de Blokh es aún mejor. Contiene unos 1500 ejercicios y antes de cada capítulo pone los patrones más parecidos. He aquí un ejemplo de esto:


Los patrones de táctica de M. Blokh

Con esto en mano podemos caracterizar muchísimos patrones comunes. En la medida del tiempo habrá más patrones que podrán ser incorporados, basados en nueva información o en situaciones que los libros mencionados no contienen. El punto aquí es que hay una enorme cantidad de patrones para iniciar el trabajo.

Con esta clasificación podríamos hacer que:

  • Que los programas no tengan que analizar las consecuencias de todas las jugadas si hay un patrón existente, jugando así más humanamente el ajedrez.
  • Producir libros de ejercicios tácticos buscando los patrones de los diferentes temas en las bases de partidas (hacer libros de ejercicios tácticos con este esquema sería rápido y trivial).
  • Estudiar posiciones en base a los temas tácticos que se deseé.

¿Qué sigue?

Básicamente es el momento de escribir código y probar estas ideas. En un futuro artículo hablaré de lo que he encontrado.

___

A quien le interesen los artículos mencionados, pueden pedírmelos a mi correo: morsa@la-morsa.com y los recibirán sin costo alguno a la brevedad.

Wednesday, March 29, 2017

Bosquejo de un lenguaje de patrones de ajedrez



Ya antes en este blog (busquen por "patrones de ajedrez") he hablado sobre un lenguaje para describir posiciones de ajedrez, el cual es lo suficientemente genérico para establecer patrones del juego. Después de varios meses de trabajar en esto, creo haber hallado un lenguaje de patrones que bien puede ser útil para expresar posiciones de ajedrez de forma que puedan usarse para cambiar incluso el paradigma de cómo los programas de ajedrez funcionan, quitando el cálculo bestial que hoy en día hacen por un enfoque más humano, basándose en que el ajedrez es un juego en donde intervienen patrones, sin lugar a dudas. De esta manera podrían construirse programas "más humanos".

Introducción al lenguaje de patrones

Definimos el ataque de una pieza a otra como:

Pi(P2)

donde P1 es la pieza del atacante y P2 es la pieza atacada. Si las piezas son del mismo color, hablamos de que P1 defiende a P2, pero si son de diferente color, P1 ataca a P2. Por ejemplo, A(ph7), lo cual significa que un alfil ataca a un peón negro en h7. Por convención las piezas blancas se ponen con su iniciales mayúsculas y las piezas negras con sus iniciales en minúscula.

También podemos decir: A(h7), lo que indica que el alfil blanco ataca la casilla h7. Cabe decir que no es necesario decir en qué casilla está el alfil del blanco. De hecho, en el ejemplo, el alfil podría estar en b1, c2, d3, e4, f5 o g6.

Podemos definir una pieza en una casilla en particular con la notación: Ad3, lo que indica que el alfil blanco está en la casilla d3. Nótese que en este caso no sabemos qué casillas ataca/defiende. Solamente sabemos su posición.

Se ha definido una instrucción: taboo(casilla), indicando que para el defensor, la "casilla" mencionada no está disponible. Por ejemplo, en la partida Carlsen - Karjakin, del Campeonato Mundial 2016 llevado a cabo en Nueva York a fines del año pasado, se llegó a esta posición:


Carlsen - Karjakin
Nueva York 2016
Juegan las blancas

El patrón de esta posición es D(h6), Tc8, T(f7), Ph5, rh7, pg7, taboo(g6). 1. Dh6+

El patrón no sólo describe la posición, sino que también se define al menos la primera jugada que debe hacerse (1. Dh6+). Esto podría ser una manera para hacer un programa en donde los patrones orientaran sobre cuáles son las mejores jugadas en lugar de hacer un cálculo de fuerza bruta.

Pero como ya indicamos antes en este mismo blog, tenemos que en la partida Popov - Novopashin, URSS 1979, se dio la siguiente posición:


Popov - Novopashin
URSS 1979
Juegan las blancas

Cuyo patrón es: D(h6), Tf8, Tb1, Ph4, rh7, pg7, taboo(g6). 1. Dh6+

Nótese que la instrucción taboo(g6) hace que la casilla g6 no esté disponible a las negras. Es intereante cómo los dos patrones se ven muy similares.

Otra idea interesante es la de los conectores lógicos. Un patrón en ajedrez consiste en definir las piezas en ciertas casillas o definiendo qué ataca o qué defiende. El patrón puede considerarse como un conjunto de instrucciones separadas por comas. Definimos a la "," como el AND lógico e introducimos el otro conector lógico, el OR, cuyo símbolo será ";" como en la mejor tradición del lenguaje Prolog. Sin embargo, en lugar de usar los símbolos, quien defina un patrón puede usar indistintamente "AND" o "," y "OR" o ";".

Por ejemplo, en la partida Pestalozzi - Duhm, Berna 1990, se llegó a  la siguiente posición:


Pestalozzi - Duhm, 
Berna 1990
Juegan la blancas

Aquí tenemos el sacrificio griego, el cual podría definirse como: A(h7), Cf3, Pe5, ph7, pg7, pf7, pe6, rg8 y añadiendo Dd1 OR Dg4. La primera jugada es 1. Axh7+.

Definiéndolo de esta manera, tenemos que el patrón buscado será:

A(h7), Cf3, Pe5, ph7, pg7, pf7, pe6, rg8, Dd1
o
A(h7), Cf3, Pe5, ph7, pg7, pf7, pe6, rg8, Dg4


Patrones posicionales

Un lenguaje de patrones debe poder no solamente lidiar con elementos tácticos. Debería tener la capacidad de definir patrones posicionales. Definimos estos a partir de su estructura de peones. Así, creamos dos instrucciones: structw(lista de peones) y structb(lista de peones). Por ejemplo, en Botvinnik - Donner, tenemos la siguiente posición:


Botvinnik - Donner
Amsterdam, 1963
Juegan las blancas

Su patrón puede expresarse como:

structw(a3, b4, e2, f2, g3, h2)
structb(a7, b6, e6, f7, g7, h7)
obtener el punto débil c6 (para las blancas)

Botvinnik logró la ventaja después de 14. Cd4, Axg2 15. Rxg2 Dc7 16. Db3 Tfc8 17. Tfc1 Db7+ 18. Df3 Cd5 19. e4 C5f6 20. b5! a6 21. Cc6, logrando quedarse con la casilla c6 y posteriormente llevándose el triunfo.

Los patrones posicionales son más difíciles de definir porque no hay un mecanismo directo para obtener la ventaja por métodos tácticos, pero a través de structw/b podemos definirlos. Esto es lo que en la literatura de ajesrez se denomina como "priyomes", que es una palabra rusa que se usa para representar algún tipo de maniobra o técnica típica. Por ejemplo, una técnica de un priyome defensivo es usar el rey, en los finales de torres, para atacar los peones enemigos. Sin embargo, los priyomes normalmente se usan para referirse a posiciones con cierta estructura de peones.


Un resumen de las instrucciones de este lenguaje de patrones

Las instrucciones del lenguaje son:

P1(P2) - La pieza 1 ataca/defiende a la pieza 2.
P(casilla) - La pieza ataca la casilla.
P casilla - La pieza está en esa casilla
taboo(casilla) - hace esa casilla como no disponible al bando defensor.
structw(lista de peones) - define la estructura de los peones blancos en el tablero.
structb(lista de peones) - define la estructura de los peones negros en el tablero.
Conectores lógicos - "," = AND y ";" = OR. Pueden usarse indistintamente (",",";") o (AND,OR).
Comentarios (por línea) - "//", por ejemplo //esto es un comentario.

Por el momento lo dejo aquí. Hay cosas que definir, por ejemplo, ¿cómo es que dos patrones son similares? ¿cómo definir la similitud en dos patrones para considerarlos que son el mismo? ¿se puede crear una métrica de la similitud? Hay que trabajar sobre esto.

Friday, November 12, 2021

Ante una epifanía


De acuerdo a la Real Academía de la Lengua, una epifanía es una manifestación, aparición o revelación. Y aunque la acepción es en general en términos religiosos, debo decir que en el doctorado tuve una epifanía, una verdadera revelación. Al inicio de este trabajo hubo muchos caminos que había que seguir. Se me abría un número de opciones en teoría de juegos y particularmente, en el caso de estudio, el ajedrez, estaba un poco desorientado, pues no sabía exactamente por dónde debía ir. Esto -quiero creer- es normal en un trabajo de largo plazo, en donde poco a poco se va abriendo uno brecha sobre el desarrollo que debe hacerse.

Estaba yo en eso cuando se me pidió que diese una charla en el seminario del IIMAS, que creo organizaba el Dr. Erik Molino. Se trataba de hablar del trabajo doctoral y de los avances que iba teniendo. Era más o menos de una hora la exposición del tema. Así, preparé una serie de diapositivas y mostré la idea que animaba el tema del doctorado: la definición de patrones ventajosos en los juegos de suma-cero.

En la exposición del tema estuvieron los Dr. Héctor Benítez (uno de mis tutores) y el Dr. Jorge Luis Ortega Arjona (mi asesor). Cuando terminé la exposición ambos hablaron de cómo caracterizar los patrones en las posiciones de ajedrez. Y esa fue la pregunta fundamental con la cual había que trabajar. Sí, había patrones, pero ¿cómo los seres humanos los reconocen? ¿cómo se pueden caracterizar en términos de un programa de computadora, de código de máquina? No tenía en ese momento la más pálida idea al respecto.

Yo creo que fue esa noche, o la siguiente, que me senté frente al tablero de ajedrez a tratar de hallar un mecanismo que -de alguna manera- caracterizara los patrones en ciertas posiciones conocidas en el tablero, por ejemplo, el doble sacrificio de alfil (como en la famosa partida Lasker-Bauer) o bien, el sacrificio griego (que se ha dado en multitud de partidas). Y de pronto llegó la revelación, la epifanía. Se me ocurrió algo que ahora me parece una obviedad: en un patrón de ajedrez, en donde las piezas están en ciertas casillas, no es lo importante. Lo que verdaderamente tiene sentido es en realidad qué casillas atacan las piezas.

Para ejemplificarlo un alfil blanco en la casilla d3 ataca la casilla h7 (probablemente un peón negro).Entonces, el alfil no tiene que estar en d3 para definir el patrón. Baste decir que el alfil blanco ataca h7 y por ende, el alfil puede estar en b1, c2, d3, e4, f5, g6 e incluso g8. Y así, el patrón es en general una posición con el alfil en b1, c2, d3, e4, f5, g6 o g8, es decir, tenemos 8 posiciones para definir dónde está el alfil y por lo tanto, 8 posibles patrones. (Véase la ilustración de este artículo).

Lo que ahora, a la distancia, me parece incluso evidente, es que los seres humanos, los ajedrecistas, lo que hacemos muchas veces es comentgazr con otros jugadores ciertas posiciones. Y decimos en muchas ocasiones cosas como estas: "yo tengo un alfil que ataca g7 así como un caballo que puede ir a g5"... Y nótese que no estoy indicando en donde tengo el alfil y el caballo. Vamos, que esta descripción que se hace comúnmente entre ajedrecistas es la clave para representar los patrones.

Llevaba tiempo queriendo escribir sobre esto. Esta es la idea que define los patrones y que se convirtió finalmente en un lenguaje que describe posiciones de forma simple y que, a la larga, conforma los patrones en las posiciones de ajedrez, lo que a la postre dio con una definición de un lenguaje de descripción de patrones ajedrecísticos, núcleo del artículo publicado en la revista de la ICGA.

Tuesday, October 03, 2006

Patrones en Ajedrez (II)

Ideas para un programa de ajedrez humanizado

Veo en http://npr.etri.re.kr/ un programa de computadora que “pinta al óleo” una fotografía. (véase imagen 1). Esto en realidad no algo nuevo, pues actualmente los programas de procesamiento de imágenes tienen filtros de todo género, por ejemplo, acuarela, al carbón, etc. Sin embargo, la gracia del software en cuestión es que pinta de manera imperfecta. Los investigadores a cargo de este trabajo se han preguntado ¿Cómo es que ser humano hace una pintura? Y a partir de esto se entra en el fascinante mundo del “non-photorealistic rendering”, lo cual quiere decir, generación de imágenes no fotorrealístas. Las imágenes generadas con este programa nunca se repiten, no son exactamente iguales, cambian porque el software está diseñado a pintar con errores, como los seres humanos.


De la misma manera me he preguntado muchas veces ¿cómo es que los jugadores juegan al ajedrez? Ya sabemos que ningún jugador de carne y huesos usa los algoritmos que las computadoras utilizan en general para poder jugar. Muchos investigadores de este fenómeno han encontrado que los jugadores de ajedrez no perciben una posición como una entidad estática, sino como una colección de acciones potenciales. Así, entonces, esto puede verse como que un jugador humano busca seguir las jugadas más prometedoras sin considerar todas las alternativas que existen. Para que esto pueda suceder, el jugador de ajedrez tiene que evaluar las posibles jugadas y en muchos casos tiene motivos para desechar muchas jugadas, pues no son las mejores, o al menos no lo parecen. Entonces ¿qué hace? Aparentemente busca esquemas conocidos, patrones muy específicos, en donde las jugadas correctas son claramente identificadas porque hay una continuación que gana o que adquiere una ventaja muy evidente.

A partir de esto se me ocurrió que ¿por qué no incorporar estos patrones a los programas de computadora? Si esto pudiese hacerse, entonces en lugar de que la máquina analizara todas las posibilidades, podrían bien ahorrarse análisis que no lleva a ningún lado. El problema entonces es ¿cómo generar estos patrones de manera que una máquina pueda buscar en ellos y llegar a la conclusión de que hay un patrón específico aplicable?

Después de muchos meses meditando sobre el asunto, encontré que se requiere de un lenguaje gráfico, que no sólo defina el patrón, la posición en el tablero, sino también la existencia de este análisis dinámico de qué pieza ataca a qué pieza/peón, para así llegar a configurar un lenguaje de patrones, que defina de la manera más humana posible, cómo es que pensamos en cada posición de ajedrez. Me tardé mucho en llegar a esta conclusión, porque en mi fuero interno estoy seguro que bien debe haber un lenguaje simbólico, algo parecido al que tiene la geometría analítica, que a través de ecuaciones puede manipular hipérbolas, parábolas y elipses. Así, para quienes sean avezados en estos temas, les debe quedar claro que y = x² habla de una parábola, con centro en (0,0). Mientras se me ocurría cómo generar dicho lenguaje simbólico, me puse a trabajar sobre esta idea de los patrones de ajedrez y del cómo podría ser útil para poder hacer un programa que jugara al ajedrez y buscara las jugadas más prometedoras, en primera instancia, buscando patrones existentes en las posiciones que se están jugando.

Por ejemplo, considérese el siguiente patrón:

Juegan las blancas

Aquí el patrón es claro: hay mate en cuatro jugadas (empezando por 1.Axh7+). Nótese que en este caso, la situación de algunas piezas parece irrelevante (por ejemplo, los peones blancos y el rey blanco). Desde luego que en algunos casos habrá necesidad de observar si es necesario tomar en cuenta otras figuras en el tablero. Y aunque la idea sería crear un sistema en donde todas estas cuestiones las decidiera el propio software, aún se requiere elaborar mucho más.

No obstante esto, si consideramos que los jugadores de ajedrez humanos, al analizar esta posición, bien nos dirán algo así como esto: “mira, el Alfil de c2 amenaza peligrosamente h7, que en realidad está indefenso, pues sólo el rey negro lo protege y en cambio las blancas, además del alfil, tienen su poderosa dama ubicada en h6 con doble ataque a dicho peón. Por otra parte, el peón de f7 no está defendido por nadie, por lo que la combinación de mate 1.Axh7+ Rh8 2.Ag6+ Rg8 3.Dh7+ Rf8 4.Df7# es posible”.

El patrón entonces será: la amenaza del Alfil blanco a h7. La misma amenaza, pero ahora con la dama blanca que está en h6, y además, hacer notar que el peón de negro no sólo no está defendido más que por el rey, sino que además, impide el escape del monarca negro del inevitable mate. Esto en mi programa se ve en el diagrama así:


Nótese que las flechas azules describen las piezas blancas interactuando unas con otras, es decir, cómo se defienden entre ellas. Las flechas rojas, en cambio, muestran las piezas negras que están siendo atacadas por las respectivas piezas blancas. Si quitamos todo lo que sobra, es decir, lo que no interactúa con el patrón que buscamos tendremos el siguiente diagrama definido:


Y su patrón:


Una vez con esta información, bien podemos poner la secuencia de mate u orientar al software para que entonces sólo analice esta posición específica, lo cual quitaría de tajo todos los análisis inútiles que la computadora hace cada vez que valora las jugadas en una posición dada (aunque lo haga muy velozmente, que conste).

Si se tiene una colección de patrones, el problema se reduce a hacer una búsqueda en la base de datos de patrones y si se encuentra alguno, ya se sabe qué hacer, cómo jugar, cómo actuar en el tablero.


El software en acción

Aunque mi programa es aún experimental y no está terminado (no estoy aún muy convencido si necesito una simbología más rica, por ejemplo, una “pieza” en el tablero que sirva simplemente para identificar que una figura blanca ataca una casilla determinada porque en este caso sería parte de un patrón específico y totalmente claro). Igualmente, aunque desde luego que tengo muchos libros e información ajedrecística acumulada en tantos años, quizás ya alguien ha hecho una especie de catálogo de patrones de posiciones de ajedrez. Probablemente los haya para la táctica, pero ¿para la estrategia? ¿No podría generalizarse algo de esta naturaleza para este tema siempre más complejo que el cálculo de jugadas?

Me parece que esta idea tiene sus virtudes y hay que explorarla más a fondo. Puedo mandarle el software a quien me lo pida de manera gratuita (a mi cuenta morsa@la-morsa.com) y si quienes estén interesados me quieren ayudar, serán bienvenidos. Se aceptan sugerencias, críticas, etc. Asumo que en las siguientes semanas habrá nuevas actualizaciones y por lo pronto, espero la ayuda de los lectores conocedores y entusiastas del ajedrez... Su retroalimentación será invaluable. Gracias..

Thursday, September 07, 2023

Mi nuevo libro de ajedrez




Llevo muchos años de ajedrecista. He trabajado intensamente en el juego. He leído cualquier cantidad de libros y después de unos 50 años de ajedrez, puedo decir que entiendo al menos qué hay que hacer para progresar en el ajedrez. Desde luego que mis hallazgos se basan en una premisa fundamental: hay que dedicar tiempo y sr disciplinados en el estudio del juego-ciencia, porque sino, el avance no será jamás significativo.


Lo que he aprendido lo he condensado en mi último libro "Entrena y mejorar en ajedrez", que ante la actual imposibilidad de encontrar editorial, he decidido publicarlo y venderlo en formato electrónico (PDF). Son doscientas cuartillas y cabe decir que me sorprendí que varios de los métodos que propongo aparecen en el libro de Kuljasevic sobre entrenamiento ("How to Study Chess on your own") y además, son los que tienen más relevancia didáctica.


El índice del libro es este:


Prólogo ............................................ 6

Capítulo 1: Una bolsa llena de trucos .............. 9

Ejercicios (Capítulo 1) ........................... 22

Capítulo 2: Ajedrez solitario ..................... 30

Sobre premios y castigos .......................... 33

Diferentes esquemas de ajedrez solitario........... 34

Dos ejercicios de ajedrez solitario ............... 35

Primer ejercicio................................... 36

Segundo ejercicio ................................. 38

Otros 10 ejercicios de ajedrez solitario........... 43

PARTIDA 1. ........................................ 43

PARTIDA 2 ......................................... 45

PARTIDA 3 ......................................... 47

PARTIDA 4 ......................................... 49

PARTIDA 5 ......................................... 51

PARTIDA 6 ......................................... 53

PARTIDA 7 ......................................... 55

PARTIDA 8 ......................................... 57

PARTIDA 9 ......................................... 59

PARTIDA 10 ........................................ 61

Capítulo 3: El sparring perfecto: la computadora .. 63

Primera partida jugando el Gambito Benko .......... 67

Segunda partida defendiendo la defensa Escandinava  70

¿Cómo preparar una apertura/defensa? .............. 73

Tercera partida, atacando con el Gambito de Rey ... 75

Cuarta partida: el ataque Milner–Barry ............ 79

Capítulo 4: Cómo encarar los finales .............. 82

Ajedrez solitario para aprender finales ........... 88

Capítulo 5: El estudio de la táctica .............. 91

¿Cómo estudiar táctica? ........................... 94

El método “Woodpecker” ........................... 102

Antes de Tikkanen estuvo De la Maza .............. 103

¿Qué hay detrás de este método de repetición? .... 104

Poner o no poner en práctica este método ......... 104

Ejercicios ....................................... 105

Capítulo 6: Patrones en ajedrez .................. 107

Introducción a un lenguaje de patrones ajedrecísticos .................................................. 107

Definición de un lenguaje de patrones para ajedrez 120

La descripción de los patrones de ajedrez ........ 121

El lenguaje de patrones .......................... 123

El regalo griego ................................. 128

Cuando el patrón del regalo griego falla ......... 131

Conectores lógicos ............................... 132

Patrones posicionales ............................ 133

Patrones ampliados ............................... 136

No todo puede expresarse con el lenguaje de patrones  

.................................................. 139

Resumen del lenguaje de descripción .............. 143

Capítulo 7: Ajedrez a la ciega: la necesidad de ver el 

tablero en la imaginación ........................ 145

Los inicios de la investigación del ajedrez a la ciega .................................................. 146

Alfred Binet ..................................... 146

¿Qué “ve” un jugador a la ciega? ................. 147

Lo que piensa Norwood ............................ 149

Adrian De Groot .................................. 150

Un experimento de De Groot ....................... 150

Aprendiendo a calcular (Algunos métodos prácticos) 152

Cálculo imposible en 1907 ........................ 153

Una anécdota de Spassky .......................... 157

Seirawan y la capacidad analítica ................ 158

Jon Levitt acerca de Shírov ...................... 159

El método de Beliavsky ........................... 160

El método Tisdall ................................ 160

El método sueco .................................. 162

Un ejercicio de Soltis ........................... 162

El método Slótnik ................................ 165

Ejercicios ....................................... 166

Aprendiendo a jugar a la ciega ................... 173

Ejercicios sobre visualización del tablero ....... 173

Capítulo 8: El arte de entrenar .................. 176

¿Cómo progresa un ajedrecista? ................... 176

La opinión de Susan Polgar ....................... 178

Sobre el proceso de mejorar ...................... 179

Métodos de entrenamiento modernos de acuerdo a Irina Mikhailova .................................................. 180

Bosquejemos el trabajo de la entrenadora ......... 182

Los resultados de Mikhailova y su alumno ......... 184

Cómo estudiar ajedrez, de acuerdo con el GM Noel Studer .................................................. 184

Metas y expectativas ............................. 185

¿Cómo hacerse de un plan de entrenamiento? ....... 186

Conclusiones ..................................... 187

Soluciones a los ejercicios ...................... 188

Bibliografía ..................................... 195


A quien le interese adquirir esta obra, escríbame a morsa@la-morsa.com y le mandaré los datos de mi cuenta. Me depositan y acto seguido, al confirmar el depósito, les mando el libro. 

Una sola advertencia: leyendo este libro no van a mejorar. Deberán trabajar duro, hacerse de un plan y ceñirse al mismo. El avance tampoco será instantáneo. Sin embargo, con disciplina, método y trabajo inteligente (aunque se tengan pocas horas por día), eventualmente empezarán a notar que entienden más y juegan mejor.

Tuesday, September 09, 2008

El juego del gato y sus aplicaciones

No me acuerdo desde cuando entendí que el juego del gato (tres en línea, tic-tac-toe), es uno de los pasatiempos más interesantes para programar por computadora. Por un lado, es lo suficientemente sencillo para que no requiera de demasiados recursos. Por otra parte, es relativamente complejo y por ende, tampoco resulta un ejercicio trivial. Soluciones del juego del gato y programas que lo juegan correctamente hay muchos. En mis cursos de Prolog (programación lógica, inteligencia artificial), es una tarea que se deja de rigor.

De hecho, Martin Gardner alguna vez contó que cuando era estudiante de secundaria estaba en una clase de matemáticas intentando hallar alguna fórmula para resolver el gato. Su maestro lo vio (de acuerdo a su criterio, jugando al gato el solo), y le reprendió. Le dijo que mejor estudiara matemáticas y dejara esos jueguitos tontos para su tiempo libre.

Pues bien, en la Universidad Iberoamericana, este semestre estoy dando un curso de Reconocimiento de Patrones. Aunque la parte teórica nunca me ha terminado de gustar (en mi opinión hay demasiadas matemáticas y creo que el enfoque debería ser más práctico, aunque comprendo perfectamente que de esta manera se le da el formalismo y rigor necesarios), pero en la parte práctica, de experimentación, hay N temas que pueden abordarse.

De esta manera, le dejé a mi alumno (¡sólo tengo un alumno en ese curso!), Daniel González, que escribiera un juego de gato pero que lo resolviera usando solamente patrones. La idea era generar los patrones necesarios para siempre ganar (empezando la computadora y tirando ésta siempre en el centro), y a cada jugada del adversario, el sistema debería buscar el patrón correspondiente, aplicarlo y generar la jugada correcta.

Daniel hizo su programa en Java y utilizó dos trucos: primero generó 42 patrones (incluyendo el del tablero vacío) y de ahí tuvo que ubicar posibles respuestas que se salieran de los patrones utilizando giros del juego del gato (90, 180, 270 grados). De esta manera, como el juego tiene simetría, pudo eliminar información redundante y logró un bonito programa que resuelve (simplemente buscando el patrón correcto), cada jugada que debe hacer la computadora para ganar o al menos, nunca perder. Y hago énfasis en esto: el programa no tiene un algoritmo para resolver el juego del gato o jugar bien. Simplemente es un sistema de búsquedas de patrones y las acciones a realizar cuando el patrón se encuentra. Cabe señalar que están todos los patrones posibles.

Quien quiera jugar contra el software de Daniel mándeme un mensaje a mi correo (morsa@la-morsa.com) y se lo envío. se necesita una versión de Java que sea 6.0 o superior.

Sunday, March 01, 2015

Patrones de ajedrez y su dificultad inherente



El ajedrez, estoy convencido, es en mucha medida un juego de patrones. Un jugador fuerte, un gran maestro -dicen- tiene alrededor de unos 50 mil patrones almacenados en su cabeza. y aunque la cifra puede ponerse en tela de juicio, es claro que después de muchos años de práctica estos jugadores alcanzan una capacidad para valorar que llega a sutilezas que muchas veces los aficionados no entendemos. Finalmente es el gran arte que en muchas ocasiones se expresa en grandes jugadas que después los mortales tenemos que destripar literalmente, para entender qué fue lo que pasó en alguna partida.

Considerando que los patrones en ajedrez son algo que merece una investigación más profunda, decidí tratar de sacar la esencia del llamado "regalo griego", que es cuando un alfil blanco se entrega en la casilla h7, seguido de un jaque con el caballo en g5 y después con la entrada de la dama blanca, ya sea en g4 o h5. Probablemente también exista un peón blanco en e5 cuya función es desalojar al caballo negro de f6 y de la susecuente defensa del punto h7.

El patrón puede ser considerado este:

 Juegan las blancas

 El cual puede expresarse en mi programa de patrones como esto:

  • Rey negro en g8
  • Torre negra en f8
  • peones negros en h7,g7 y f7
  • Dama blanca en d1
  • Peón blanco en e5
  • Alfil blanco atacando h7
  • Caballo blanco atacando g5

Para hacer las búsquedas sobre estos patrones hay dos opciones: la primera es procesar un conjunto de partidas analizando cada partida, posición por posición, y ver si se llega a tener el patrón correspondiente. La segunda opción es usar una herramienta interesante de la que ya he hablado, el CQL (Chess Query Language), el cual permite buscar posiciones usando un lenguaje de scripts. Para el regalo griego tenemos:

(match
 :pgn greek-gift.pgn
 :output results-greek.pgn
   (position Qd1 Bd3 kg8 rf8 ph7 pg7 pf7 Nf3 :wtm)
 )

Puse el CQL a trabajar con una base de datos ejemplos y hallé algunas partidas, por ejemplo estas tres:



Sin embargo, revisando la base de partidas de Gibraltar 2015 hallé este encuentro sorprendente:

Salgado López, Ivan - Svidler, Peter
Gibraltar 2015

1. e4 c5 2. c3 d5 3. exd5 Qxd5 4. d4 Nf6 5. Nf3 e6 6. Na3 Qd8 7. Nc2 Nbd7 8. Bd3 Be7 9. O-O O-O 10. Bf4 b6 11. Qe2 Bb7 12. Rad1 Qc8 13. Rfe1 a6 14. Ne5 b5 15. c4 Nxe5 16. dxe5 bxc4 17. Bxc4 Nd5 18. Bc1 Nb6 19. Bd3 c4

Juegan las negras

En la jugada 19 Svidler juega ... c4!? ¿Habrá visto que su posición plantea el regalo griego? ¿Qué hará su rival? ¿sacrificará la pieza por el ataque? ¿No parece evidente? Pues su rival, Salgado López entró en el conocido sacrificio.

20. Bxh7+ Kxh7 21. Qh5+ Kg8 22. Re3 Qc6! aparentemente esta es la refutación que vio Svidler. Gana tiempo pues las negras tienen que defender el mate (si 23. Ne1 g6! este desvío de la dama de h5 es fundamental pues la torre de d12 blanca debe quedar desprotegida 24. Qh6 Rfd8 25. Rh3 Dxg2+! 26. Nxg2 Rxd1 27. Ne1 Rxe1# Esta variante me la dio el MI Guil Russek). 23. Rg3 Qe4 24. Be3 Qxc2 25. Bxb6 Be4 26. Rh3 Bh7 0-1

Cabe señalar que la posición no es estrictamente como el patrón conocido (ver el primer diagrama), pero parecen cumplirse las condiciones para ejecutar el regalo griego. Sin embargo, aquí Svidler tenía un truco, que es el mate en g2 y el ataque no puede continuar sin antes tener que defenderse de las amenazas del negro. De hecho, el regalo griego aquí fue un error de bulto, pero no se puede culpar al conductor de las blancas por seguir el patrón.

Esto plantea la dificultad para definir patrones en ajedrez. Posiciones parecidas no necesariamente funcionan. Hay pues que revisar cuasndo un patrón puede utilizarse o no, es decir, cuándo la similitud en las posiciones en los suficientemente fuerte para poder decidir que el patrón es utilizable.

Tuesday, December 20, 2016

Más sobre patrones en ajedrez



En el pasado Campeonato Mundial de Ajedrez, Carlsen batió en las partidas rápidas a Sergey Karjakin, el retador, el cual no parecía en el papel tener muchas chances frente al noruego. Vamos, hasta Kasparov dijo que el match sería de un solo lado a favor de Carlsen, pero el ruso se ve que se preparó muy bien y de pronto hasta tuvo chances de ganar el título mundial.

La última partida de las primeras 12 pactadas a tiempos clásicos, ajedrez lento pues, fue para los espectadores una burla, pues los dos ajedrecistas jugaron una línea teórica y pactaron el empate sin que francamente hubiese lucha. Todo pues se decidiría en 4 partidas rápidas a 25 minutos y en caso de persistir el empate irían a partidas de 5 minutos. Pero no hubo necesidad: Carlsen ganó con autoridad 3-1 y mantuvo su cetro mundial. Lo interesante es que en la cuarta partida Magnus Carlsen liquidó al adversario con 50. Dh6+!! y Karjakin concedió que debía rendirse porque sería mate en la siguiente jugada no importando con qué pieza capturara la dama. La posición final fue entonces ésta:


Carlsen - Karjakin 
Campeonato Mundial, Nueva York 2016
Juegan las blancas

Como decíamos, en esta posición Magnus jugó 50. Dh6+!! y si 50. ... Rxh6 51. Th8#; a 50. ... gxh6 51. Txf7#

Magnus Carlsen terminó con este lindo sacrificio y la décima segunda partida del match tan criticada pasó al olvido. Ahora todos alababan el gran juego combinativo del campeón mundial y el haber hallado 50. Dh6+!!


Popov - Novopashin, 
Campeonato URSS 979
Juegan las blancas

Pero 37 años antes este tipo de combinación, este patrón, se jugó en la partida Popov - Novopashin, en el Campeonato de la URSS de 1979. En la siguiente posición (véase diagrama), las blancas culminaron la partida con 32. Dh6+!!, produciéndose una combinación igual: si 32. ... Rxh6 33. Th8# y si 32. ... gxh6 33. Txb7#.

La realidad es que ambas combinaciones se basan en el mismo patrón. Si usamos el lenguaje definido para patrones que estoy trabajando en mi tesis ahora (ver aquí  y aquí), podemos darnos cuenta que los elementos se cumplen:

Carlsen - Karjakin, Nueva York, 2016: D(h6), T(c8), T(f5), P(h5), r(h7), p(g7)

Popov - Novopashin, URSS, 1979: D(h6), T(f8), T(b7), P(h4), r(h7), p(g7)


Como puede verse, la similitud en ambos patrones muestra que se trata del mismo patrón genérico. Ahora estoy trabajando precisamente en esto. Peter W. Frey ha mencionado que para él hay tres tipos de patrones, A, B y C. (Peter W. Frey (1986). Fuzzy Production Rules in Chess. ICCA Journal, Vol. 9, No. 4). Indica Frey entonces que se pueden considerar patrones que van desde propiedades simples de escaques y piezas que se ocupan de las posiciones donde se encuentran y el control que tienen, hasta un conjunto de características que puede ser interrelacionado de manera más compleja. En el caso de los patrones tipo-A, todas las condiciones se deben cumplir, es decir, todas las características del patrón deben estar presentes. En los patrones de tipo-B, se representan las características que usualmente están presentes pero no siempre y los del tipo-C en donde las características se presentan ocasionalmente.

Wednesday, May 24, 2006

El secreto de los grandes maestros

Hace ya relativamente cierto tiempo de esto, me llegó un correo electrónico que decía lo siguiente: Sgeún un eiudsto de una uinsrvdiead iglensa, no iomtpra el odern en el que las lerats eátsn ectasirs, la úcina csoa inrmptoate es que la prirmea y úlimta lreta eétsn esracits en la poóicisn ccrertoa. El resto peduen eastr ttmeatolne mal y aún párdos lelreo sin poamblers. Etso es pruoqe no leeoms cdaa ltrea por sí mmsia, snio la pbarlaa cmoo un tdoo. Peonmrestalne me pacere ilnírebce.

Aunque probablemente la mayoría de los lectores puedan entender el párrafo en cuestión, he aquí la "traducción" al español perfectamente correcto:

Según un estudio de una universidad inglesa, no importa el orden en el que las letras están escritas, la única cosa importante es que la primera y última letra estén escritas en la posición correcta. El resto pueden estar totalmente mal y aún podrás leerlo sin problemas. Esto es porque no leemos cada letra por sí misma, sino la palabra como un todo. Personalmente me parece increíble.


Aparentemente esto ocurre no sólo en español sino en la mayoría de los idiomas. (Por cierto, he desarrollado un programita para generar este tipo de textos, sólo por diversión. Quien lo quiera, mándeme un mensaje de correo electrónico a morsa@la-morsa.com y a vuelta de correo le llegará el programa, escrito en Delphi 7, incluyendo el código fuente.

Así, si creíamos que leemos letra por letra un texto, pues nos hemos equivocado. Aparentemente nuestros cerebros han asimilado una serie de patrones, los cuales no son otras cosas que las palabras, las cuales se codifican y se guardan de manera misteriosa, pero sin duda, de forma muy eficiente, de manera que al ver una palabra, en lugar de leerla y armarla letra por letra, lo que estamos haciendo es simplemente buscar en nuestro acervo de palabras para ver si está y la reconocemos.

De ser cierta esta idea, lo cual parece serlo, encontraríamos una explicación a ese misterioso fenómeno de los errores en un texto que escribimos, y que solamente encontramos después de haberlo impreso. Es decir, no importa las veces que lo revisemos en la pantalla de la computadora. Es regla general que cuando se imprima el documento encontremos errores que nunca vimos.

Lo simpático del asunto es que tiene la clave para jugar mejor al ajedrez y que en cierta medida revela lo que los grandes maestros hacen al jugar. La curiosa frase recibida en mi buzón da un dato fundamental: el cerebro es una máquina de procesamiento de patrones. Así entonces, en muchos sentidos, los jugadores fuertes saben qué jugada hacer prácticamente desde el momento que ven una posición. Cuando se les pregunta cómo es que encontraron prácticamente a vuelo de pájaro la mejor jugada, responden con un mohín moviendo la nariz en señal de es una especie de olfato.

Pero bajo el esquema de lo que estamos considerando, es mucho más probable que este "olfato" no sea más que una colección de patrones ajedrecísticos, de posiciones típicas, y no sólo de estructuras de mate, sino de otros géneros de posiciones, incluso en las aperturas. Por eso, me parece, es importantísimo estudiar ajedrez. De esta manera el cerebro va adquiriendo estos patrones arquetípicos que muestran cómo se deben manejar cierto tipo de posiciones. Quienes no estudian y creen que pueden resolver todo en la partida viva, pues se equivocan, si no totalmente al menos en parte. Es cierto que sí, un jugador talentoso encontrará quizás las jugadas correctas analizando meticulosamente la posición. Sin embargo, podría ahorrarse un valiosísimo tiempo de reflexión si conociera de antemano ciertos patrones, producto probable de estudiar sistemáticamente nuestro juego.

Desde luego que no todo son patrones. Sin duda el jugador fuerte, el gran maestro, tiene una certeza sobre la manera de evaluar correctamente una posición. Eso se adquiere a través de varias actividades: (i) ver muchas posiciones parecidas, analizando lo que otros han jugado en esa posición (por eso las bases de partidas son fundamentales para todo aquel que quiera mejorar su juego); (ii) conocer los elementos básicos, como por ejemplo, los finales más comunes, desde los de peones hasta los de torres; (iii) conocimiento de las partidas modelo más importantes de la historia del ajedrez, aquí hay cientos de encuentros memorables, que todo jugador debe entender para tener una visión histórica y práctica de cómo se atacan cierto tipo particular de posiciones y, desde luego, (iv) un trabajo constante en el desarrollo de la habilidad táctica, la cual se traduce en precisamente en analizar patrones de combinaciones típicas, que nos darán una ventaja enorme sobre aquel que no haya hecho este trabajo.

Si usted hace eso (lo cual requiere tiempo, dedicación, disciplina y trabajo constante), entonces no habrá quien lo detenga en el camino a la maestría ajedrecística.

Friday, February 18, 2011

Lenguaje de búsquedas para posiciones de ajedrez


Cuando Boris Spassky iba a defender su título de Campeón del Mundo frente al estadounidense Bobby Fischer, se sabe que los soviéticos tardaron unos cuatro meses en transcribir todas las partidas que hallaron sobre el retador. El asunto era muy importante, porque no se jugaba solamente un título mundial de ajedrez, sino que se ponía en jaque, literalmente, el liderazgo de los soviéticos en el ajedrez, juego que representaba un símbolo nacional y que el comunismo soviético había abanderado como parte de su revolución cultural.

Hoy día, no se necesita un grupo de ajedrecistas que compilen las partidas de un rival en particular. Gracias a las bases de datos de partidas, de los manejadores de éstas, como Chessbase o Chess Assistant, se puede tener la colección más grande de partidas de ajedrez que se pueda uno imaginar, la cual ya oscila entre los 5 y 6 millones de encuentros ajedrecísticos. Por supuesto que esta información prácticamente condensa todas las partidas de ajedrez jugadas desde que éste se practica como lo conocemos (alrededor de 1525).

Pues bien, en algún momento -ya lo he dicho- tuve un momento que considero de verdadera iluminación. Por un instante sentí que entendía cómo comprender el ajedrez y para ello me di a la tarea de trabajar en posibles herramientas que me ayudaran a demostrar que iba por el camino correcto. Por ello nació el programa que analiza los patrones de las posiciones, el cual pretende, de alguna manera, crear un lenguaje de descripción de posiciones, pero que de alguna manera tome en cuenta los patrones de posiciones arquetípicas, las cuales pueden mostrar una combinación ganadora, en donde los elementos se repiten (a eso me refiero con patrones). En estos dos enlaces, éste y éste otro, hablé de estas ideas.

Por algún tiempo, que ya se antoja largo, he buscado cómo representar los patrones de ajedrez más típicos. La razón de esto es que así se podría hacer búsquedas de patrones en partidas de ajedrez y así sacar la información relevante que se hubiese dado con un patrón determinado. Algún alumno en la UNAM me dijo que quizás sería bueno hablar con algún matemático, que él pensaba que esto era una tarea para un especialista de esta naturaleza. Pero entre que no sé quién podría ocuparse de un lenguaje de descripción como el que creo necesitar, y entre la poca información que sobre este tema puede hallarse en la red, lo he estado dejando para un mejor momento.

Pero he aquí que encuentro el Chess Query Language (CQL), un sistema para hacer búsqueda de temas en posiciones de ajedrez. Aunque esto no es estrictamente los patrones en los que estoy interesado, es evidente que tiene una fuerte correlación y que, probablemente, sea el camino correcto para desarrollar este lenguaje descriptivo del que hablo.

El Chess Query Language fue diseñado para permitir a investigadores, autores y jugadores, a buscar temas en partidas, problemas y estudios. Hay que especificar el tema que se busca y la base de datos (partidas en PGN) en donde queremos buscar. Cuando se corre la consulta (usando cql.exe), el sistema crea un nuevo archivo PGN con los partidos de ajedrez que coinciden con el tema que se busca.

Como en todos los manejadores de bases de datos, CQL especifica un conjunto pequeño, pero poderoso, de primitivas para ser usadas en los temas de ajedrez. CQL puede encontrar mucho más información relevante que cualquier otro programa de ajedrez. Los usuarios pueden buscar en temas como ahogado, clavadas múltiples, juegos en donde ocurre la misma posición pero en donde en el lado ganador falta una pieza, los temas Grimshaw y Novotny, juegos con cierto número de capturas en una sola casilla, juegos con cierta cantidad de peones pasados, blancos o negros, etc. Las posibilidades se antojan infinitas.


Una ventaja obvia de usar CQL es que se le puede programar la búsqueda de, por ejemplo, el regalo griego (el sacrificio en h7 con jaque con un alfil), y el sistema dará todas las partidas que encuentre en la base de datos de referencia que pongamos. Imaginen para qué puede servir esto: crear libros de táctica en base a temas específicos, en donde el autor del libro no tiene que buscar "a mano" cada posición, sino que puede ayudarse de esta herramienta para así encontrar las mejores posiciones sobre el tema particular que se busque.

Por ejemplo, veamos una interesante búsqueda que hace Tim Krabbé en su excelente página de ajedrez, en donde por cierto, hallé por primera vez referencias al CQL. Dice Krabbé que en alguna ocasión soñó con una combinación. He aquí la posición de interés:

Tim Krabbé
Juegan las negras

La solución es sencilla: 1. ... Dh3!! 2.Rxh3 Cf4+ 3.Rg3 Cxe2+ seguido de 4. ... Cxc3 ganando. 0-1.

Muy sencilla pero... ¿se habría dado esta posición antes? ¿o este tema (no necesariamente las piezas estrictamente en las posiciones del diagrama). Con CQL Krabbé halló dos estudios, el primero de 1954:



P. Okonkowski 
Juegan las blancas y ganan
Schach, 1954

La solución es 1.Tc6! Txc6 y ahora la combinación soñada por Krabbé:  2.Df5+ Rxf5 3.Cd4+ Re5 4.Cxc6+ Rd5 5.Cxa5 y las blancas ganan.

Sorprendente. Parece magia que algo como CQL pueda hallar este tema cuando las piezas están en situaciones por demás diferentes.

De acuerdo a Krabbé, y cosa que comparto, CQL es la respuesta también al viejo problema de la clasificación de estudios de ajedrea. La base de estudios de Van der Heijden no tiene clasificación por temas, porque entre otras cosas, el asignar y etiquetar un tema es, como en literatura, algo que tienen que ver con  gustos personales y además, la creación de nuevos temas, o el definir los ya existentes requeriría de tener que clasificar la base de estudios de nuevo.

Por ello, es quizás mejor definir primero una interpretación y luego entonces, buscar por estudios y partidas en donde se dé esta interpretación. Por ejemplo, tómese el tema que tanto le gusta a Krabbé, el de la guardia desguardada -un pieza da jaque y una pieza se interpone en una casilla no defendida. Esto ha pasado en muchas partidas y estudios, pero nunca se ha reconocido como un tema por sí mismo. En Chessbase, por ejemplo, es imposible definir esta búsqueda, pero en CQL esto se hace de manera sorprendentemente fácil:

:wtm
:check
:movefrom [QRBNP]
:moveto .d4
:attackcount A Ad4 0
:shift
:flipcolor


Esto dice que juegan las blancas (wtm - white to move) y están en jaque (check), y que moverán cualquier pieza (movefrom [QRBNP]), a excepción del Rey a la casilla vacía d4 (moveto .d4), la cual tiene cero ataques después de esto (attackcount A Ad4 0). Los eventos especificados pueden tener lugar en cualquier casilla (shift). Finalmente, la última instrucción (flipcolor) nos permite asegurar que se encuentren ejemplos con los colores cambiados. Se puede poner también ":moveto ?d4", para limitar la búsqueda a los casos en donde la pieza interpuesta es capturada.

He aquí uno de los resultados de esta consulta con CQL, que a Krabbé se le pasó por alto cuando se jugó esta partida:

Topalov - Judit Polgar
Novgorod 1996
Juegan las blancas

43.Tc7 un guarda indefenso es la justificación para esta aguda jugada. 43...Tb8 44.Txf7+ Rg8 45.e6 Dxe3+ 46.Dxe3 Tb1+ 47.Dc1 dejando libre e3 para impedir el mate. Por supuesto que Judit habrá visto, pero tal vez no, que después de 47...Txc1+ 48.Rf2, el final esta perdido, por ejemplo, 48...Tf1+ 49.Re3 Txf7 50.d7! En la partida, se siguió: 48...Tc6 49.Td7 Ab5 50.Re3 Tc2 51.Tc7 Te2+ 52.Rf4 Tf2+ 53.Rxe4 Te2+ 54.Rf5 Tf2+ 55.Re5 Te2+ 56.Rf6 Tf2+ 57.Re7 Te2 58.d7 Axd7 59.Rxd7 Td2+ 60.Re8 y las negras se rindieron. 1-0.

Aunque el CQL se desarrolló para ser usado con la base de estudios de Van der Heijden, la cual contiene más de 75,000 estudios, CQL puede ser usado también con partidas y con bases de datos mucho más grandes. Pero como el sistema genera archivos PGN, hay que convertir las bases de partidas (normalmente en formatos propietarios de Chessbase y/o Chess Assistant), al formato PGN (Portable Game Notation), Krabbé tuvo que convertir 1.9 millones de partidas a PGN. Después de unos 20 minutos, el holandés obtuvo 1.3 GBytes de partidas en un archivo PGN. Hacer búsquedas en estas enormes bases de datos puede tomar tiempo, muchas horas quizás. Se puede sin embargo hacer una consulta en CQL que sea muy amplia y así reducir la muestra a buscar. Por ejemplo, a Krabbé le tomó 15 minutos extraer 4000 partidas en donde ocurre la promoción de un peón, pero en cualquier pieza a excepción de la dama. Con esta nueva base de datos, se pudo buscar temas que involucren la sub-promoción, lo cual resulta hacerse en unas 500 veces más rápido.

Se puede descargar el Chess Query Language de forma gratuita. Viene con manual y muchos ejemplos (scripts .cql). Es un programa de línea de comandos, pero el compositor de estudios checoslovaco, Emil Vlasák, ofrece VisualCQL, una utilería que probablemente haga sentir más cómodo al usuario en un ambiente Windows.

CQL fue desarrollado por Gady Costeff y Lewis Stiller. Es gratuito (con los correspondientes Derechos de Autor 2003-2004). Utiliza una programa base de datos (partidas en este caso) del software libre llamado Scid, desarrollado por Shane Hudson. La versión de Windows usa las bibliotecas Cygwin. En el sitio http://rbnn.com/cql/ puede hallarse el sistema para descargar, instalar y se usar el CQL.

Crédito Foto (inicio del artículo): DavidR_ (http://www.flickr.com)


Wednesday, December 09, 2020

Programación funcional y búsqueda de patrones en ajedrez


Estoy en la etapa final del doctorado (o al menos eso quiero creer), y una de mis tareas es formular mis hallazgos en los patrones en ajedrez (y generalizarlos para los juegos de suma-cero e información perfecta), es la de generar un álgebra para formalizar los resultados. He encontrado que se puede usar un álgebra de conjuntos en donde el ajedrez puede ser perfectamente definido. Cabe decir que encontré un estupendo artículo de Max Euwe, matemático y ex-campeón del mundo ("Mathematics — Set-Theoretic Considerations on the Game of Chess"), en el que me he basado para definir un álgebra de conjuntos en patrones.

La idea es pues desarrollar esta álgebra y ver si por ejemplo, las funciones que definen los patrones pueden ser transitivas, distributivas, etcétera, así como observar si se cumple la composición de funciones, por mencionar una sola característica. Toda la idea es pues hallar si los patrones se aplican en las diferentes posiciones que pueden darse en las partidas analizadas.

Estamos hablando pues de un álgebra de funciones, que se extiende naturalmente de un álgebra de conjuntos. Lo interesante de todo esto es que esta álgebra de funciones puede establecerse dentro del paradigma de la programación funcional. Si lo pensamos con cuidado, la búsqueda de un patrón en una posición determinada es básicamente una función que toma dos parámetros (el patrón y la posición a analizar), y regresa un valor "true" (verdadero) o "false" (falso), que nos dice si el patrón existe en la posición o no.

Mucho del trabajo de la tesis ha sido buscar estos patrones y en un artículo pasado, mediante un programa que manipula las posiciones en formato FEN (Forsyth Edward Notation), logré subir la velocidad de búsqueda de 80 posiciones (una partida de ajedrez promedio) por segundo a 54 partidas completas por segundo (4320 posiciones). Para esto usé Regex (búsquedas regulares), implementadas en una biblioteca en Delphi.

Sin embargo, decidí hacer la prueba usando el paradigma de la programación funcional. Encontré que usando Prolog, un lenguaje declarativo que cumple con buena parte del paradigma funcional, podía ver qué tan rápido se podrían hacer las búsquedas de patrones. En la programación funcional se mapean objetos unos con otros y se observan las propiedades de las funciones en el dominio en el que se esté trabajando.

Pues bien, escribí el siguiente programa en Prolog:

equal([],[]).

equal([X|T],[X|T1]) :- equal(T,T1).

patron([[_,_,_,_,_,_,'k',_],[_,_,_,_,_,_,'p','p'],[_,_,_,_,_,_,'1',_],[_,_,_,_,'P','1',_,_],[_,_,_,_,'1',_,_,_],[_,_,_,'B',_,'N',_,_],[_,_,_,_,_,_,_,_],[_,_,_,'Q',_,_,_,_]]).


     search(Patron,Pos) :- fen(Pos),

                           patron(Patron),

                           equal(Patron,Pos),

                           write('Found in pattern '),

                           write(Pos),nl, 

                           fail.


fen([['r','n','b','q','k','b','n','r'],['p','p','p','p','p','p','p','p'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['P','P','P','P','P','P','P','P'],['R','N','B','Q','K','B','N','R']]).

fen([['r','n','b','q','k','b','n','r'],['p','p','p','p','p','p','p','p'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','P','1','1','1'],['1','1','1','1','1','1','1','1'],['P','P','P','P','1','P','P','P'],['R','N','B','Q','K','B','N','R']]).

fen([['r','n','b','q','k','b','n','r'],['p','p','p','p','1','p','p','p'],['1','1','1','1','p','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','P','1','1','1'],['1','1','1','1','1','1','1','1'],['P','P','P','P','1','P','P','P'],['R','N','B','Q','K','B','N','R']]).

fen([['r','n','b','q','k','b','n','r'],['p','p','p','p','1','p','p','p'],['1','1','1','1','p','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','P','P','1','1'],['1','1','1','1','1','1','1','1'],['P','P','P','P','1','1','P','P'],['R','N','B','Q','K','B','N','R']]).

    .

.

.

fen([['R','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','P'],['p','1','1','1','1','1','1','k'],['n','1','1','1','1','1','1','1'],['1','1','1','1','b','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','K','1']]).

fen([['R','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','k'],['p','1','1','1','1','1','1','1'],['n','1','1','1','1','1','1','1'],['1','1','1','1','b','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','K','1']]).

fen([['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','k'],['R','1','1','1','1','1','1','1'],['n','1','1','1','1','1','1','1'],['1','1','1','1','b','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','K','1']]).

fen([['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','k'],['R','1','n','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','b','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','1','1'],['1','1','1','1','1','1','K','1']]).

El predicado "fen" contiene una lista con 8 sublistas, cada una por cada fila del tablero de ajedrez y muestra una posición determinada en la partida de ajedrez. El predicado "patrón" define simplemente el "regalo griego". Tengo un predicado llamado "equal", que toma dos listas y ve si son iguales y finalmente defino la búsqueda del patrón en el predicado "search". Aquí busco en todas las posiciones que tengo definidas, poco más de 110,800. 

Los resultados obtenidos me parecen espectaculares: el programa (compilado) tardó unos 7 segundos en hallar los patrones en las más de 110 mil posiciones. Esto es unas 192 partidas por segundo, o 15,346 posiciones por segundo. Un incremento de casi 400%.




Cabe señalar que originalmente intenté usar Turbo Prolog 2.0, pero enfrenté problemas imposibles de superar porque dicho sistema se hizo para MsDOS. Pasé entonces a Visual Prolog, el sucesor de Turbo Prolog. Pero después de pelearme con el manual y haciendo multitud de pruebas, no pude ejecutar mi programa. Y aunque pienso que Visual Prolog es una estupenda herramienta de desarrollo, creo que no es para cualquiera. Por ende, busqué otra alternativa y hallé swi-prolog, una implementación muy buena, que compila también (y que indica el fabricante que la velocidad de proceso se incrementa dos o tres veces con respecto al código interpretado). Aquí además se mostró que las limitaciones del stack y del espacio para el programa ya no existían y el software corrió de manera expedita y en el tiempo mencionado. Y habría que decir que no he hecho las pruebas en mi máquina con Windows 7, la cual corre más rápido que la máquina con Windows 10. Esto debería subir a -al menos- a unas 25 mil posiciones por segundo, es decir, unasa 313 partidas por segundo.

Estos son los resultados preliminares de mis pruebas usando la programación funcional que pienso es, para el caso que nos ocupa, una de las mejores aproximaciones al problema. Seguiremos informando.

Saturday, September 23, 2006

Patrones en ajedrez (I)

Se dice que un maestro fuerte de ajedrez tiene en su cabeza alrededor de 50,000 patrones típicos que se dan en el juego. Esto podría explicar por qué un jugador débil no ve con la misma facilidad una buena jugada que su contraparte magistral. Es claro que en muchos sentidos las posiciones tienen características familiares y el hecho de conocer los detalles típicos nos dan la pauta para encontrar la jugada correcta en una partida.

Quienes estudien profundamente la táctica ajedrecística notará que ya muchos autores han hecho la tarea por uno, es decir, han catalogado por temas las posiciones: sacrificios en h7, clavada, combinaciones de empate por ahogo, doble ataque, ataque al descubierto, etc. Los temas son muchos pero finitos y en muchos casos las combinaciones, la táctica en ajedrez, se basa en detalles que describen finalmente una posición y que por ende, no hay ni que analizar qué jugada hacer: puestos todos los elementos en su lugar, la combinación nace por sí misma, casi automáticamente. Por eso la recomendación de estudiar táctica no hay que echarla en saco roto.

Pues bien, a fines de diciembre, casi para empezar el año 2002, me atacó el virus gripal. Me tiró en cama tres días con sus respectivas noches. Quien haya estado con gripa sabrá lo inútil de dicha enfermedad. Pareciera que su único afán es mantenernos en cama por algún tiempo, aburriéndonos con la tele encendida prácticamente todo el día y sonándonos las narices hasta el hartazgo. Pues bien, en esas condiciones deplorables, cuando me hartaba de la TV me ponía a hojear algunos de los libros de ajedrez que tengo a mi alrededor. Dentro de uno de ellos, hallé una partida que le gané al FM Isidro Díaz Lombardo hace algunos años. Ahí ejecuté una bonita combinación con la que obligué a mi rival a rendirse de inmediato. He aquí la mencionada posición crítica:


Díaz Lombardo, I. – López, M.

México 1993
Juegan las negras

1. … Dxf2!! Y las blancas abandonan, ya que después de 2.Txf2 Tc1+ y mate a la siguiente.

Dejé la papeleta para caer dormido durante algún tiempo. Cuando desperté tomé otro libro. Se trataba de The Inner Game of Chess, de A. Soltis. Lo abrí en cualquier página y me encontré con la siguiente posición:


Lee-Sakharov

Campeonato Mundial Juvenil 1963
Juegan las blancas

De pronto caí en la cuenta que era el mismo tema que mi partida contra Díaz Lombardo. Después de 1.Txe7 las negras confiaban en 1…. Txc3 especulando con que la dama blanca está defendiendo la torre de f1, pero las blancas dieron una sorpresa: 2. Dxf7!! Y las negras abandonaron inmediatamente por el inminente mate.

Me pareció curioso encontrar una posición similar casi por azar. Pero eso no fue todo: Más tarde hojeaba la revista holandesa New in Chess 98/2. Encuentro la partida siguiente en donde, no lo podía creer, se repite la combinación de la que estamos hablando:



Barua-Maherramzade

Ubeda (op) 1998

Juegan las negras


El blanco está perdido. Aquí, sin embargo, el conductor de las negras comete un grave error: 1. … Txg2?? Y Barua, ni lerdo ni perezoso contestó: 2. … Dxf7!! Y las negras se rindieron.

Este parecía en final de la historia. Pero unos días después de levantarme finalmente de la cama, hallé en el libro del MI Kopec (Mastering Chess), el siguiente diagrama:



McNab-Mullen
Juegan las blancas

Después de 1.Dxf7!! las negras tienen que rendirse.

Curiosamente, hace poco aquí en Chessbase, Frederic Friedel publicó una serie de combinaciones que se dieron en un fuerte torneo en Turquía. Aquí hallé la misma combinación pero con un nuevo atuendo, es decir, en una posición totalmente diferente a las ya vistas:



Atakisi, U – Ruck, R
4th IECC Estanbul, Turquía 2003
Juegan las blancas

Las negras aquí se equivocaron, pues su última jugada fue 30. ... Tg4-g6 en lugar de la requerida, 30. ... Tg4-g8. Y aquí las blancas sorprendieron sin duda a su rival brillantemente: 31. Df7!! Tf7 32. Th8 Tf8 33. T8f8 mate.

Notará el atento lector que el tema se repite. El patrón es el mismo incluso cuando la posición no lo parece. Si uno ve decenas de situaciones parecidas, si se le presentan en la práctica, es seguro que hallará la combinación ganadora. En muchos sentidos el ajedrez es búsqueda de patrones conocidos. Para conocerlos entonces hay que ejercitarlos. Es decir, en otras palabras, a trabajar esa visión combinatoria.

La pregunta que surge de todo esto es: ¿se puede programar una computadora para que encuentre los patrones típicos? (como los mostrados en este artículo). Sin duda se necesita de un lenguaje que describa el tablero en las patrones que definan las posiciones ganadoras, y cómo actuar en esos momentos. En ese trabajo me he involucrado y ya he comenzado con la codificación de un software específico que defina patrones y jugadas. Apenas empiezo, pero sin duda este tema será motivo de más artículos.