NegaScout con tablas de transposición Zobrist en ajedrez

8

Estoy tratando de poner tablas de transposición en mi explorador alfa beta. Veo un aumento de velocidad incremental, creo que hacia el juego medio o tardío, sin embargo, incluso con un tamaño de mesa de 1-2 GB, puede o no ser más lento que simplemente no leer en absoluto la tabla Transponer. También estoy notando algunos movimientos menos que eficientes si tuviera que jugar exactamente el mismo juego sin las mesas.

Probé el hashing de mi clave Zobrist, y salen correctamente incluso después de hacer y deshacer movimientos. No creo que sean el problema. Traté de seguir los consejos de estos artículos al diseñar la poda alfa / beta. http://web.archive.org/web/20070809015843/http://www.seanet.com/~brucemo/topics/hashing.htm http://mediocrechess.blogspot.com/2007/01/guide-transposition- tables.html

¿Alguien puede ayudarme a identificar un error? Quizás no entiendo la evaluación de verificar alfa vs beta desde el hash. ¿O es 1-2GB demasiado pequeño para hacer la diferencia? Puedo publicar más del código de la tabla de transposición si es necesario.

 public int alphaBetaScout(Board board, int depth, int alpha, int beta, bool color, bool 
quiscence)
{
    // !!!! With or without this specific section, and any other Transpose.Insert, doesn't make the game play or evaluate any faster.
    HashType type = HashType.AlphaPrune;
    HashEntry h = Transpose.GetInstance().Get(board.zobristKey);
    if (h != null)
    {
        if (h.depth >= depth)
        {
            if (h.flag == HashType.ExactPrune)
            {
                return h.scored;
            }
            if (h.flag == HashType.AlphaPrune)
            {
                if(h.scoredState > alpha)
                {
                    alpha = h.scored;
                }
            }
            if (h.flag == HashType.BetaPrune)
            {
                if(h.scoredState < beta)
                {
                    beta = h.scored;
                }
            }
            if (alpha >= beta)
            {
                return alpha;
            }
        }
    }

    if (board.terminal)
    {
        int scoredState = board.Evaluate(color);
        Table.GetInstance().Add(board.zobristKey, depth, Entry.EXACT, scoredState);
        return scoredState;
    }

    //May do Quescience search here if necessary && depth = 0

    Stack movesGenerated = GeneratePossibleMoves();
    while(!movesGenerated.isEmpty())
    {
        int scoredState = MAXNEGASCOUT;

        board.MakeMove(movesGenerated.pop());
        int newAlpha = -(alpha +1)
        scoredState = -alphaBetaScout(board, depth - 1, newAlpha, -alpha, !color, quiscence);

        if (scoredState < beta && alpha < scoredState)
        {
            scoredState = -alphaBetaScout(board, depth - 1, -beta, -scoredState, !color, quiscence);
        }

        board.UndoMove();

        if (scoredState >= beta)
        {
            Table.GetInstance().Add(key, depth, Entry.BETA, beta);
            return scoredState;
        }

        if (scoredState > alpha)
        {
            type = HashType.ExactPrune;
            alpha = scoredState;
        }
    }
    Table.GetInstance().Add(key, depth, type, alpha);
    return alpha;
}
missCache
fuente
Tendría que leer hasta que pudiera hacerlo yo mismo para ayudar más, pero, desde una perspectiva puramente C #, tengo curiosidad de saber si .GetInstance () se usó por una razón específica y si podría publicar ese / esos método ( s)?
Jon
La pregunta no está clara: ¿estoy en lo cierto al entender que 1) CON la tabla de transposición, evalúa el árbol aproximadamente a la misma profundidad al mismo tiempo que SIN transposiciones y 2) CON la tabla de transposición, el algoritmo juega un poco mejor que SIN transposiciones?
Martin Modrák

Respuestas:

0

El código parece estar bien a primera vista. Sugeriría perfilar la tabla de transposición, tal vez su implementación real sea lenta para almacenar y recuperar las entradas. Lo que también explicaría por qué obtienes mejores movimientos con transposiciones, aunque no obtienes un beneficio de velocidad.

Martin Modrák
fuente
0

No inserte en la tabla de transposición en el nodo hoja.

Así que comente el comando "Agregar" en este bloque "if (board.terminal)"

Abel
fuente