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..

3 comments:

Yixus said...

Los patrones están guardados como imágenes? Habrá forma de codificarlos simbólicamente?

Yixus said...

Bueno, para completar la idea, ¿se podrá convertir cada rasgo o característica de una posición a una letra o palabra, de modo que una posición completa quede como una oración (o un conjunto de ellas)? Talvez así sería más fácil almacenarlas, hacer búsquedas y demás asuntos de su manejo

Morsa said...

Los patrones están guardados como posiciones Forsyth. Por ejemplo, la posición inicial es

tcadractpppppppp1111111... ...1111111PPPPPPPPTCADRACT

Ahora bien, cómo convertir cada característica a un token (estrictamente es lo que hacían, por ejemplo, los primeros intérpretes de BASIC)? No lo sé.