NegaScout con tabelle di trasposizione Zobrist negli scacchi


8

Sto cercando di mettere le tabelle di trasposizione nel mio scout beta alfa. Vedo un aumento di velocità incrementale che penso verso la metà o la fine del gioco, tuttavia, anche con una dimensione del tavolo di 1-2 GB, potrebbe essere o meno lento rispetto al semplice non leggere dalla tabella Transpose. Sto anche notando alcune mosse meno che efficienti se dovessi giocare lo stesso gioco esatto senza i tavoli.

Ho testato il mio hashing delle chiavi di Zobrist e vengono fuori correttamente anche dopo aver fatto e annullato le mosse. Non credo che siano il problema. Ho provato a seguire i consigli di questi articoli nella progettazione della potatura 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

Qualcuno può aiutarmi a identificare un errore? Forse non sto capendo la valutazione del controllo di alpha vs beta dall'hash. Oppure 1-2 GB sono troppo piccoli per fare la differenza? Posso pubblicare più del codice della tabella di trasposizione, se necessario.

 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;
}

Avrei praticamente dovuto leggere fino a quando non avrei potuto farlo da solo per aiutare di più ma, dal punto di vista puramente C #, sono curioso di sapere se .GetInstance () è stato utilizzato per un motivo specifico e se è possibile pubblicare quel / quel metodo ( S)?
Jon,

La domanda è un po 'poco chiara: ho ragione di capire che 1) CON la tabella di trasposizione, si valuta l'albero alla stessa profondità contemporaneamente a SENZA trasposizioni e 2) CON la tabella di trasposizione, l'algoritmo gioca leggermente meglio di SENZA trasposizioni?
Martin Modrák,

Risposte:


0

Il codice sembra OK a prima vista. Suggerirei di profilare la tabella di trasposizione, forse l'implementazione effettiva è solo quella di rallentare la memorizzazione e il recupero delle voci. Ciò spiegherebbe anche perché si ottengono mosse migliori con le trasposizioni, sebbene non si ottenga un vantaggio in termini di velocità.


0

Non inserire nella tabella di trasposizione nel nodo foglia.

Quindi commenta il comando "Aggiungi" in questo blocco "if (board.terminal)"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.