วิธีการใช้ AI สำหรับตัวตรวจสอบ / ร่าง?


21

ฉันเห็นเกมตัวตรวจสอบนี้และฉันสงสัยว่าการนำ AI มาใช้อย่างไร

ฉันจะใช้ AI กับตัวตรวจสอบได้อย่างไร (ฉบับร่าง, dama, dame) มีอัลกอริทึมที่รู้จักหรือไม่?


พวกเขาเต็มไปด้วยทุกสิ่ง ฉันประหลาดใจมากที่เห็นโพสต์บล็อกการสอนเกมTic Tac Toeนี้

ดังนั้นฉันต้องการอัลกอรึทึมเกม Damaโอเพนซอร์สและโพสต์บล็อก .. มีลิงค์ที่เป็นประโยชน์หรือไฟล์เอกสารใด ๆ .. ? โปรดแจ้งให้เราทราบ ..


คุณต้องการรู้อะไรอย่างแน่นอน วิธีการนำ AI มาใช้สำหรับตัวตรวจสอบ (หรือร่าง / Dame / Dama)?
bummzack

ใช่แล้ว .. ฉันต้องใช้ AI สำหรับ Dama .. จะเริ่มต้นอย่างไร .. ? คุณช่วยฉันได้ไหม .. ฉันมีประสบการณ์ในเกมฐานฟิสิกส์เท่านั้น .. ขอบคุณ ..
Solid Soft

เพียงค้นหาเน็ตเพื่อตรวจสอบโอเพนซอร์สก็ให้ผลลัพธ์หลายอย่างแก่ฉัน นี่คือหนึ่งในงูหลามและอีกหนึ่งในJava ... ไม่ควรยากเกินกว่าที่จะทำให้สิ่งต่าง ๆ ทำงานได้จริงหรือ?
bummzack

ขอบคุณ tetrad .. ฉันลืมกฎของมันและโพสต์สิ่งนี้เป็นคำตอบ .. ขอบคุณ ..
Solid Soft

คำตอบ:


28

โอ้ฉันรักเกมเหล่านี้!

ดังนั้นสิ่งแรกก่อนเพื่อให้คอมพิวเตอร์สามารถเล่นเกมได้จำเป็น:

  1. โครงสร้างที่จะทำงานกับ
  2. กฎที่จะเล่นโดย
  3. เงื่อนไขการชนะในการทำงาน

เรามาจัดการเรื่องนี้ทีละชิ้น


โครงสร้าง

เนื่องจากบอร์ดเป็นตารางขนาด 8x8 (แต่สามารถขยายได้อย่างง่ายดาย) และแต่ละพื้นที่ตารางอาจมีอยู่ในหนึ่งในห้ารัฐเท่านั้นดังนั้นให้นิยามสถานะเหล่านั้น:

[EMPTY, WHITE_PIECE, BLACK_PIECE, WHITE_PIECE_PROMOTED, BLACK_PIECE_PROMOTED]

ENUM จะ:

[0, 1, 2, 3, 4]

ตอนนี้เรารู้ว่าแต่ละพื้นที่สามารถเป็นอะไรเราต้องการวิธีที่จะเป็นตัวแทนของช่องว่างทั้งหมดหรือคณะกรรมการถ้าคุณจะ เกือบทุกภาษาที่แข็งแกร่งจะสนับสนุนอาเรย์หลายมิติ (อาเรย์ที่แต่ละองค์ประกอบเป็นข้อมูลการเก็บอาเรย์) ดังนั้นให้หย่อนรหัสต่อไปนี้เพื่อกำหนดอาเรย์ของเรา:

BOARD_ARRAY = array(8, 8)

สิ่งนี้จะทำให้เรามีอาร์เรย์ 8 x 8 ที่เราสามารถเก็บจำนวนเต็ม (enums ของเราจากก่อน):

(
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
)

ตอนนี้คุณสามารถเห็นได้แล้วว่าสิ่งนี้เริ่มมีลักษณะเหมือนกระดาน! ฉันไม่เคยเล่นตัวแปรที่กล่าวถึงในวิดีโอ youtube แต่ดูเหมือนว่าจะเริ่มต้นด้วยชิ้นส่วนสีขาว 2 แถวหนึ่งแถวจากด้านล่างและแถวสีดำ 2 แถวหนึ่งแถวจากด้านบน ซึ่งหมายความว่าเมื่อเราเริ่มเกมอาเรย์ของเราควรมีลักษณะเช่นนี้:

(
[0, 0, 0, 0, 0, 0, 0, 0],
[2, 2, 2, 2, 2, 2, 2, 2],
[2, 2, 2, 2, 2, 2, 2, 2],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 0, 0, 0, 0, 0, 0],
)

(โปรดจำไว้ว่า 2 หมายถึง 'BLACK_PIECE' และ 1 หมายถึง 'WHITE_PIECE')

ดังนั้นตอนนี้คอมพิวเตอร์มีโครงสร้างที่จะทำงานกับ ขั้นตอนที่ 1 เสร็จสมบูรณ์!


กฎระเบียบ

ลองจินตนาการว่าคุณมีบอร์ดจริงตั้งอยู่ต่อหน้าคุณเล่นกับผู้เล่นหลัก หากคุณพยายามที่จะย้ายหนึ่งในชิ้นส่วนของเขาคุณจะได้มือตบ หากคุณพยายามที่จะย้ายชิ้นส่วนในแบบที่คุณทำไม่ได้คุณจะได้มือตบ หากคุณพยายามที่จะโกงดี ... คุณได้รับความคิด แต่ปัญหาคือคอมพิวเตอร์ทำไม่ได้ ดังนั้นจึงเป็นหน้าที่ของเราที่จะต้องมีกฎระเบียบที่เข้มงวดในการเล่นภายใน

เราจำเป็นต้องสร้างวิธีการตรวจสอบว่าการเคลื่อนไหวใด ๆ ที่ได้รับเป็น 'ถูกกฎหมาย' ซึ่งหมายความว่าเราต้องมีวิธีในการแสดง 'ย้าย' ก่อน วิธีหนึ่งคือใช้ตำแหน่งอาเรย์ ตัวอย่างเช่นการย้ายชิ้นส่วนจาก [0, 0] ถึง [0, 1] เราสามารถสร้างฟังก์ชั่นที่จะอัปเดตบอร์ดที่ให้การย้ายนั้น ดังนั้นกลับไปหย่อน:

MY_MOVE = array( [0, 0], [0, 1] )

ด้านบนแสดงถึงหนึ่งชิ้นส่วนเลื่อนลงหนึ่งช่องว่างจากมุมด้านบนของกระดาน (สมมติว่า 0, 0 คือมุมซ้ายบน) คุณอาจสังเกตว่าฉันเลือกใช้อาร์เรย์หลายมิติสำหรับการย้าย นี่เป็นเพราะชิ้นส่วนในทางทฤษฎีอาจเคลื่อนที่เป็นจำนวนมากในคราวเดียว (สำหรับชิ้นส่วน 'กระโดด') งั้นลองทำเป็นที่ 0 1 มีชิ้นส่วนฝ่ายตรงข้ามซึ่งหมายความว่าเราจะลงจอดที่ 0, 2:

MY_MOVE = array( [0, 0], [0, 2] )

ค่อนข้างง่ายใช่มั้ย โปรแกรมควรเข้าใจว่าถ้าเราข้ามช่องว่างเรากำลังกระโดดชิ้นอื่น (หรือมิฉะนั้นเป็นการย้ายที่ผิดกฎหมายและควรโยนข้อผิดพลาด) ตอนนี้ให้กระโดดสองชิ้น:

MY_MOVE = array ( [0, 0], [0, 2], [0, 4] )

สิ่งนี้ทำให้เราสามารถอธิบายการเคลื่อนไหวใด ๆ บนกระดาน เย้! ตอนนี้เนื่องจากฉันไม่เข้าใจกฎของเกมที่เป็นปัญหาอย่างสมบูรณ์ (แม้ว่าฉันเคยเล่นหมากฮอสของแคนาดาในสมัยของฉัน) กฎหมายการย้ายที่แน่นอนนั้นจะต้องถูกกำหนดโดยคุณ กระแสที่ดีจนถึงจุดนี้จะมีลักษณะดังนี้:

FUNCTION_FIND_ALL_LEGAL_MOVES( MY_BOARD ) Returns: array ALL_LEGAL_MOVES
FUNCTION_FIND_BEST_MOVE( MY_BOARD, ALL_LEGAL_MOVES ) Returns: array MY_MOVE
FUNCTION_DO_MOVE( MY_BOARD, MY_MOVE ) Throws: error ILLEGAL_MOVE Updates: MY_BOARD
repeat from start for each turn

ข้างต้นจะถือว่าคุณสามารถวนรอบแต่ละชิ้นเพื่อค้นหาการเคลื่อนไหวทางกฎหมายทั้งหมดจากนั้นรับชุดการเคลื่อนไหวตามกฎหมายทั้งหมดเลือกอย่างใดอย่างหนึ่งที่ดีที่สุด (กลยุทธ์ที่นี่) การย้ายนั้นจะถูกนำไปใช้กับกระดานหรือเกิดข้อผิดพลาด จากนั้นผู้เล่นคนต่อไปก็จะเลี้ยว ดังนั้นเราจึงมี AI ที่รู้วิธีเล่น! จอย! กำลังเดินทางไป.


การชนะ

เกมง่ายๆนั้นยอดเยี่ยมเนื่องจากการชนะถูกกำหนดโดยสถานะที่ง่ายมาก ไม่มีชิ้นส่วนสีขาวบนกระดานใช่ไหม? ฉันเดาว่าคุณชนะแล้ว! สิ่งนี้ถูกนำไปใช้ในขั้นตอนที่ 2 เมื่อเราเลือกการเคลื่อนไหวที่ดีที่สุดเพื่อพาเราเข้าใกล้เงื่อนไขการชนะ

ในการสร้าง AI ที่ชาญฉลาดมากคุณสามารถเก็บฐานข้อมูลที่เก็บบอร์ดทุกอันที่เป็นไปได้ด้วยการย้ายที่เป็นไปได้จากทุกสถานะที่เป็นไปได้เพื่อค้นหาโซ่สู่การชนะ

คุณสามารถสร้างกลยุทธ์เช่น: หากมีชิ้นส่วนที่จะถูกกระโดดให้บันทึกชิ้นนั้นหรือถ้าชิ้นหนึ่งสามารถกระโดดได้มากกว่าหนึ่งชิ้นส่วนจะทำการกระโดดนั้น


นั่นควรให้จุดกระโดดที่ดีแก่คุณมันเป็นเพียงหนึ่งในวิธีที่เป็นไปได้อย่างไม่ จำกัด อย่างแท้จริง ในทางทฤษฎีคุณสามารถสร้างหุ่นยนต์ยักษ์เพื่อวาดด้วยดินสอสีแล้วทำการวิเคราะห์สเปกตรัมในการวาดเพื่อเลือกการเคลื่อนไหว ... แต่มันก็ไม่ได้ผลดีหรือเร็ว วิธีนี้ได้ผลในอดีตและทำงานได้ดี (: หวังว่าจะช่วยได้!


คำไม่กี่คำเกี่ยวกับการใช้งาน

ตัวตรวจสอบคือสิ่งที่เรียกว่าเกม 'ที่ถูกแก้ไข' ซึ่งเราสามารถคำนวณการเคลื่อนไหวทุกครั้งโดยไม่มีสิ่งแปลกปลอม แต่นั่นเป็นการเคลื่อนไหวทั้งหมด! ดังนั้นจึงไม่มีวิธีที่จะทำทุกอย่างด้วยตนเอง ... หากมีเพียงบาง ... โอ้ขวาเราเป็นโปรแกรมเมอร์ ปั๊มกำปั้น

SQL เป็นเครื่องมือที่ยอดเยี่ยมสำหรับการจัดเก็บการเคลื่อนไหวที่ไม่มีที่สิ้นสุดเหล่านี้ทั้งหมด สำหรับผู้ที่ไม่มีประสบการณ์กับ SQL mySQL นั้นเป็นเซิร์ฟเวอร์ SQL แบบโอเพนซอร์สที่ใช้งานง่าย (ค่อนข้างง่าย) SQL ใช้สำหรับการจัดการฐานข้อมูล, sorta เหมือนสเปรดชีตบนเตียรอยด์ นอกจากนี้ยังสามารถเก็บข้อมูลจำนวนมากและทำงานกับมันได้อย่างรวดเร็ว

ดังนั้นเราจะใช้มันได้อย่างไร เนื่องจากเรารู้ว่าหากบอร์ดอยู่ในสภาพที่แน่นอน (แต่ละชิ้นในตำแหน่งที่แน่นอน) เราสามารถคำนวณการเคลื่อนไหวที่มีอยู่ทั้งหมดและบันทึกไว้ ตัวอย่างเช่น:

+Board State+          +All Possible Moves+               +Best Move+
([0,0,1,2,3],[3..)     ([0,1],[0,2]), ([7,6],[7,7],[5..)  ([7,6],[7,7])
([0,0,2,2,3],[3..)     ([0,1],[0,2]), ([7,6],[7,7],[5..)  ([5,5],[5,4])
([0,0,1,3,3],[3..)     ([0,1],[0,2]), ([7,6],[7,7],[5..)  ([4,4],[4,3])
etc...

ดังนั้นเมื่อคอมพิวเตอร์ต้องการย้ายมันก็จะค้นหาสถานะกระดาน (เก็บไว้เป็นคีย์หลัก) ในฐานข้อมูลและสามารถเลือกย้ายที่ดีที่สุด (ควรจะเอาชนะ) หรือหนึ่งในการย้ายอื่น ๆ เพื่อให้เป็นมิตรมากขึ้น AI.

เยี่ยมมากตอนนี้มาสร้างฐานข้อมูลนี้กัน ก่อนอื่นเราต้องคำนวณทุกสถานะกระดาน ซึ่งสามารถทำได้ด้วยห่วงใหญ่ที่น่ารังเกียจถ้าใครบางคนต้องการที่จะใช้เวลาและทำงานออกมามันจะยอดเยี่ยม ดูอาร์เรย์เป็นตัวเลขขนาดใหญ่หนึ่งตัวแล้วนับขึ้นไปยกเว้นในฐาน 5 (0, 1, 2, 3, 4) และเงื่อนไขว่าผู้เล่นแต่ละคนอาจมีเพียง 16 ชิ้น

ณ จุดนี้เราควรเก็บทุกสถานะกระดานและสามารถคำนวณการเคลื่อนไหวที่เป็นไปได้ทั้งหมด

เมื่อคำนวณการเคลื่อนไหวที่เป็นไปได้ทั้งหมดแล้วส่วนที่สนุกของการค้นหาเส้นทางการเคลื่อนที่ที่ดีที่สุดที่เป็นไปได้ นี่คือที่ความรู้ของฉันเริ่มสั้นและสิ่งต่าง ๆ เช่น Minimax หรือ A * เริ่มเข้ามาเล่น ขออภัยฉันไม่สามารถให้ความช่วยเหลือเพิ่มเติมได้ที่: /


4
คุณใช้ความพยายามอย่างมากในโพสต์ที่น่าชื่นชม อย่างไรก็ตามคุณไม่ได้ตอบคำถามเกี่ยวกับวิธีการใช้ AI หากคุณสามารถอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับเรื่องนั้น (หรือจัดให้มีการเชื่อมโยงที่เหมาะสม) คำตอบของคุณจะได้รับ upvotes :)
bummzack

อธิบายอย่างละเอียดในทางใด? (ฉันจะมีความสุขมากกว่านี้ด้วย) แค่อยากให้แน่ใจว่าฉันอยู่ในหน้าเดียวกัน การนำไปใช้เป็นรูปแบบ MVC หรือ ในบริบทใด ดีกับแนวคิดไม่ค่อยดีนักกับคำศัพท์สำหรับพวกเขา
Adrian Seeley

สิ่งที่ผมหมายถึงคือสิ่งที่ตามเส้นของสิ่งที่ CiscoIPPhone โพสต์ ... วิธีการใช้จริงเอไอเพื่อให้มันจริงเล่นกับคุณ :)
bummzack

+1 สำหรับความพยายามของคุณ ใช่. ฉันสนใจที่จะมีตรรกะ AI จริง ๆ เช่นกันโดยเฉพาะอย่างยิ่งจากมุมมองการนำไปปฏิบัติ
ตำนาน

Ahh, gotchya ฉันจะเขียนมันออกมาตอนนี้วิธีเดียวที่ฉันทำได้คืออยู่กับฐานข้อมูล SQL ... ดังนั้นเราจะเห็นว่าสิ่งนี้จะเกิดขึ้นได้อย่างไร ...
Adrian Seeley

31

ณ จุดใด ๆ ในเกมจำนวนของการเคลื่อนไหวที่เป็นไปได้สำหรับผู้เล่นค่อนข้างต่ำ * (ประมาณ 5) ซึ่งหมายความว่าการคิดล่วงหน้าสักสองสามก้าวประเมินการเคลื่อนไหวที่เป็นไปได้ทั้งหมดและการเลือกท่าที่ดีที่สุดทำได้

วิธีการนี้เรียกว่ามินิแมกซ์ (วิกิพีเดีย)

ในการใช้ minimax คุณจะต้องมีฟังก์ชั่นการประเมินผลที่ให้คะแนนสำหรับเลย์เอาท์บอร์ดและเครื่องเล่นที่กำหนด สำหรับการร่างไร้เดียงสาการใช้งานจะเป็นฟังก์ชั่นที่ส่งกลับจุดหนึ่งสำหรับทุกชิ้นส่วนที่ผู้เล่นมีชีวิตอยู่

แผนผังการตัดสินใจของ minimax

การแสดงภาพต้นไม้การตัดสินใจขั้นต่ำสุด (จากบทความวิกิพีเดีย) ด้านซ้ายมือคือหมายเลขเลี้ยว โหนดลีฟแต่ละโหนดมีคะแนนที่ประเมินซึ่งจะถูกสำรองข้อมูลต้นไม้เพื่อทำการตัดสินใจ

*แต่ร่างเป็นเกมที่มีปัจจัยที่แตกแขนงสูงสุดที่ได้รับการสมบูรณ์แก้ไข


3
นี่คือเหตุผลที่ฉันรักสแต็คคุณโพสต์ทฤษฎีที่จำเป็นและฉันโพสต์แอปพลิเคชันที่มีรูขนาดใหญ่สำหรับทฤษฎีใด ๆ ที่จะ plopped มา <3 สแต็ค
Adrian Seeley

5

Alpha – beta pruning เป็นอัลกอริธึมการค้นหาที่พยายามลดจำนวนโหนดที่ประเมินโดยอัลกอริธึม minimax ในแผนผังการค้นหา มันเป็นอัลกอริทึมการค้นหาขั้นสูงที่ใช้กันโดยทั่วไปสำหรับการเล่นเกมของผู้เล่นสองคน (Tic-tac-toe, Chess, Go, ฯลฯ ) มันหยุดประเมินการเคลื่อนไหวอย่างสมบูรณ์เมื่อพบว่ามีความเป็นไปได้อย่างน้อยหนึ่งครั้งที่พิสูจน์ว่าการเคลื่อนไหวนั้นแย่กว่าการตรวจสอบก่อนหน้านี้ การเคลื่อนไหวดังกล่าวไม่จำเป็นต้องมีการประเมินเพิ่มเติม เมื่อนำไปใช้กับแผนผังย่อเล็กสุดมันจะกลับมาเหมือนเดิม แต่จะตัดกิ่งที่ไม่สามารถมีอิทธิพลต่อการตัดสินใจครั้งสุดท้าย


1
ไม่สมบูรณ์ แต่ชัดเจนมีประโยชน์และเป็นจริง
Anko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.