Mejoras en la función de búsqueda

< El efecto horizonte [Cheoss]   [índice] La Función de evaluación >

Hasta ahora hemos visto 3 principios básicos para la búsqueda: eficiencia en la construcción del árbol, ordenación de la lista de jugadas y búsqueda quiescente.

Pues bien, con un algoritmo que cumpla estos principios y una función de evaluación mínima, que sólo valore el material, ya tenemos un programa de ajedrez que jugará sorprendentemente bien. Realmente llama la atención lo bien que puede jugar un programa sólo con lo que llevamos visto hasta ahora. Pero hay otras técnicas que podemos aplicar para refinar el proceso de búsqueda.


Profundización iterativa

La primera de estas mejoras resulta sorprendente. Consiste en realizar varias búsquedas en cada turno de juego, en lugar de una sola.

Primero realizamos una búsqueda hasta el nivel 1. Un vez terminada ésta hacemos una segunda que llegue hasta el nivel 2, y así sucesivamente, profundizando un nivel más en cada ciclo hasta que se agota el tiempo disponible para esa jugada.

Resulta paradójico: hacemos todo lo posible por reducir la búsqueda (poda alfa beta, etc) y ahora decidimos que es mejor hacer no una sino varias búsquedas por cada turno de juego. Hay varias razones que explican que hacer esto es una buena idea:

1. Por la propia naturaleza del minimax sucede que cada nivel adicional que profundizamos cuesta tanto o más tiempo de cálculo que la suma de todos los niveles anteriores.

2. Con esta técnica nos aseguramos de que siempre habrá una jugada disponible cualquiera que sea el tiempo que tenemos para realizar la jugada, ya que la búsqueda hasta los primeros niveles es casi instantánea.

3. Lo más importante es que en cada búsqueda que hacemos obtenemos información muy valiosa que utilizaremos en la siguiente búsqueda. Esta realimentación es la base de varias mejoras en el algoritmo de búsqueda. Es decir, para mejorar y hacer más rápida la función de búsqueda primero tenemos que introducir la búsqueda iterativa como paso previo. Es la base para todas las mejoras posteriores.


Línea principal

La principal mejora que aprovecha la técnica de la profundización iterativa es el uso de la línea principal. Para esto debemos tener la precaución de guardar y mantener la mejor variante cuando estamos calculando dentro de la función de búsqueda.

De esta forma cuando la búsqueda acaba tenemos no sólo la mejor jugada, también toda la línea prevista por el programa como posibles respuestas de uno y otro bando hasta la profundidad hasta donde haya llegado. Llamamos a esta variante “línea principal”.

La línea principal se utiliza para ordenar la lista de jugadas. Tenemos anotada la mejor jugada que el programa calculó para ese nivel, por tanto aprovechamos esta información para ponerla la primera en la lista.

Esto supone una mejora muy importante porque como ya hemos visto el algoritmo alfabeta es extraordinariamente sensible a la ordenación de la lista de jugadas. Teniendo en cuenta la línea principal el orden de evaluación de jugadas en el alfabeta queda así: en primer lugar la jugada recomendada por la línea principal, en segundo lugar las capturas buenas, a continuación capturas neutras y jugadas que no capturan y por último las capturas malas.


Tablas de transposición

Otra mejora importante para un programa de ajedrez es el uso de tablas de transposición. En esencia esto consiste en guardarse las posiciones que se van generando durante el proceso de búsqueda junto con la valoración que les ha asignado la función de evaluación. Es decir, nos guardamos la posición de origen, la jugada para llegar a la posición final y la valoración asignada por la función de evaluación.

De esta forma si se vuelve a presentar esta posición, el programa no debe calcular de nuevo todas las variantes, utiliza la valoración obtenida anteriormente ahorrándose mucho tiempo de cálculo. El uso de estas tablas también es útil para la detección de jaques por repetición.


Killers moves

Esta técnica consiste en mantener una lista de jugadas que demostraron ser buenas en posiciones anteriores. Estas jugadas se ponen cerca del principio de la lista para que sean procesadas primero, con la esperanza de que producirán un corte en el alfa beta y ahorrarán tiempo de cálculo.



Ventana de aspiración

Normalmente el algoritmo alfa beta comienza su camino con unos límites extremos para alfa y beta, por ejemplo 9999 y -9999. La ventana de aspiración consiste en reutilizar los valores finales de alfa y beta para la búsqueda siguiente dentro de la profundización iterativa. Utilizar unos límites más pequeños hace al algoritmo ligeramente más rápido, pero si nos salimos de los límites habrá que hacer una búsqueda completa (con límites más amplios) para estar seguros de que la jugada escogida es correcta.



< El efecto horizonte [Cheoss]   [índice] La Función de evaluación >


Miguel Ángel Embuena Molina                                  chessprogram.cheoss@gmail.com