チェスのZobrist転置テーブルを備えたNegaScout


8

転置表をアルファベータスカウトに配置しようとしています。ゲームの途中または後半に向けて、速度が徐々に向上するのはわかりますが、テーブルサイズが1〜2 GBの場合でも、トランスポーズテーブルからまったく読み取らないよりも遅くなる場合と遅くならない場合があります。また、テーブルなしでまったく同じゲームをプレイする場合、効率的な移動よりも少ないことに気づきます。

私はZobristのキーハッシュをテストしましたが、移動を行って元に戻した後でも正しくハッシュされます。私はそれらが問題であるとは思わない。これらの記事のアドバイスに従って、アルファ/ベータ剪定を設計しようとしました。 http://web.archive.org/web/20070809015843/http://www.seanet.com/~brucemo/topics/hashing.htm http://mediocrechess.blogspot.com/2007/01/guide-transposition- tables.html

誰かが間違いを特定するのを手伝ってくれる?多分私はハッシュからアルファ対ベータをチェックする評価を理解していません。または、1〜2 GBは小さすぎて違いがありませんか。必要に応じて、転置表のコードをさらに投稿できます。

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

私がこれを自分で行うことができるようになるまでは、ほとんど読む必要がありますが、純粋にC#の観点から、特定の理由で.GetInstance()が使用されているかどうか、およびその/これらのメソッドを投稿できるかどうかに興味があります( s)?
Jon

質問は少し不明確です-私は理解するのが正しいですか、1)WITH転置テーブル、WITHOUT転置とほぼ同じ時間でツリーをほぼ同じ深さで評価し、2)WITH転置テーブル、アルゴリズムはWITHOUTよりもわずかに優れています転置?
MartinModrák、2015年

回答:


0

一見コードは問題ないようです。転置テーブルをプロファイリングすることをお勧めします。実際の実装では、エントリの保存と取得が遅くなるだけかもしれません。これは、トランスポーズでより良い動きが得られる理由も説明しますが、速度の利点は得られません。


0

置換ノードのリーフノードに挿入しないでください。

したがって、このブロックの「追加」コマンドをコメントします「if(board.terminal)」

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.