mesin terus memainkan game yang sama

8

Baru saja selesai menulis menyesuaikan mesin catur dengan pada dasarnya menambahkan bitboard ke mesin tscp yang tersedia secara bebas. Sekarang saya mengujinya di winboard dan perhatikan bahwa seringkali kedua mesin akan memainkan permainan yang sama beberapa kali dalam suatu pertandingan. Saya ingin menambahkan beberapa variasi ke gim-gim tersebut dengan setidaknya mengambilnya dengan gerakan yang sama secara acak. Saya hanya menggunakan pencarian alpha-beta dengan pemesanan langkah sederhana. Saya sedang berpikir tentang hanya menambahkan nomor acak kecil ke node daun untuk memutuskan hubungan tetapi saya tidak benar-benar menyukai solusi ini karena beberapa bonus yang lebih kecil yang menggunakan fungsi evaluasi adalah 3-5 centipawn. Jadi saya tidak punya cukup "ruang" untuk nomor acak untuk memutuskan hubungan.

Pikiran saya yang lain adalah untuk memiliki mesin memilih secara acak yang bergerak untuk tetap ketika menemukan evaluasi == alpha. Saya tidak terlalu suka ini karena saya curiga itu mendukung langkah yang dipesan terakhir dalam pencarian.

Pertanyaannya adalah bagaimana saya bisa memilih dari simpul daun skor yang sama secara acak? dan juga merata?

nak3c
sumber

Jawaban:

7

catatan:

Ini adalah yang baik ide untuk mesin Anda be deterministik. Tidak ada alasan untuk memilih langkah secara acak. Anda hanya akan melakukannya untuk menurunkan kekuatan mesin Anda. Jika Anda membuat mesin Anda tidak deterministik, Anda akan merasa sangat sulit untuk men-debug dan mereproduksi bug. Rekomendasi saya adalah jangan lakukan itu.

Anda tidak boleh memodifikasi mesin Anda. Anda mungkin ingin menggunakan buku pembuka, dan memilih garis secara acak. Banyak catur GUI dapat melakukan itu, misalnya, perangkat lunak CuteChess . Arena GUI juga bisa melakukan itu.

Tetapi jika Anda bersikeras:

Mari kita lihat kode sumber 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 memulai multi-PV (tidak didukung di TSCP, jadi Anda harus kode sendiri!)
  • Hitung angka acak dan tambahkan ke skor untuk setiap PV
  • Bandingkan setiap PV tertimbang, dan pilih yang terbaik

Anda mungkin menemukan tautan berikut ini berguna:

Rekomendasi: Jangan lakukan itu kecuali Anda ingin melemahkan mesin Anda.

Catur kecil
sumber
pendekatan buku bekerja dengan baik, terima kasih! Saya telah memposting pertanyaan tindak lanjut mengenai tabel transposisi dan array segitiga.
nak3c