«

»

Mar 16

¿Cómo utilizar un motor de análisis?

Publicado por: González de la Torre, Santiago en http://nowinchess.com

 

Ejemplo de motor de análisis

Una de los hitos que ha revolucionado el ajedrez en los últimos 20 años es la aparición de los conocidos como “engines” o módulos de análisis. Hoy en día, prácticamente todos los jugadores repasan su partida con el “amigo inhumano”, buscando los errores que se hayan cometido en la partida. Tal es así, que la evaluación de un módulo es tomada, en la actualidad, como lo más cercano a “la verdad” que conocemos; de hecho, no es extraño escuchar a los aficionados, y profesionales, hacer comentarios del tipo: “Aquí tengo 0.20 de ventaja”.
Sin embargo, me encuentro constantemente que esta herramienta es mal, o muy mal, utilizada por la mayoría de jugadores; y ello conlleva que el trabajo realizado delante del ordenador puede servir para poco o más bien nada.  Constantemente veo que ni los análisis realizados tienen valor (porque contienen errores de bulto, como ya os enseñaré), ni las conclusiones que se sacan de ellos sirven para mejorar nuestro juego y, lo que es peor, que el módulo perjudica nuestra manera de pensar en el tablero, perdiendo por ejemplo toda noción estratégica. Por ello, escribo esta serie de artículos sobre los motores de análisis con algunas ideas y consejos que nos pueden ayudar a mejorar.

FUNDAMENTOS

Soy de esas personas que, para poder utilizar algo bien, necesito comprender qué es lo que hace. Por eso, en primer lugar, voy a explicar, de manera esquemática y telegráfica, qué es lo que hace un motor por dentro para ofrecernos esas variantes y evaluaciones.

En primer lugar, hemos de comprender que un módulo de análisis consiste, básicamente, en dos sub-programas (técnicamente hablaríamos de subrutinas, pero el término sub-programa creo que se entiende mejor). La primera de ellas calcula todas las jugadas legales a partir de la posición actual. La segunda, toma cada posición y la evalúa mediante una función de evaluación. Ésta convierte la posición que hay sobre el tablero en un número que será la evaluación. Por último, el programa ordena todas las evaluaciones de mayor a menor y nos da la jugada mejor situada en dicha lista, que será la jugada que propone el ordenador.

En la jerga, a cada posición se le llama nodo, y por eso, si miráis la información que ofrece el módulo durante su cálculo, podreis ver en kN (Kilo Nodos, es decir, 1000 nodos) cuantas posiciones evalúa vuestro ordenador por segundo. Podéis haceros una idea de cómo de rápido es vuestro ordenador (técnicamente vuestro procesador, que es el que calcula).

La función de evaluación es una de las “fórmulas mágicas” de cada motor, y es lo que caracteriza, esencialmente, cada módulo. Así que, cuando elegís un motor, estáis básicamente comprando esa función de evaluación. Normalmente ésta consiste en un cálculo del material que hay en el tablero, darle un número a la movilidad o amenazas, e incluso muchos de ellos incluyen patrones para evaluar numéricamente. Por ejemplo Deep Blue añadía un “plus” numérico en caso de que un peón de torre llegara a sexta cerca del enroque rival (Peón en h6 con el rey negro enrocado en g8); o el módulo Crafty tiene un patrón para reconocer a un alfil encerrado en h2 cuando el rival juega g3 (como en la famosa partida Spassky-Fischer). Por eso, trabajar con diferentes módulos me ofrece diferentes jugadas para una misma posición, porque cada uno evalúa a su manera.

Los números que asigna la función de evaluación son totalmente arbitrarios, pues lo único que importa es qué nodo tiene la mayor evaluación. No obstante, los programadores han cambiado la escala de esos números para que tengan cierta relación con lo que los humanos entendemos (peón = 1 punto). Pero ojo, cada función de evaluación es diferente, y no podemos comparar “a pelo” los números de uno y otro módulo. Éste es uno de los primeros errores que he detectado entre los jugadores, y que debemos evitar. Tampoco podemos tomar la valoración como un número absoluto, “tener 0.25” no significa nada, más que, por la movilidad de las piezas, es probable que nuestra posición sea más cómoda; pero esa no es la información que necesita un jugador de torneo: si tiene ventaja, como se ejecuta, si es suficiente para ganar, que tipo de posición le espera, etc.

PROFUNDIDAD, PLY Y CÁLCULO BRUTO

Los programadores se hacen la misma pregunta que nos hacemos los jugadores, ¿cuando dejar de calcular y simplemente evaluar la posición?. Al igual que nos sucede a nosotros, la respuesta no es fácil. Por eso, el ordenador va calculando en “niveles de profundidad”; a medida que le dejamos tiempo para calcular una posición, va llegando más lejos en su cálculo.

Los niveles de profundidad se miden en “ply”, que es lo que en ajedrez consideramos “media jugada” (que juegue el blanco o que juegue el negro); es decir, si tengo una posición (nodo) y mediante una jugada del blanco llego a otra posición (nodo), ambas posiciones están a 1 ply de distancia. Por tanto, una profundidad de 2 ply implica que el ordenador ha calculado todas las posibles posiciones que se producen después de una jugada del blanco y una del negro.

El ordenador va progresando en esta profundidad. En primer lugar genera todas las posibles jugadas legales, y por tanto, genera todos los posibles nodos a los que podemos llegar desde la posición actual. Después evalúa todos esos nodos y los ordena de mejor a peor evaluación.  Una vez hecho todo esto el ordenador ha terminado de calcular a profundidad 1. Acto seguido, coge todas las posiciones generadas a un ply y calcula todas las posibles jugadas legales, generando todos los posibles nodos a los que llegaremos después de 2 ply, y los evalúa; así habremos llegado a profundidad 2; y así sucesivamente.

A este proceso que os he descrito se le llama cálculo bruto.

CÁLCULO SELECTIVO

El cálculo bruto es formalmente correcto, lo que sucede es que nuestro ordenador se ve obligado a calcular TODAS las posibles posiciones que surgen de cada jugada, por lo que muchas veces estará perdiendo el tiempo en posiciones absolutamente perdidas (con dama y dos torres de menos, por ejemplo).

Una idea para mejorar el rendimiento de los motores es utilizar lo que se ha llamado el cálculo selectivo. En él, el ordenador calcula todas las posibles jugadas y las evalua; pero sólo selecciona unas pocas, las mejores, para realizar el siguiente nivel de profundidad. Pongamos por ejemplo que el “nivel de selectivo” es tres; entonces el ordenador toma las tres posiciones que han llevado a las tres mejores evaluaciones y genera todas las posibles jugadas desde esas tres posiciones (nodos). Ahora, evalúa las jugadas y vuelve a elegir las tres mejores para calcular todas las posiciones del siguiente nivel de profundidad, y así sucesivamente.

El cálculo selectivo es mucho más rápido que el cálculo bruto. Además, se basa en la forma en que calculan los humanos cuando eligen las jugadas candidatas. Sin embargo, corre el riesgo de dejarse variantes interesantes en el tintero. Si una jugada entrega la dama para dar mate cinco jugadas más adelante, difícilmente podrá estar entre las tres mejores de la posición en el nivel de profundidad 1. Es más, el ordenador tendría que llegar a un nivel de profundidad 9 (bruto) para poder ver el mate.

¿Cómo se ajusta el número de jugadas que queremos en el selectivo?, la mayoría de ordenadores cuentan con un parámetro que es “número de líneas de cálculo”. Pues bien, cada vez que ahí ponéis 1, 3 o 10 estáis ajustando el número de jugadas candidatas que utiliza vuestro ordenador en el selectivo.

CÁLCULO BRUTO / SELECTIVO

Para aprovechar lo mejor de los dos mundos, los programadores han optado por un cálculo mixto, que combina el bruto y el selectivo. El ordenador primero calcula en bruto hasta un nivel de profundidad, y antes de pasar al siguiente, realiza un cálculo selectivo a mayor profundidad. Es decir, el ordenador calcula en bruto hasta profundidad 20, y luego coge las tres primeras y sigue profundizando hasta 33 con la técnica del cálculo selectivo; luego hace el cálculo bruto a profundidad 21, y vuelve a hacer el selectivo; y así sucesivamente.

Por eso, cuando miréis en la información del módulo en el apartado profundidad vais a ver una fracción 20/33, que significa nivel 20 de profundidad en cálculo bruto, nivel 33 en selectivo.

Algunos motores de análisis confían poco en el selectivo (por ejemplo Stockfish), mientras que otros creen que es lo más importante (Houdini). De momento sólo os diré que es muy importante que, en cada cálculo que hagáis, tengáis presente estos números, porque nos van a decir cuánto ha profundizado el ordenador y cómo de seguros podemos estar del resultado que nos ofrece.

VELOCIDAD CPU Y HASH TABLE

Por último, vamos a comentar dos aspectos “físicos” de nuestro ordenador: la velocidad de la CPU y la Hash Table. El ordenador tiene un procesador, que es el que calcula (esto es, el que realiza operaciones sobre los “números” que entran y ofrece unos números en su salida). Dicha velocidad son, ahora, los famosos GHZ que aparecen. Por ejemplo, un Pentium 4 a 3 GHz significa que el ordenador tiene una “velocidad” de 3GHz. Si tenéis un ordenador más rápido, en la función de cálculo de nodos y de evaluación, vuestro ordenador lo hará más rápido, y por tanto, llegará a más niveles de profundidad en menos tiempo.

Quiero subrayar que, EN MODO ALGUNO, un procesador mejor (más rápido) implica que vuestro ordenador encontrará mejores jugadas. Cualquier ordenador viejo, si le damos tiempo suficiente, encontrará la misma jugada para el mismo nivel de profundidad, que el ordenador más rápido del mundo (con el mismo motor de análisis).

Todos estos cálculos y evaluaciones que hace el ordenador los almacena en la memoria, porque en el siguiente nivel de profundidad, en lugar de empezar desde 0 los cálculos, el ordenador utiliza lo calculado en el nivel anterior para añadir “una jugada más” (es mucho más rápido, obviamente). El problema es que el ordenador tiene tres niveles de memoria (en términos básicos): Cache, RAM y Disco Duro. La memoria Caché es la que está “más cerca” del procesador, suele ser pequeña, y sirve para que el ordenador deje ahí almacenados resultados intermedios mientras hace los cálculos. Es la de acceso más rápido. La memoria RAM es un paso intermedio, es de acceso bastante rápido, y es donde la mayoría de programas se ejecuta en nuestro ordenador. El disco duro es, con mucha diferencia, la más lenta, pero es donde guardamos las cosas de forma permanente.

Durante el cálculo de posiciones de ajedrez, el ordenador genera una cantidad ingente de información (nodos, evaluaciones) que tiene que ir almacenando en algún sitio. El caché se llena muy rápidamente, por lo que la siguiente memoria a utilizar es la memoria RAM, que tiene una capacidad finita y que, a medida que avanzamos en profundidad, también se llena. Por último tenemos el disco duro, que es muy lento para nuestros objetivos.

La Hash Table es una tabla que funciona como índice de la memoria que empleamos, y que organiza todos los cálculos que ya hemos hecho, de tal forma que si el ordenador quiere encontrar donde está la evaluación de una posición, lo primero que pregunta es a la Hash table si la tiene en el índice; y si no, la calcula él de nuevo.

La mayoría de motores nos permite dimensionar (dar tamaño) a esta Hash table; es decir, nos permite decir cómo de grande es el cuaderno de notas que puede utilizar nuestro motor de ajedrez para guardar sus posiciones y evaluaciones. Si este cuaderno es muy grande, el ordenador pasará mucho tiempo recorriendo el índice buscando si tiene la posición que quiere calcular ahora. Si es muy pequeño, el ordenador constantemente tendrá que calcular posiciones que puede haber calculado ya en el pasado. Por tanto, no es tan simple como darle el mayor valor posible a la Hash Table.

La regla general dice que si nuestro procesador es muy rápido, mejor que la memoria no sea muy grande (porque le cuesta menos calcular que buscar en la memoria), mientras que si es lento debemos hacerlo al contrario. Algunos motores han publicado cúal es el valor óptimo de memoria con el que deben trabajar. Mi experiencia es que lo mejor es ajustar “a mano” estos valores para optimizar el rendimiento.

Hay otros muchos factores que tenemos que ajustar cuando vamos a trabajar ajedrez con un ordenador: emplear los compiladores adecuados, elegir la forma de compilar el motor, etc. Un motor bien optimizado puede suponer una mejoría del 40% en términos de velocidad de procesamiento (Kilonodos por segundo).

 

 

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>