Sunfish adalah mesin catur yang sederhana, tetapi kuat, ditulis dalam Python. Dengan antarmuka UCI yang sederhana, dan menghapus komentar dan whitespace, hanya membutuhkan 131 baris kode! ( build/clean.sh sunfish.py | wc -l ). Namun itu bermain di peringkat di atas 2000 di Lichess.
Karena Sunfish kecil dan berusaha sederhana, kode ini menyediakan platform yang bagus untuk bereksperimen. Orang -orang telah menggunakannya untuk menguji algoritma pencarian paralel, bereksperimen dengan fungsi evaluasi, dan mengembangkan program catur pembelajaran yang mendalam. Fork It hari ini dan lihat apa yang dapat Anda lakukan!
Cara paling sederhana untuk menjalankan sufish adalah melalui antarmuka terminal "mewah":
$ tools/fancy.py -cmd ./sunfish.py
Bermain melawan Sunfish 2023.
Apakah Anda ingin menjadi putih atau hitam? hitam
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♜
hgfedcba
Skor: 23, Node: 11752, NPS: 13812, Waktu: 0.9
Langkah saya: D4
1 ♖ ♘ ♗ ♔ ♕ ♗ ♘ ♖
2 ♙ ♙ ♙ ♙ ♙ ♙ ♙
3
4 ♙
5
6
7 ♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
8 ♜ ♞ ♝ ♚ ♛ ♝ ♞ ♜
hgfedcba
Langkah Anda (misalnya C6 atau G8H6): NF6
Antarmuka terminal menggunakan notasi aljabar untuk memasukkan gerakan. Berikut adalah gambaran singkat tentang cara kerjanya: dari perspektif White, kolom diberi label ah dari kiri ke kanan dan baris diberi label 1-8 dari bawah ke atas. Setiap kuadrat dinamai dengan surat masing -masing dari angka (mis. A2, C3, H8). Sebuah langkah dikomunikasikan oleh huruf pertama dari bagian bergerak yang diikuti oleh kotak tujuan (P untuk gerakan gadai dihilangkan dan N digunakan untuk ksatria). Jika lebih dari satu bagian yang sama dapat pindah ke kotak, tentukan file bagian yang bergerak. Jika itu masih ambigu, tentukan kolom.
Untuk menggunakan antarmuka terminal, notasi yang digunakan harus dari format tertentu, jika tidak, gerakan yang dimasukkan tidak akan dibaca dengan benar. "X" kadang -kadang digunakan untuk menunjukkan penangkapan, tetapi harus dihilangkan (mis. Bd4 bukan bxd4). Jangan gunakan "+" untuk menunjukkan cek (mis. Bf7 bukan BF7+). Jangan gunakan "=" untuk menunjukkan promosi gadai (mis. E8q bukan e8 = q) untuk menunjukkan pion capture notasi yang diperlukan adalah file start diikuti oleh kuadrat akhir (mis. Gf4 bukan gf). Castling harus dilambangkan dengan huruf kecil 'O's (mis. Oo dan ooo). Menentukan file atau columm harus setelah menyatakan karya tersebut (mis. Rae1 not are1). Saat mencatat, persegi tujuan harus menjadi kuadrat, pion berakhir, bukan gadai yang ditangkap (mis. Ef6 bukan ef5).
Antarmuka terminal juga mendukung notasi eksplisit. Di sinilah kuadrat sumber dinyatakan diikuti oleh kuadrat tujuan (mis. E2E4).
Perhatikan ini membutuhkan paket python-chess. Untuk pengalaman minimalis sejati, pertama -tama kita dapat "mengemas" mola -mola ke dalam yang dapat dieksekusi (kurang dari 3kb!) Dan menjalankannya secara langsung:
$ build/pack.sh sunfish.py packed.sh Total Panjang: 2953 $ ./packed.sh Go WTime 1000 Btime 1000 WINC 1000 BINC 1000 Info Depth 1 Skor CP 0 PV D2D4 BestMove D2D4
(Lihat spesifikasi UCI untuk set lengkap perintah.)
Dimungkinkan juga untuk menjalankan Sunfish dengan antarmuka grafis, seperti pychess atau arena.
Akhirnya Anda dapat bermain Sunfish sekarang di Lichess atau bermain melawan Recursing's Rust Port, juga di Lichess, yaitu sekitar 100 ELO lebih kuat.
Ada versi eksperimental menggunakan jaringan saraf yang dapat diperbarui secara efisien. Anda dapat mengujinya menggunakan antarmuka terminal mewah seperti di atas:
$ tools/fancy.py -cmd "./sunfish_nnue.py nnue/model/tanh.pickle" ...
Berbeda dengan nnue besar di Say, Stockfish, jaringan ini hanya 1207 byte! Itu memastikan Sunfish NNUE masih bisa dikemas menjadi kurang dari 4kB. Menggunakan NNUE, Sunfish akan bermain lebih baik secara posisi, tetapi lebih buruk secara taktis, karena implementasinya masih belum cukup cepat.
Sunfish mendukung semua aturan catur, kecuali aturan 50 gerakan menggambar.
Ada banyak cara di mana Anda mungkin mencoba membuat Sunfish lebih kuat. Pertama, Anda dapat mengubah dari representasi papan ke array yang dapat berubah dan menambahkan cara cepat untuk menyebutkan potongan. Kemudian Anda dapat mengimplementasikan generasi penangkapan khusus, periksa deteksi dan periksa evasi. Anda juga bisa memindahkan semuanya ke bitboard, mengimplementasikan bagian -bagian kode dalam C atau bereksperimen dengan pencarian paralel!
Cara lain untuk membuat Sunfish lebih kuat adalah dengan memberikan lebih banyak pengetahuan tentang catur. Fungsi evaluasi saat ini hanya menggunakan tabel sepotong persegi - bahkan tidak membedakan antara midgame dan endgame. Anda juga dapat bereksperimen dengan lebih banyak pemangkasan - saat ini hanya gerakan nol yang dilakukan - dan ekstensi - saat ini tidak ada yang digunakan. Akhirnya Sunfish mungkin mendapat manfaat dari pemesanan langkah yang lebih maju, MVV/LVA dan mungkin lihat?
Cara mudah untuk mendapatkan Sunfish yang kuat adalah dengan dengan inteproeter just-time pypy. Secara khusus versi Pypy Python2.7 memberikan 250 ELO Boost dibandingkan dengan intepreter cpython (2 atau 3) pada kontrol waktu cepat:
Rank Name Elo +/- Games Score Draws
1 pypy2.7 (7.1) 166 38 300 72.2% 19.7%
2 pypy3.6 (7.1) 47 35 300 56.7% 21.3%
3 python3.7 -97 36 300 36.3% 20.7%
4 python2.7 -109 35 300 34.8% 24.3%
Nama Sunfish sebenarnya mengacu pada Sunfish Pygmy, yang merupakan salah satu ikan yang dimulai dengan huruf 'Py'. Penggunaan ikan ada dalam semangat mesin besar seperti ikan stading, zappa dan rybka.
Dalam hal warisan, Sunfish meminjam lebih banyak dari mikro-max oleh Geert Muller dan Pychess.
GNU GPL V3