ในการปรับใช้ขั้นต่ำ / สูงสุดให้เป็นเกมการวางแผนอย่างประสบความสำเร็จคุณจะต้องใช้เทคนิคหมากรุกที่มีอยู่ทั้งหมด ...
ฟังก์ชั่นการประเมินผล
แม้แต่เอนจิ้นหมากรุกก็มีจุดแข็งที่แย่มาก รุ่นที่ง่ายที่สุดของฟังก์ชั่นการประเมินผลคือ: 1 = เกมชนะโดยสีขาว, -1 = เกมที่ชนะโดยสีดำ, 0 = กรณีอื่นทั้งหมด; แต่นี่จะทำให้คุณมีประสิทธิภาพที่แย่มาก สิ่งเดียวกันนี้เกิดขึ้นกับเกมของคุณ! ถ้าคุณต้องการใช้ min / max (ด้วยการตัดอัลฟ่า / เบต้าและของอื่น ๆ ) เหมือนในหมากรุกคุณต้องใช้ฟังก์ชั่นการประเมินที่สมเหตุสมผล! มิฉะนั้นคุณจะไม่สามารถเปรียบเทียบประสิทธิภาพของอัลกอริทึมเหล่านั้นเมื่อนำไปใช้กับเกมกลยุทธ์ของคุณกับกรณีที่ใช้กับหมากรุก
ฟังก์ชั่นการประเมินผลของเครื่องมือหมากรุกคืออะไร
- ตำแหน่งของชิ้นส่วนบนกระดานดีแค่ไหน?
- ชิ้นส่วนถูกโจมตีกี่ครั้ง?
- ชิ้นส่วนป้องกันกี่ครั้ง?
- แต่ละชิ้นสามารถ "ย้าย" ได้อย่างอิสระบนกระดานได้ดีแค่ไหน? (หรือ: มีการควบคุม "จำนวน" กี่รายการ)
ส่วนต่าง ๆ ของฟังก์ชั่นการประเมินจะต้องเป็น "แปล" ในเกมของคุณก่อน:
- ตำแหน่งของชิ้น: มันอยู่บนเนินเขาซึ่งขยายขอบเขตการถ่ายภาพหรือไม่?
- ถูกโจมตี: แต่ละชิ้นมีอันตรายเท่าใด (เช่นผลรวมของค่าการโจมตีของหน่วยที่สามารถโจมตีหน่วยพิเศษคูณด้วยความน่าจะเป็นที่จะถูกโจมตีโดยความน่าจะเป็นที่เพิ่มขึ้นหากหน่วยได้รับความเสียหายแล้วลดลงหากหน่วยอื่น ๆ อยู่ในระยะของหน่วยจู่โจม)
- การโจมตีของตัวเอง: แต่ละยูนิตสามารถโจมตีได้กี่ยูนิต
- การป้องกัน: มีชิ้นส่วนของตัวเองอยู่ข้างๆเท่าไหร่ (เพื่อช่วย) บางทีหน่วยอาจไม่โจมตีหน่วยในระยะทางต่ำสุดและดีกว่าเพื่อปกป้องโดยหน่วยที่มีความเป็นไปได้ที่จะโจมตีหน่วยใกล้เคียง
- ความคล่องตัว: อุปกรณ์พกพาของคุณเป็นอย่างไร? (มันจะหนีได้ไหม)
การจัดอันดับที่แตกต่างกันจะต้องรวมกันตามฟังก์ชั่นการถ่วงน้ำหนัก (factor_a * rating_a + factor_b * ranting_b + ... ) สำหรับทุกหน่วย ...
ในเกมวางแผนจะต้องคำนึงถึงทรัพยากร (ทองไม้ ... ) ด้วย
หากฟังก์ชั่นการประเมินผลของคุณดีพอคุณไม่จำเป็นต้องค้นหา "ส่วนลึก" ลงในแผนผังเพื่อค้นหากรณีส่วนใหญ่ ดังนั้นคุณอาจต้องดูอย่างใกล้ชิดกับตัวเลือกที่มีแนวโน้มมากที่สุด 3 หรือ 10 ดูบทต่อไป ...
การเคลื่อนไหวที่เป็นไปได้ในแต่ละตำแหน่ง
สิ่งที่เป็นปัญหามากที่สุดเกี่ยวกับการใช้ min / max สำหรับเกมวางแผนคือคุณสามารถสั่งหลายยูนิตในคราวเดียวในขณะที่ในเกมหมากรุกคุณจะได้รับอนุญาตให้สั่งหนึ่งยูนิตเท่านั้น นี่เป็นสาเหตุที่ทำให้สามารถเคลื่อนที่ได้ 5 ^ N สำหรับแต่ละหน่วย "ตำแหน่ง" (คำศัพท์หมากรุก) หากคุณตัดสินใจเฉพาะระหว่าง "ย้ายทิศเหนือทิศใต้ทิศตะวันตกทิศตะวันออกหรือหยุด" สำหรับแต่ละหน่วย คุณสามารถแก้ปัญหานี้ได้โดยการแบ่งคำสั่งที่ซับซ้อนออกเป็นคำสั่งระดับต่ำ: เช่นเลือกการกระทำสำหรับหน่วย A ไปสู่ระดับความลึกและตัดสินใจเลือกหน่วย B .... ตัดสินใจเลือกหน่วย N ... จากนั้นจบเทิร์นนี้ แต่สิ่งนี้ไม่เปลี่ยนความซับซ้อน! คุณต้องปรับลำดับการดำเนินการให้เหมาะกับหน่วย (เช่นหน่วย B, C, D และหน่วย A) คุณสามารถบันทึกผลกระทบของการตัดสินใจสำหรับแต่ละหน่วยในระหว่างการคำนวณครั้งสุดท้ายแล้วเรียงลำดับตามความสำคัญ วิธีนี้การตัดแต่งอัลฟ่าเบต้าสามารถใช้เพื่อตัดชุดค่าผสมที่ไม่ดีออกจากแผนผังการค้นหาได้เร็ว ลำดับความสำคัญสูงสุดควร "ไม่ทำอะไรมากและจบเทิร์นของคุณ" (ตัดการย้ายโมฆะเป็นโมฆะ) ในการทำซ้ำแต่ละครั้ง วิธีนี้คุณสามารถ "ข้าม" การมอบหมายงานส่วนใหญ่ให้กับหน่วยงานส่วนใหญ่และปล่อยให้พวกเขาทำสิ่งที่พวกเขาทำมาก่อน วิธีนี้การค้นหาจะเจาะลึกอย่างรวดเร็วโดยเพียงแค่ดูที่ "สำคัญ" หน่วย (เช่นที่อยู่ในการต่อสู้จริง ๆ ตอนนี้) ตรวจสอบให้แน่ใจว่าได้รับคำสั่งแต่ละหน่วยครั้งเดียวเท่านั้น ... คุณสามารถใช้การสุ่มเพื่อให้แน่ใจว่าหน่วย "สำคัญ" ได้รับคำสั่งเป็นครั้งคราวเช่นกัน โดยเฉพาะอย่างยิ่งหน่วยงานที่เสร็จงานบางอย่าง (เช่น
Iterative Deepening + Caching / Hash Table
จากนั้นคุณสามารถ "เพิ่มการฝังลึก" เพื่อเจาะลึกได้มากขึ้นเรื่อย ๆ จนกว่าจะถึงเวลาที่กำหนด ดังนั้นคุณจะค้นหาลึกกว่านี้ถ้ามีหน่วยน้อยลงและคุณมี "ผลลัพธ์" อยู่เสมอหากคุณหยุดค้นหาวิธีที่ดีกว่า การวนซ้ำลึกลงไปจะต้องใช้ตารางแฮชเพื่อแคชผลลัพธ์ก่อนหน้าของการค้นหา สิ่งนี้ยังช่วยให้สามารถใช้ผลลัพธ์บางส่วนจากการค้นหารอบสุดท้าย (สาขาของแผนผังการค้นหาที่ครอบคลุมคำสั่งที่ถูกเรียกใช้จริงในเทิร์นสุดท้าย) ในการดำเนินการนี้คุณต้องมีฟังก์ชันการแฮ็กที่ดีมาก (ดูที่ "รหัส zobrist") ซึ่งสามารถอัปเดตซ้ำ ๆ ได้ การอัปเดตแป้นแฮชหมายความว่าคุณสามารถใช้รหัสแฮชของ "ตำแหน่ง" แบบเก่าและสามารถเปลี่ยนการเปลี่ยนแปลงตำแหน่งได้ (เช่น ถอดหน่วยที่ตำแหน่ง x แล้ววางที่ตำแหน่ง y) วิธีนี้จะคำนวณคีย์แฮชอย่างรวดเร็วและคุณไม่จำเป็นต้องประมวลผลสถานการณ์บอร์ดทั้งหมดเพื่อคำนวณเพียงเพื่อตรวจสอบว่าแฮชมีรายการเดิมสำหรับตำแหน่งนี้หรือไม่ ในแบบที่คุณต้องทำให้แน่ใจว่าไม่มีการชนกันของแฮชเกิดขึ้น
พฤติกรรมที่ไม่ได้กำหนดไว้ล่วงหน้า
พฤติกรรมที่ไม่ได้กำหนดไว้ล่วงหน้าเป็นปัญหาสำหรับการค้นหาขั้นต่ำ / สูงสุด ซึ่งหมายความว่าไม่แน่ใจว่าคุณจะเข้าถึงกลุ่มเป้าหมายที่ถูกโจมตี (เช่นความน่าจะเป็น 10%) จากนั้นคุณไม่สามารถวางแผนได้ว่าจะเกิดอะไรขึ้น ในกรณีนี้คุณต้องแก้ไขอัลกอริทึมและใส่เลเยอร์ "น่าจะเป็น" มันค่อนข้างเหมือนกับ "ความน่าจะเป็นที่จะเปลี่ยน" ผลลัพธ์ที่เป็นอิสระแต่ละรายการจะต้องพิจารณาแยกต่างหาก การประเมินผ่าน "เลเยอร์" ความลึกนี้จะต้องถูกสุ่มตัวอย่าง (การสุ่มตัวอย่างมอนติคาร์โล) และผลลัพธ์ของการประเมินในเชิงลึกจะต้องมีการถ่วงน้ำหนักโดยความน่าจะเป็นของการเกิดขึ้น ผลลัพธ์ของเลเยอร์ความน่าจะเป็นที่แตกต่างกันจะต้องได้รับการพิจารณาเหมือนการเคลื่อนไหวที่แตกต่างกัน (แต่แทนที่จะคำนวณขั้นต่ำ / สูงสุดจะต้องคำนวณ "ค่าเฉลี่ย") หลักสูตรนี้จะเพิ่มความซับซ้อนของโครงสร้างการค้นหา
สรุป
เมื่อใช้เทคนิคเหล่านั้นทั้งหมด (ซึ่งทั้งหมดใช้โดยเครื่องมือหมากรุกปัจจุบัน) กับเกมที่กำหนดขึ้นมาคุณจะสามารถได้รับผลลัพธ์ที่สมเหตุสมผลสำหรับเกมเช่นกัน สำหรับเกมที่ไม่ได้กำหนดค่านี้อาจมีความซับซ้อนมากกว่า แต่ฉันคิดว่ายังสามารถจัดการได้
แหล่งข้อมูลที่ดีสำหรับการอธิบายเทคนิคเหล่านั้น (สำหรับหมากรุก) คือhttp://chessprogramming.wikispaces.com/
คุณสามารถนำบางส่วนของการสุ่มแบบชี้นำมาใช้ในการค้นหาขั้นต่ำ / สูงสุด แทนที่จะตรวจสอบผลลัพธ์ที่ดีที่สุดอย่างแม่นยำเป็นอันดับแรกในการทำซ้ำแต่ละครั้งคุณสามารถสุ่มเลือกสิ่งนี้และปล่อยให้คำสั่งนั้นถูกตัดสินโดยการแจกแจงความน่าจะเป็นซึ่งขึ้นอยู่กับการประเมินในปัจจุบัน ...