เอ็นจิ้นการเขียนโปรแกรมหมากรุกเป็นดินแดนที่มีความซับซ้อนมากดังนั้นผมจะพาคุณไปที่Chess Programming Wikiซึ่งมีข้อมูลที่ดีมากมายในหัวข้อนี้
พื้นหลัง
การคำนวณหมากรุก (และสิ่งอื่น ๆ ที่คล้ายกัน) นั้นเป็นแบบอย่างและคิดว่าเป็น "แผนผังเกม" หรือ " ต้นไม้ตัดสินใจ " ในวงกว้างต้นไม้นี้เป็นกราฟกำกับโดยมีหนึ่งโหนดที่ด้านบน (ตำแหน่งปัจจุบัน) นำไปสู่โหนดสำหรับการย้ายแต่ละครั้งที่เป็นไปได้ซึ่งแต่ละอันนำไปสู่โหนดเพิ่มเติมสำหรับการย้ายครั้งต่อไปที่เป็นไปได้
ในรูปแบบที่ง่ายแรงที่สุดของพวกเขาเครื่องยนต์หมากรุกสร้างทุกตำแหน่งบนต้นไม้นี้ลงไปขีด จำกัด บางอย่างลึก ( "เร่"), การประเมินแต่ละตำแหน่งที่เกิดขึ้นอยู่กับเงื่อนไขที่ซับซ้อนบาง1 จากนั้นก็เล่นท่าที่ดูเหมือนจะนำไปสู่ผลลัพธ์ที่ดีที่สุด ทุกวันนี้เทคนิคที่ซับซ้อนมาก ๆได้รับการพัฒนาขึ้นเพื่อ จำกัด จำนวนตำแหน่งที่เครื่องยนต์ต้องมอง แต่ฉันจะไม่สนใจสิ่งเหล่านั้นเพื่อจุดประสงค์ในการตอบคำถามนี้เพราะพวกเขาไม่เปลี่ยนปัญหาจริงที่ มือ.
คณิตศาสตร์แทนเจนต์
เหตุผลพื้นฐานที่โดยทั่วไปแล้วเครื่องยนต์ใช้เวลาประมาณเท่ากันในการพิจารณาการเคลื่อนไหวแต่ละครั้งคือขนาดของแผนผังการตัดสินใจเพิ่มขึ้นแบบทวีคูณด้วยความลึก ( k
)
พิจารณาตำแหน่งเริ่มต้น ด้านบนของต้นไม้ ( k=0
) คือหนึ่งโหนด k=1
มียี่สิบอันดับแรกเป็นไปได้สำหรับสีขาวมียี่สิบโหนดที่ระดับความลึกดังนั้น จากนั้นแบล็กก็มีท่าเดินยี่สิบแบบให้เลือกสำหรับแต่ละตัวเลือกของไวท์: ดังนั้นที่k=2
นั่นก็มี20 * 20 = 400
ตำแหน่งที่เป็นไปได้! และมันจะแย่ลงเมื่อผู้เล่นพัฒนาชิ้นงานของพวกเขา!
สำหรับตัวอย่างเช่นสมมติหลอกว่ามีเสมอยี่สิบย้ายเป็นไปได้สำหรับผู้เล่นแต่ละคนในเวลาใดก็ตาม2 คุณสั่งให้คอมพิวเตอร์มองไปข้างหน้าห้าจังหวะสำหรับผู้เล่นแต่ละคน (สิบชั้น) ลองดูขนาดของต้นไม้กำลังดุร้ายในแต่ละระดับ เพื่อความสนุกเราจะดูจำนวนตำแหน่งทั้งหมดในต้นไม้ (จากด้านบนถึงระดับที่กำหนด)
Ply | Positions | Total Tree Size
----------------------------------------
0 | 1 | 1
1 | 20 | 21
2 | 400 | 421
3 | 8000 | 8421
4 | 160000 | 168421
5 | 3200000 | 3368421
6 | 64000000 | 67368421
7 | 1280000000 | 1347368421
8 | 25600000000 | 26947368421
9 | 512000000000 | 538947368421
10 | 10240000000000 | 10778947368421
ผลของแต่ละระดับเป็นทวีคูณขนาดใหญ่กว่าระดับก่อนหน้าคือว่าขนาดของต้นไม้ทั้งที่ถูกครอบงำโดยระดับล่าง ลองพิจารณาตัวอย่างด้านบน: ระดับสุดท้ายเพียงอย่างเดียวมีโหนดสิบล้านล้านโหนด ต้นไม้ที่เหลือทั้งหมดมีเพียงห้าแสนล้านเท่านั้น สิบชั้นมีประมาณ 95% ของโหนดในต้นไม้ทั้งหมด (อันที่จริงในแต่ละระดับ) ในทางปฏิบัติสิ่งนี้หมายความว่าเวลาค้นหาทั้งหมดใช้เพื่อประเมินการเคลื่อนไหว "ครั้งสุดท้าย"
ตอบ
ดังนั้นสิ่งนี้เกี่ยวข้องกับคำถามของคุณอย่างไร สมมุติว่าคอมพิวเตอร์ตั้งค่าเป็นสิบชั้นตามที่กล่าวไว้ข้างต้นและยิ่งกว่านั้น "จำ" ผลการประเมินได้ มันคำนวณการย้ายเล่นและจากนั้นคุณทำการย้าย ตอนนี้มีการย้ายไปแล้วสองครั้งดังนั้นมันจะตัดตำแหน่งทั้งหมดจากหน่วยความจำที่เกี่ยวข้องกับการเคลื่อนไหวที่ไม่ได้เกิดขึ้นและถูกทิ้งไว้กับต้นไม้ที่ลงไปอีกแปดการเคลื่อนไหวที่เหลืออยู่ซึ่งคำนวณแล้ว: 26,947,368,421 ตำแหน่ง!
เอาล่ะ! ดังนั้นเราต้องคำนวณสองครั้งสุดท้ายเท่านั้น! การใช้การประมาณ 20 การเคลื่อนไหวในแต่ละระดับความลึกจำนวนการเคลื่อนไหวทั้งหมดที่เราต้องการในการคำนวณที่นี่ยังคงเกินสิบล้านล้าน อันดับที่เราคำนวณนั้นมีเพียงบัญชี 2.5% ของความเป็นไปได้! ดังนั้นแม้โดยการแคชผลลัพธ์ของการเคลื่อนไหวครั้งสุดท้ายสิ่งที่ดีที่สุดที่เราสามารถคาดหวังได้ก็คือการเพิ่มความเร็ว 2.5%! นี่คือเหตุผลว่าทำไมถึงแม้ว่าโปรแกรมของคุณเก็บผลลัพธ์ก่อนหน้านี้โดยปกติคุณจะไม่เห็นการเร่งความเร็วที่สำคัญระหว่างการเคลื่อนไหว (ยกเว้นกรณีที่คอมพิวเตอร์พบคู่บังคับหรือบางสิ่งบางอย่างแน่นอน!)
ข้อจำกัดความรับผิดชอบด้านการทำให้เข้าใจง่าย
มีจำนวนมากของความซับซ้อนที่เกี่ยวข้องในคำถามนี้ซึ่งเป็นเหตุผลที่ผมเชื่อมโยงกับการเขียนโปรแกรมวิกิพีเดียที่ด้านบนมากและพยายามที่เดียวที่จะอธิบายคำตอบในแง่ทางคณิตศาสตร์ในวงกว้าง ในความเป็นจริงโปรแกรมทำโดยทั่วไปส่วนแคชของต้นไม้จากการย้ายไปย้ายและมีสาเหตุอื่นที่ไม่เพียงพอในตัวเอง - เหตุผลบางอย่างง่าย (เช่นสายบางอย่างอาจจะดูออกที่ดีที่จะแปดย้าย แต่จบลงด้วยการกลับมา เพื่อนคู่หูที่ย้ายเก้า!) และหลายคนที่มีความซับซ้อนสูง (โดยทั่วไปเกี่ยวข้องกับวิธีการตัดแต่งกิ่งฉลาด) ดังนั้นคอมพิวเตอร์จะต้องมองไปข้างหน้าต่อไปในความพยายามที่จะหลีกเลี่ยงการตั้งสมมติฐานที่ไม่ดีขึ้นอยู่กับความลึกของการย้ายก่อนหน้านี้
1ฉันจะไม่เข้าร่วมฟังก์ชั่นการเรียนรู้ที่นี่เพราะมันเป็นพื้นที่ที่ซับซ้อนอย่างไม่น่าเชื่อของตัวเอง
2ปัจจัยแขนงเฉลี่ย 20 คือน่าจะต่ำเกินไป