NegaScout với các bàn chuyển đổi Zobrist trong cờ vua


8

Tôi đang cố gắng đưa các bảng Chuyển vị vào trinh sát alpha beta của mình. Tôi thực sự thấy một sự gia tăng tốc độ gia tăng mà tôi nghĩ vào giữa hoặc cuối trò chơi, tuy nhiên, ngay cả với kích thước bảng 1-2 GB, nó có thể hoặc không thể chậm hơn so với việc không đọc từ bảng Transpose. Tôi cũng nhận thấy một số động tác kém hiệu quả hơn nếu tôi chơi cùng một trò chơi mà không có bàn.

Tôi đã thử băm khóa Zobrist của mình và chúng xuất hiện đúng cách ngay cả sau khi thực hiện và hoàn tác các động tác. Tôi không tin họ là vấn đề. Tôi đã cố gắng làm theo lời khuyên của những bài viết này trong việc thiết kế cắt tỉa alpha / beta. http://web.archive.org/web/20070809015843/http://www.seanet.com/~brucemo/topics/hashing.htmlm http://mediocechess.blogspot.com/2007/01/guide-transposeition- bảng.html

Bất cứ ai có thể giúp tôi xác định một sai lầm? Có lẽ tôi không hiểu việc đánh giá kiểm tra alpha vs beta từ hàm băm. Hoặc là 1-2GB quá nhỏ để tạo sự khác biệt? Tôi có thể đăng thêm mã bảng chuyển vị nếu cần.

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

Tôi sẽ phải đọc rất nhiều cho đến khi tôi có thể tự mình làm điều này để giúp đỡ nhiều hơn, nhưng từ góc độ hoàn toàn C #, tôi tò mò nếu .GetInstance () được sử dụng vì một lý do cụ thể và nếu bạn có thể đăng phương thức đó / ( S)?
Jon

Câu hỏi hơi không rõ ràng - tôi có đúng không khi hiểu rằng, 1) VỚI bảng chuyển vị, bạn đánh giá cây có cùng độ sâu trong cùng thời gian với KHÔNG CÓ chuyển vị và 2) VỚI bảng chuyển vị, thuật toán chơi tốt hơn một chút so với KHÔNG CÓ hoán vị?
Martin Modrák

Câu trả lời:


0

Mã có vẻ ổn ngay từ cái nhìn đầu tiên. Tôi sẽ đề nghị lược tả bảng chuyển vị, có thể việc triển khai thực tế của bạn chỉ là làm chậm việc lưu trữ và truy xuất các mục. Điều này cũng sẽ giải thích lý do tại sao bạn có được chuyển động tốt hơn với chuyển vị, mặc dù bạn không nhận được lợi ích tốc độ.


0

Không chèn vào bảng chuyển vị tại nút lá.

Vì vậy, nhận xét lệnh "Thêm" trong khối này "if (board.terminal)"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.