เนื่องจากลักษณะของคำถามฉันต้องรวมข้อมูลพื้นหลังจำนวนมาก (เพราะคำถามของฉันคือ: ฉันจะ จำกัด ให้แคบลงได้อย่างไร) ที่กล่าวว่ามันสามารถสรุปได้ (ที่ดีที่สุดของความรู้ของฉัน) เป็น:
มีวิธีการใดบ้างในการค้นหาสิ่งที่ดีที่สุดในพื้นที่บนพื้นที่การค้นหาเชิงผสมที่มีขนาดใหญ่มาก?
พื้นหลัง
ในชุมชน superplay ที่ได้รับการช่วยเหลือจากเครื่องมือเราพยายามจัดหาอินพุตที่สร้างขึ้นมาเป็นพิเศษ (ไม่ได้สร้างขึ้นตามเวลาจริง) ไปยังคอนโซลวิดีโอเกมหรืออีมูเลเตอร์เพื่อลดค่าใช้จ่ายบางส่วน วิธีที่ทำได้ในขณะนี้คือการเล่นเกมแบบเฟรมต่อเฟรมและระบุอินพุตสำหรับแต่ละเฟรมมักจะทำซ้ำส่วนของการวิ่งหลายครั้ง (ตัวอย่างเช่นการรันที่เผยแพร่ล่าสุดสำหรับThe Legend of Zelda: Ocarina of Timeได้ รวมการลองใหม่ทั้งหมด 198,590 ครั้ง)
การทำให้การวิ่งเหล่านี้บรรลุเป้าหมายโดยทั่วไปนั้นมีสองปัจจัยหลักคือการวางแผนเส้นทางและการข้ามเส้นทาง อดีตคือ "ความคิดสร้างสรรค์" มากกว่าสิ่งอื่น ๆ
การวางแผนเส้นทางกำลังพิจารณาว่าผู้เล่นควรสำรวจเส้นทางโดยรวมเพื่อเล่นเกมอย่างไรและมักจะเป็นส่วนที่สำคัญที่สุดของการวิ่ง นี่คือการเลือกวิธีการเรียงลำดับที่จะใช้เช่น การเรียงลำดับฟองที่ดีที่สุดในโลกเพียงแค่ไม่ได้มีประสิทธิภาพสูงกว่าการเรียงลำดับอย่างรวดเร็วในองค์ประกอบ 1 ล้าน
อย่างไรก็ตามในความปรารถนาเพื่อความสมบูรณ์แบบการสำรวจเส้นทาง (วิธีการขนถ่ายเส้นทาง) ก็เป็นปัจจัยใหญ่เช่นกัน การเปรียบเทียบแบบต่อเนื่องนี่คือวิธีการใช้อัลกอริทึมการเรียงลำดับ บางเส้นทางไม่สามารถทำได้แม้จะไม่มีเฟรมที่เฉพาะเจาะจงมาก นี่เป็นกระบวนการที่น่าเบื่อที่สุดของการช่วยเหลือเครื่องมือและเป็นสิ่งที่ทำให้การผลิตที่เสร็จสมบูรณ์ใช้เวลาเป็นเดือนหรือเป็นปี มันไม่ใช่กระบวนการที่ยาก (สำหรับมนุษย์) เพราะมันลงไปลองใช้รูปแบบที่แตกต่างกันของความคิดเดียวกันจนกว่าจะถือว่าดีที่สุด แต่มนุษย์สามารถลองใช้รูปแบบต่าง ๆ มากมายในช่วงความสนใจของพวกเขา การประยุกต์ใช้เครื่องจักรกับงานนี้ดูเหมือนจะเหมาะสมที่นี่
เป้าหมายของฉันตอนนี้คือการพยายามที่จะทำให้กระบวนการสำรวจเส้นทางโดยทั่วไปสำหรับระบบนินเทน 64 พื้นที่ค้นหาปัญหานี้คือไกลขนาดใหญ่เกินไปที่จะถูกโจมตีด้วยวิธีแรงเดรัจฉาน เซ็กเมนต์ n-frame ของการรัน N64 มีอินพุตที่เป็นไปได้ 2 30nซึ่งหมายถึงอินพุตเพียง 30 เฟรม (วินาทีที่ 30FPS) มีอินพุตที่เป็นไปได้ 2 900ตัว มันจะเป็นไปไม่ได้ที่จะทดสอบวิธีแก้ปัญหาที่อาจเกิดขึ้นเหล่านี้ให้ใช้เวลาสองชั่วโมงเต็ม
อย่างไรก็ตามฉันไม่สนใจที่จะพยายาม (หรือมากกว่านั้นฉันจะไม่พยายามแม้แต่จะพยายาม) การเพิ่มประสิทธิภาพโดยรวมของการทำงานเต็มรูปแบบ แต่ฉันต้องการที่จะได้รับการป้อนข้อมูลเริ่มต้นใกล้เคียงกับท้องถิ่นที่เหมาะสมสำหรับเฉพาะส่วนของการทำงาน (หรือที่ใกล้ที่สุดnท้องถิ่น Optimums, การเรียงลำดับของการเพิ่มประสิทธิภาพกึ่งทั่วโลก) นั่นคือกำหนดเส้นทางและเส้นทางเริ่มต้นของเส้นทางนั้น: ค้นหาเพื่อนบ้านของการสำรวจเส้นทางนั้นเพื่อลดค่าใช้จ่าย แต่ไม่ลดทอนลงไปลองทุกกรณีที่สามารถแก้ปัญหาได้
โปรแกรมของฉันจึงควรเข้าสู่สถานะเริ่มต้นอินพุตสตรีมฟังก์ชั่นการประเมินผลและเอาท์พุทสิ่งที่ดีที่สุดในท้องถิ่นโดยลดผลลัพธ์ของการประเมินให้น้อยที่สุด
สถานะปัจจุบัน
ขณะนี้ฉันมีกรอบงานทั้งหมดที่ได้รับการดูแล ซึ่งรวมถึงการประเมินสตรีมอินพุตผ่านการปรับแต่งของอีมูเลเตอร์การตั้งค่าและการฉีกขาดการกำหนดค่า ฯลฯ และในฐานะที่ใช้แทนตัวเรียงลำดับเครื่องมือเพิ่มประสิทธิภาพเป็นอัลกอริทึมทางพันธุกรรมขั้นพื้นฐานมาก มันจะประเมินประชากรของอินพุตสตรีมจัดเก็บ / แทนที่ผู้ชนะและสร้างประชากรใหม่โดยการกลายพันธุ์สตรีมผู้ชนะ กระบวนการนี้จะดำเนินต่อไปจนกระทั่งเป็นไปตามเกณฑ์ที่กำหนดเช่นเวลาหรือหมายเลขรุ่น
โปรดทราบว่าส่วนที่ช้าที่สุดของโปรแกรมนี้จะไกลโดยการประเมินผลของสตรีมใส่นั้น นี่เป็นเพราะสิ่งนี้เกี่ยวข้องกับการจำลองเกมสำหรับn frames (ถ้าฉันมีเวลาฉันจะเขียนอีมูเลเตอร์ของตัวเองที่ให้ hooks ลงในสิ่งของประเภทนี้ แต่ตอนนี้ฉันเหลือไว้กับการสังเคราะห์ข้อความและดัดแปลงหน่วยความจำสำหรับอีมูเลเตอร์ที่มีอยู่จากกระบวนการอื่น) บนคอมพิวเตอร์หลักของฉัน ค่อนข้างทันสมัยการประเมิน 200 เฟรมใช้เวลาประมาณ 14 วินาที ดังนั้นฉันต้องการอัลกอริทึม (ให้ตัวเลือก) ที่ลดจำนวนการประเมินฟังก์ชั่น
ฉันได้สร้างระบบในกรอบที่จัดการ emulators พร้อมกัน ด้วยเหตุนี้ฉันสามารถประเมินสตรีมจำนวนหนึ่งได้พร้อมกันด้วยสเกลประสิทธิภาพเชิงเส้น แต่ในทางปฏิบัติที่จริงแล้วหากพูดถึงจำนวนอีมูเลเตอร์ที่ทำงานอยู่สามารถเป็น 8 ถึง 32 เท่านั้น (และ 32 ก็ผลักดันมันจริง ๆ ) ก่อนประสิทธิภาพของระบบจะลดลง ซึ่งหมายความว่า (ให้ตัวเลือก) อัลกอริทึมที่สามารถทำการประมวลผลในขณะที่การประเมินผลเกิดขึ้นจะเป็นประโยชน์อย่างมากเนื่องจากเครื่องมือเพิ่มประสิทธิภาพสามารถทำการยกที่หนักในขณะที่รอการประเมิน
ในการทดสอบฟังก์ชั่นการประเมินของฉัน (สำหรับเกมBanjo Kazooie ) คือหาผลรวมตามระยะทางจากผู้เล่นไปยังจุดเป้าหมาย นี่หมายถึงทางออกที่ดีที่สุดคือเข้าใกล้จุดนั้นให้เร็วที่สุด การ จำกัด การกลายพันธุ์ของอะนาล็อกสติ๊กเท่านั้นใช้เวลาหนึ่งวันจึงจะได้คำตอบที่ถูกต้อง (นี่คือก่อนที่ฉันจะใช้งานพร้อมกัน)
หลังจากเพิ่มการทำงานพร้อมกันฉันเปิดใช้งานการกลายพันธุ์ของการกดปุ่ม A และทำฟังก์ชั่นการประเมินเดียวกันที่บริเวณที่ต้องกระโดด ด้วยการรัน 24 อีมูเลเตอร์มันใช้เวลาประมาณ 1 ชั่วโมงในการเข้าถึงเป้าหมายจากสตรีมอินพุตเริ่มต้นที่ว่างเปล่า แต่อาจจะต้องทำงานเป็นเวลาหลายวันเพื่อให้ได้สิ่งที่ใกล้เคียงที่สุด
ปัญหา
ปัญหาที่ฉันเผชิญคือฉันไม่รู้เกี่ยวกับเขตข้อมูลการเพิ่มประสิทธิภาพทางคณิตศาสตร์เพียงพอที่จะรู้วิธีจำลองปัญหาการเพิ่มประสิทธิภาพของฉันอย่างถูกต้อง ! ฉันสามารถติดตามแนวคิดรวบยอดเกี่ยวกับอัลกอริธึมหลายอย่างตามที่อธิบายไว้ใน Wikipedia แต่ฉันไม่รู้วิธีจัดหมวดหมู่ปัญหาของฉันหรือเลือกอัลกอริทึมที่ล้ำสมัยสำหรับหมวดหมู่นั้น
จากสิ่งที่ฉันสามารถบอกได้ว่าฉันมีปัญหาเกี่ยวกับ combinatorial ที่มีขนาดใหญ่มาก ด้านบนของที่, ฟังก์ชั่นการประเมินผลคือไม่ต่อเนื่องมากไม่มีการไล่ระดับสีและมีที่ราบจำนวนมาก นอกจากนี้ยังมีข้อ จำกัด ไม่มากนักแม้ว่าฉันจะเพิ่มความสามารถในการแสดงความยินดีหากมันช่วยแก้ปัญหาได้ ฉันต้องการอนุญาตให้ระบุว่าไม่ควรใช้ปุ่มเริ่มตัวอย่างเช่นนี่ไม่ใช่กรณีทั่วไป
คำถาม
ดังนั้นคำถามของฉันคือ: ฉันจะทำแบบนี้ได้อย่างไร ฉันกำลังพยายามแก้ไขปัญหาการเพิ่มประสิทธิภาพประเภทใด ฉันควรใช้อัลกอริทึมแบบใด ฉันไม่กลัวที่จะอ่านงานวิจัยดังนั้นให้ฉันรู้ว่าฉันควรอ่านอะไร!
สังหรณ์ใจอัลกอริทึมทางพันธุกรรมไม่สามารถที่ดีที่สุดเพราะมันดูเหมือนจะไม่ได้เรียนรู้ ตัวอย่างเช่นหากการกดเริ่มดูเหมือนจะทำให้การประเมินแย่ลงเสมอ (เพราะหยุดเกมชั่วคราว) ควรมีนักออกแบบหรือสมองบางประเภทที่เรียนรู้: "การกดเริ่มที่จุดใดก็ไร้ประโยชน์" แต่ถึงแม้เป้าหมายนี้จะไม่สำคัญเท่าที่ฟังเพราะบางครั้งการกดปุ่มเริ่มต้นก็เป็นสิ่งที่ดีที่สุดเช่นในสิ่งที่เรียกว่า "หยุดการกระโดดถอยหลังแบบยาวไปข้างหลัง" ในSuper Mario 64 ! ที่นี่สมองจะต้องเรียนรู้รูปแบบที่ซับซ้อนมากขึ้น: "การกดเริ่มไม่มีประโยชน์ยกเว้นเมื่อผู้เล่นอยู่ในสถานะที่เฉพาะเจาะจงมากและจะดำเนินการต่อด้วยการกดปุ่ม "
ดูเหมือนว่าฉันควร (หรือเครื่องเรียนรู้ได้) เป็นตัวแทนของการป้อนข้อมูลในแบบอื่น ๆ ที่เหมาะกับการดัดแปลง อินพุตแบบเฟรมต่อเฟรมดูละเอียดเกินไปเพราะสิ่งที่จำเป็นจริงๆคือ "การกระทำ" ซึ่งอาจครอบคลุมหลายเฟรม ... แต่การค้นพบจำนวนมากถูกสร้างขึ้นแบบเฟรมต่อเฟรมดังนั้นฉันจึงไม่สามารถแยกแยะได้อย่างสมบูรณ์ การหยุดชั่วคราวไปข้างหน้าหลังยาวกระโดดดังกล่าวต้องใช้ความแม่นยำระดับเฟรม) ดูเหมือนว่าข้อเท็จจริงที่ว่าการประมวลผลข้อมูลเข้าสู่ลำดับควรเป็นสิ่งที่สามารถใช้เป็นตัวพิมพ์ใหญ่ได้ แต่ฉันไม่แน่ใจว่าจะทำอย่างไร
ขณะนี้ฉันกำลังอ่านเกี่ยวกับ (ตอบโต้) การค้นหา Tabu การค้นหาพื้นที่ใกล้เคียงขนาดใหญ่มากการเพิ่มประสิทธิภาพจากการเรียนการสอนและการเพิ่มประสิทธิภาพ Ant Colony
ปัญหานี้ยากเกินกว่าจะจัดการกับสิ่งอื่นใดนอกจากอัลกอริธึมทางพันธุกรรมแบบสุ่มหรือไม่? หรือจริง ๆ แล้วเป็นปัญหาเล็ก ๆ น้อย ๆ ที่ได้รับการแก้ไขนานมาแล้ว? ขอบคุณสำหรับการอ่านและขอขอบคุณล่วงหน้าสำหรับคำตอบใด ๆ