Tablas de historia II

Programación retro del Commodore 64

  • Programación retro del Commodore 64
  • “Programación Retro del Commodore 64” es un blog sobre el hardware, el sistema operativo, y la programación del Commodore 64. Y más específicamente sobre programación en ensamblador. Pretende ser un blog con información de calidad, y referencia en español de la programación retro de esta maravillosa máquina.
    • Mi blog
« Publicado el: 03/07/2022 »

Ahora que ya hemos definido las tablas de historia, y sabemos manejarlas con las rutinas “newHistory”, “getHistory” e “incHistory”, vamos a usarlas. Esto se describen en los apartados siguientes:

Novedades en la rutina “thinkIter”:

En la rutina “thinkIter”, que es la que aplica la profundización iterativa, lo que vamos a hacer es inicializar las tablas de historia, para lo cual llamamos a “newHistory”:

Como se puede observar, después de preparar el proceso de búsqueda con “newPosition”, y antes de empezar la profundización iterativa que va desde X=0 hasta X=max_depth-1, aparece una nueva llamada a “newHistory”. Esta llamada es la que borra las tablas de historia.

Novedades en la rutina “search”:

Por otro lado, en la rutina “search”, tanto en la rama dedicada a la búsqueda del ratón “searchMouse”, como en la rama dedicada a la búsqueda de los gatos “searchCats”, aparecen sendas llamadas a “incHistory”:

La llamada a “incHistory” se produce después de llamar a “addHashPosMouse”, es decir, después de insertar el movimiento (admStart, admDest) en la tabla hash. Esta nueva llamada sirve para incrementar el valor de historia asociado al movimiento elegido, y el incremento puede ser de un punto o de tantos puntos como la profundidad “depth”, que es lo que está programado actualmente.

Novedades en la rutina “addMove”:

Esto ya es lo último, y consiste en generar los movimientos no con puntuación cero, como hasta ahora, sino con una puntuación igual a la de las tablas de historia:

De este modo, cuando los movimientos se desarrollan y prueban en “search”, debido a la llamada a “sort”, primero se desarrollan aquellos que tienen mayor puntuación.

Esta reordenación de movimientos debería tener un efecto positivo en la poda, en el sentido de podar más, pero no debería cambiar los movimientos que se deciden o eligen para cada tablero y para una profundidad dada.

En la práctica, sí puede haber pequeños cambios entre los movimientos que elige la versión del proyecto sin tablas de historia (versión 10) y los movimientos que eligen la nueva versión con tablas de historia (versión 11), pero siempre cambiando entre movimientos que dan lugar a tableros con la misma puntuación. Esto es, simplemente, un pequeño efecto secundario de la reordenación de movimientos.

Otras novedades:

Además de las novedades ya comentadas, hay algunas otras pequeñas novedades relacionadas con las tablas de historia, pero son de entidad menor:

  • En el fichero “Display.asm” hay una nueva rutina “displayHistory” para mostrar el contenido las tablas de historia.
  • En el fichero “Main.asm” hay un nuevo comando especial “.F” para mostrar el contenido de las tablas de historia. Llama a la rutina “displayHistory” anterior, y se usa para depuración.
  • La rutina “addHashMove”, que suma #HASH_SCORE a la puntuación de los movimientos que están en las tablas hash, ahora aplica un tope de 255 ya que, al sumarse en ocasiones también los valores de las tablas de historia, podría superarse ese valor (acarreo).

Mejora en la poda:

El objetivo de todo esto de las tablas de historia es mejorar la ordenación de los movimientos y, por tanto, la poda. Por tanto, no deberíamos concluir esta sección sin comprobar si lo hemos logrado.

En la versión 10 del proyecto, con una profundidad de análisis de 8 niveles, ante el movimiento E1F2, el C64 analizaba $29F8 = 10.744 tableros, lo cual ya era un 40% menos que con la versión 9 ($4535 = 17.717 tableros).

Veamos ahora con las tablas de historia, es decir, con la versión 11 del proyecto:

Es decir, ahora se desarrollan $DCF = 3.535 tableros, lo cual es un 67% menos que con la versión 10 ($29F8 = 10.744) y un 80% menos que con la versión 9 ($4535 = 17.717). Como se puede ver, la reducción es muy notable.


Código del proyecto: RYG3-11