động cơ tiếp tục chơi trò chơi


8

Chỉ cần viết xong tùy chỉnh một công cụ cờ vua bằng cách cơ bản thêm một bảng bit vào công cụ tscp tự do có sẵn. Bây giờ tôi đang thử nghiệm nó trong winboard và lưu ý rằng thường thì hai máy sẽ chơi cùng một trò chơi nhiều lần trong một trận đấu. Tôi muốn thêm một số loại cho các trò chơi bằng cách ít nhất là nó chọn các bước di chuyển bằng nhau một cách ngẫu nhiên. Tôi chỉ đang sử dụng tìm kiếm alpha-beta với thứ tự di chuyển đơn giản. Tôi đang suy nghĩ về việc chỉ thêm một số ngẫu nhiên nhỏ vào các nút lá để phá vỡ mối quan hệ nhưng tôi không thực sự thích giải pháp này vì một số phần thưởng nhỏ hơn mà hàm đánh giá sử dụng là 3-5 centipawns. Vì vậy, tôi không có đủ "chỗ" cho số ngẫu nhiên để phá vỡ các mối quan hệ.

suy nghĩ khác của tôi là để động cơ chọn ngẫu nhiên mà di chuyển để giữ khi nó tìm thấy một đánh giá == alpha. Tôi không thực sự thích điều này bởi vì tôi nghi ngờ nó ủng hộ các động thái được đặt hàng cuối cùng trong tìm kiếm.

Câu hỏi là làm thế nào tôi có thể chọn ngẫu nhiên từ các nút lá ghi điểm bằng nhau? và cũng đều?

Câu trả lời:


7

Ghi chú:

Đó là một ý tưởng tốt cho động cơ của bạn có tính quyết định. Không có lý do để chọn một di chuyển ngẫu nhiên. Bạn sẽ chỉ làm điều đó để giảm sức mạnh động cơ của bạn. Nếu bạn làm cho động cơ của bạn không xác định, bạn sẽ rất khó để gỡ lỗi và tái tạo một lỗi. Đề nghị của tôi là không làm điều đó.

Bạn không nên sửa đổi động cơ của bạn. Bạn có thể muốn sử dụng một cuốn sách mở đầu và chọn một dòng ngẫu nhiên. Nhiều GUI cờ có thể làm điều đó, ví dụ, phần mềm CuteChess . GUI GUI có thể làm điều đó.

Nhưng nếu bạn nhấn mạnh:

Chúng ta hãy xem mã nguồn Stockfish .

 Move Skill::pick_best(size_t multiPV) {

    const RootMoves& rootMoves = Threads.main()->rootMoves;
    static PRNG rng(now()); // PRNG sequence should be non-deterministic

    // RootMoves are already sorted by score in descending order
    Value topScore = rootMoves[0].score;
    int delta = std::min(topScore - rootMoves[multiPV - 1].score, PawnValueMg);
    int weakness = 120 - 2 * level;
    int maxScore = -VALUE_INFINITE;

    // Choose best move. For each move score we add two terms, both dependent on
    // weakness. One is deterministic and bigger for weaker levels, and one is
    // random. Then we choose the move with the resulting highest score.
    for (size_t i = 0; i < multiPV; ++i)
    {
        // This is our magic formula
        int push = (  weakness * int(topScore - rootMoves[i].score)
                    + delta * (rng.rand<unsigned>() % weakness)) / 128;

        if (rootMoves[i].score + push > maxScore)
        {
            maxScore = rootMoves[i].score + push;
            best = rootMoves[i].pv[0];
        }
    }

    return best;   }
  • Stockfish bắt đầu đa PV (không được hỗ trợ trong TSCP, vì vậy bạn sẽ cần tự viết mã!)
  • Tính một số ngẫu nhiên và thêm nó vào điểm số cho mỗi PV
  • So sánh từng PV có trọng số và chọn một PV tốt nhất

Bạn có thể tìm thấy các liên kết sau hữu ích:

Khuyến cáo: Đừng làm điều đó trừ khi bạn muốn làm suy yếu động cơ của mình.


Cách tiếp cận cuốn sách làm việc tuyệt vời, cảm ơn! Tôi đã đăng một câu hỏi tiếp theo về bảng chuyển vị và mảng tam giác.
nak3c
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.