Sunfish เป็นเครื่องยนต์หมากรุกที่เรียบง่าย แต่แข็งแกร่งเขียนด้วย Python ด้วยอินเทอร์เฟซ UCI ที่เรียบง่ายและลบความคิดเห็นและช่องว่างจะใช้รหัสเพียง 131 บรรทัด! ( build/clean.sh sunfish.py | wc -l ) แต่มันเล่นได้เรตติ้งสูงกว่า 2,000 ที่ Lichess
เนื่องจาก Sunfish มีขนาดเล็กและมุ่งมั่นที่จะเรียบง่ายรหัสจึงเป็นแพลตฟอร์มที่ยอดเยี่ยมสำหรับการทดลอง ผู้คนใช้มันเพื่อทดสอบอัลกอริทึมการค้นหาแบบขนานการทดลองกับฟังก์ชั่นการประเมินผลและการพัฒนาโปรแกรมหมากรุกการเรียนรู้อย่างลึกซึ้ง ส้อมวันนี้และดูว่าคุณทำอะไรได้บ้าง!
วิธีที่ง่ายที่สุดในการเรียกใช้ sufish คือผ่านอินเตอร์เฟสเทอร์มินัล "แฟนซี":
$ tools/fancy.py -cmd ./sunfish.py
เล่นกับ Sunfish 2023
คุณต้องการเป็นสีขาวหรือดำ? สีดำ
1 ♖♗♔♕♗♘
2 ♙♙♙♙♙♙
3
4
5
6
7 ♟♟♟♟♟♟
8 ♜♝♚♛♝♞
Hgfedcba
คะแนน: 23, โหนด: 11752, NPS: 13812, เวลา: 0.9
การย้ายของฉัน: D4
1 ♖♗♔♕♗♘
2 ♙♙♙♙♙♙
3
4 ♙
5
6
7 ♟♟♟♟♟♟
8 ♜♝♚♛♝♞
Hgfedcba
การย้ายของคุณ (เช่น C6 หรือ G8H6): NF6
อินเทอร์เฟซเทอร์มินัลใช้สัญลักษณ์พีชคณิตสำหรับการย้ายการเคลื่อนไหว นี่คือภาพรวมโดยย่อของวิธีการทำงาน: จากมุมมองของ White คอลัมน์จะถูกระบุว่า AH จากซ้ายไปขวาและแถวมีป้ายกำกับ 1-8 จากด้านล่างถึงด้านบน แต่ละตารางมีชื่อด้วยตัวอักษรที่เกี่ยวข้องกว่าจำนวน (เช่น A2, C3, H8) การย้ายถูกสื่อสารโดยตัวอักษรตัวแรกของชิ้นส่วนที่เคลื่อนไหวตามด้วยสี่เหลี่ยมจัตุรัสปลายทาง (p สำหรับการย้ายจำนำจะถูกละเว้นและ n ใช้สำหรับอัศวิน) หากมากกว่าหนึ่งชิ้นเดียวกันสามารถย้ายไปที่สี่เหลี่ยมให้ระบุไฟล์ของชิ้นส่วนที่เคลื่อนไหว หากยังคงคลุมเครือให้ระบุคอลัมน์
ในการใช้อินเทอร์เฟซเทอร์มินัลสัญกรณ์ที่ใช้จะต้องเป็นรูปแบบเฉพาะมิฉะนั้นการย้ายที่ป้อนจะไม่ถูกอ่านอย่างถูกต้อง บางครั้ง "X" ถูกใช้เพื่อแสดงถึงการจับภาพ แต่ต้องละเว้น (เช่น BD4 ไม่ใช่ BXD4) อย่าใช้ "+" เพื่อแสดงการตรวจสอบ (เช่น BF7 ไม่ใช่ BF7+) อย่าใช้ "=" เพื่อแสดงถึงโปรโมชั่นจำนำ (เช่น E8Q ไม่ใช่ E8 = Q) เพื่อแสดงถึงการจำนำการจับภาพสัญกรณ์ที่จำเป็นกำลังเริ่มต้นไฟล์ตามด้วยสแควร์สิ้นสุด (เช่น GF4 ไม่ใช่ GF) Castling จะต้องแสดงด้วยตัวพิมพ์เล็ก 'O's (เช่น OO และ OOO) การระบุไฟล์หรือ columm จะต้องเป็นหลังจากระบุชิ้นส่วน (เช่น RAE1 ไม่ใช่ 1) เมื่อสังเกตเห็น en passant สี่เหลี่ยมจัตุรัสควรเป็นสี่เหลี่ยมจัตุรัสการจำนำจะจบลงไม่ใช่การจำนำที่ถูกจับ (เช่น EF6 ไม่ใช่ EF5)
อินเทอร์เฟซเทอร์มินัลยังรองรับสัญกรณ์ที่ชัดเจน นี่คือจุดที่จัตุรัสแหล่งที่มาระบุตามด้วยสี่เหลี่ยมจัตุรัสปลายทาง (เช่น E2E4)
หมายเหตุสิ่งนี้ต้องใช้แพ็คเกจ Python-Chess สำหรับประสบการณ์มินิมัลลิสต์ที่แท้จริงก่อนอื่นเราสามารถ "แพ็ค" sunfish ลงในการปฏิบัติการบีบอัด (น้อยกว่า 3KB!) และเรียกใช้โดยตรง:
$ build/pack.sh sunfish.py packed.sh ความยาวทั้งหมด: 2953 $ ./packed.sh ไป wtime 1000 btime 1,000 winc 1000 binc 1000 ข้อมูลความลึก 1 คะแนน CP 0 PV D2D4 Bestmove d2d4
(ดูข้อมูลจำเพาะ UCI สำหรับชุดคำสั่งเต็มรูปแบบ)
นอกจากนี้ยังเป็นไปได้ที่จะเรียกใช้ Sunfish ด้วยอินเทอร์เฟซกราฟิกเช่น Pychess หรือ Arena
ในที่สุดคุณก็สามารถเล่น Sunfish ได้ใน Lichess หรือเล่นกับพอร์ตสนิมของ Recursing Recursing และที่ Lichess ซึ่งมีความแข็งแกร่งประมาณ 100 ELO
มีรุ่นทดลองโดยใช้เครือข่ายประสาทที่ปรับปรุงได้อย่างมีประสิทธิภาพ คุณสามารถทดสอบได้โดยใช้อินเทอร์เฟซเทอร์มินัลแฟนซีดังกล่าวข้างต้น:
$ tools/fancy.py -cmd "./sunfish_nnue.py nnue/models/tanh.pickle" -
ตรงกันข้ามกับ NNUE ขนาดใหญ่ใน Say, Stockfish, เครือข่ายนี้มีเพียง 1207 ไบต์! นั่นทำให้แน่ใจว่า Sunfish NNUE ยังคงสามารถบรรจุได้น้อยกว่า 4KB การใช้ NNUE, Sunfish จะเล่นได้ดีขึ้นในตำแหน่งที่ดีขึ้น แต่แย่ลงอย่างมีเหตุผลเนื่องจากการดำเนินการยังไม่เร็วพอ
Sunfish สนับสนุนกฎหมากรุกทั้งหมดยกเว้นกฎการวาด 50 ครั้ง
มีหลายวิธีที่คุณอาจพยายามทำให้ Sunfish แข็งแกร่งขึ้น ก่อนอื่นคุณสามารถเปลี่ยนจากการเป็นตัวแทนของบอร์ดเป็นอาร์เรย์ที่ไม่แน่นอนและเพิ่มวิธีที่รวดเร็วในการแจกแจงชิ้นส่วน จากนั้นคุณสามารถใช้การสร้างการจับภาพโดยเฉพาะตรวจจับการตรวจจับและตรวจสอบการหลีกเลี่ยง คุณสามารถย้ายทุกอย่างไปยังบิตบอร์ดใช้ส่วนหนึ่งของรหัสใน C หรือทดลองด้วยการค้นหาแบบขนาน!
อีกวิธีหนึ่งในการทำให้ Sunfish แข็งแกร่งขึ้นคือการให้ความรู้เกี่ยวกับหมากรุกมากขึ้น ฟังก์ชั่นการประเมินผลปัจจุบันใช้ตารางสแควร์ชิ้นเดียวเท่านั้น - มันไม่ได้แยกความแตกต่างระหว่าง midgame และ endgame นอกจากนี้คุณยังสามารถทดลองกับการตัดแต่งกิ่งได้มากขึ้น - ปัจจุบันมีเพียงการเคลื่อนไหว NULL เท่านั้น - และส่วนขยาย - ปัจจุบันไม่มีการใช้งาน ในที่สุด Sunfish อาจได้รับประโยชน์จากการสั่งซื้อขั้นสูงมากขึ้น MVV/LVA และดูบางที?
วิธีที่ง่ายในการรับ Sunfish ที่แข็งแกร่งคือการทำงานกับ Intepreter ของ Pypy ในเวลา โดยเฉพาะอย่างยิ่ง Pypy รุ่น Python2.7 ให้การเพิ่ม 250 ELO เมื่อเทียบกับ cpython (2 หรือ 3) IntEpreters ที่การควบคุมเวลาที่รวดเร็ว:
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%
ชื่อ Sunfish จริง ๆ แล้วหมายถึง Pygmy Sunfish ซึ่งเป็นหนึ่งในปลาน้อยมากที่จะเริ่มต้นด้วยตัวอักษร 'py' การใช้ปลาอยู่ในจิตวิญญาณของเครื่องยนต์ที่ยิ่งใหญ่เช่น Stockfish, Zappa และ Rybka
ในแง่ของมรดกซันฟิชยืมมาจาก Micro-Max โดย Geert Muller และ Pychess
GNU GPL V3