นี่คือความท้าทายรายปักษ์ # 3 ชุดรูปแบบ: อัลกอริทึมทางพันธุกรรม
ความท้าทายนี้เป็นส่วนหนึ่งของการทดลอง เราต้องการที่จะเห็นสิ่งที่เราสามารถทำได้ท้าทายด้วยปัญญาขั้นตอนวิธีทางพันธุกรรม ไม่ใช่ทุกอย่างอาจจะดีที่สุด แต่เราพยายามอย่างดีที่สุดเพื่อให้สามารถเข้าถึงได้ ถ้าสิ่งนี้ใช้ได้ผลใครจะรู้ว่าเราจะเห็นอะไรในอนาคต อาจเป็น King of the Hill ทางพันธุกรรมหรือไม่?
สเป็คค่อนข้างยาว! เราได้พยายามแยกข้อมูลจำเพาะออกเป็นพื้นฐาน - ขั้นต่ำเปล่าที่คุณต้องรู้เพื่อเริ่มเล่นกับกรอบงานและส่งคำตอบ - และรายละเอียด The Gory - ข้อมูลจำเพาะทั้งหมดพร้อมรายละเอียดทั้งหมดเกี่ยวกับตัวควบคุมตามที่คุณ สามารถเขียนของคุณเอง
หากคุณมีคำถามใด ๆอย่าลังเลที่จะเข้าร่วมกับเราในการแชท!
คุณเป็นนักวิจัยด้านจิตวิทยาพฤติกรรม เย็นวันศุกร์และคุณและเพื่อนร่วมงานของคุณตัดสินใจที่จะสนุกและใช้หนูทดลองของคุณเพื่อการแข่งขันหนูตัวน้อย ในความเป็นจริงก่อนที่เราจะได้รับความรู้สึกทางอารมณ์เกินไปที่จะพวกเขาให้เรียกพวกเขาตัวอย่าง
คุณได้สร้างลู่วิ่งเล็ก ๆ น้อย ๆ สำหรับชิ้นงานทดสอบและเพื่อให้น่าสนใจยิ่งขึ้น ตอนนี้ตัวอย่างของคุณยังคงเป็นหนู ... พวกมันไม่รู้ว่ากับดักหรือเครื่องเคลื่อนย้ายมวลสารคืออะไร สิ่งที่พวกเขาเห็นคือบางสิ่งที่มีสีต่างกัน พวกเขายังไม่มีหน่วยความจำใด ๆ - สิ่งที่พวกเขาทำได้คือตัดสินใจตามสภาพแวดล้อมปัจจุบัน ฉันเดาว่าการคัดเลือกโดยธรรมชาติจะเลือกตัวอย่างที่รู้วิธีหลีกเลี่ยงกับดักจากสิ่งที่ไม่ทำ (การแข่งขันนี้จะต้องใช้เวลาสักครู่ ... ) ให้เกมเริ่มต้นขึ้น! †
† 84,465 ตัวอย่างถูกทำร้ายในการสร้างความท้าทายนี้
พื้นฐาน
เกมนี้เป็นเกมที่เล่นคนเดียว (คุณและเพื่อนร่วมงานของคุณไม่ต้องการรวมประชากรเพื่อให้แต่ละคนสร้างเส้นทางการแข่งขันของตัวเอง) สนามแข่งเป็นตารางสี่เหลี่ยมสูง15เซลล์และกว้าง50เซลล์ คุณเริ่มต้นด้วย 15 ตัวอย่างบนเซลล์สุ่ม (ไม่จำเป็นต้องแตกต่างกัน) ที่ขอบซ้าย (โดยที่x = 0 ) ตัวอย่างของคุณควรพยายามไปให้ถึงเป้าหมายซึ่งเป็นเซลล์ใด ๆ ที่x ≥ 49และ0 ≤ y ≤ 14 (ชิ้นงานอาจเกินเส้นทางไปทางขวา) ทุกครั้งที่เกิดเหตุการณ์นี้คุณจะได้รับคะแนน คุณเริ่มเกมด้วย 1 แต้ม คุณควรพยายามที่จะเพิ่มคะแนนของคุณหลังจาก10,000รอบ
ตัวอย่างหลายรายการอาจครอบครองเซลล์เดียวกันและจะไม่ทำงาน
ในแต่ละตาแต่ละรอบจะมองเห็นตาราง 5x5 ของสิ่งรอบตัว (อยู่ตรงกลาง) เซลล์ของตารางที่แต่ละคนจะมีสีที่จะ-1
หมายถึงเซลล์ที่อยู่นอกขอบเขต ชิ้นงานของคุณจะตายถ้ามันเคลื่อนที่ออกนอกขอบเขต สำหรับสีอื่น ๆ พวกมันเป็นตัวแทนของเซลล์ที่ว่างเปล่ากับดักผนังและเครื่องเคลื่อนย้ายมวลสาร แต่ชิ้นงานของคุณไม่รู้ว่าสีอะไรแสดงถึงอะไรและไม่ใช่คุณ มีข้อ จำกัด บางอย่างแม้ว่า:15
-1
- 8สีจะแสดงเซลล์ว่าง
- 4สีจะเป็นตัวแทนของเครื่องเคลื่อนย้ายมวลสาร เครื่องเคลื่อนย้ายมวลสารจะส่งชิ้นงานไปยังเซลล์ที่ต้องการภายในพื้นที่ใกล้เคียงขนาด 9x9 ออฟเซ็ตนี้จะเหมือนกันสำหรับเครื่องเคลื่อนย้ายมวลสารที่มีสีเดียวกันทั้งหมด
- 2สีจะเป็นตัวแทนของผนัง การเคลื่อนย้ายเข้าไปในกำแพงก็เหมือนกับการหยุดนิ่ง
- 2สีจะแสดงถึงกับดัก กับดักระบุว่าหนึ่งใน 9 เซลล์ในพื้นที่ใกล้เคียงนั้นเป็นอันตรายถึงตาย (ไม่จำเป็นต้องเป็นเซลล์ดักจับเอง) ออฟเซ็ตนี้จะเหมือนกันสำหรับกับดักที่มีสีเดียวกันทั้งหมด
ทีนี้เกี่ยวกับการคัดเลือกโดยธรรมชาตินั้น ... แต่ละตัวอย่างมีจีโนมซึ่งมีจำนวน100บิต ตัวอย่างใหม่จะถูกสร้างขึ้นโดยการผสมพันธุ์ตัวอย่างที่มีอยู่สองตัวจากนั้นทำการผ่าเหล่าจีโนมเล็กน้อย ยิ่งชิ้นงานที่ประสบความสำเร็จมากเท่าไรโอกาสในการทำซ้ำก็จะยิ่งมากขึ้นเท่านั้น
นี่คือหน้าที่ของคุณ:คุณจะเขียนฟังก์ชั่นเดียวซึ่งได้รับเป็นอินพุตของตารางสี 5x5 ที่ชิ้นงานเห็นและจีโนม ฟังก์ชั่นของคุณจะคืนค่าการย้าย (Δx, Δy) สำหรับชิ้นงานทดสอบโดยที่ΔxและΔyแต่ละคนจะเป็นหนึ่งใน{-1, 0, 1}
นั้น คุณต้องไม่ยืนยันข้อมูลใด ๆ ระหว่างการเรียกใช้ฟังก์ชัน ซึ่งรวมถึงการใช้เครื่องสร้างตัวเลขสุ่มของคุณเอง ฟังก์ชั่นของคุณจะได้รับ RNG ที่มีค่าซึ่งคุณสามารถใช้ได้ฟรีตามที่คุณต้องการ
คะแนนของการส่งของคุณจะเป็นค่าเฉลี่ยทางเรขาคณิตของจำนวนคะแนนใน50แทร็คสุ่ม เราพบว่าคะแนนนี้อาจมีการเปลี่ยนแปลงเล็กน้อย ดังนั้นคะแนนเหล่านี้จะเป็นเบื้องต้น เมื่อความท้าทายนี้สิ้นสุดลงจะมีการประกาศกำหนดเวลา ในตอนท้ายของกำหนดส่ง 100 บอร์ดจะถูกสุ่มเลือกและการส่งทั้งหมดจะได้รับการช่วยเหลือใน 100 บอร์ด อย่าลังเลที่จะใส่คะแนนโดยประมาณในคำตอบของคุณ แต่เราจะทำคะแนนให้ทุกการส่งเพื่อให้แน่ใจว่าไม่มีใครโกง
เราได้จัดทำโปรแกรมควบคุมในภาษาต่างๆ ขณะนี้คุณสามารถเขียนส่งของคุณในหลาม (2 หรือ 3), ทับทิม , C ++ , C #หรือJava ตัวควบคุมสร้างบอร์ดเรียกใช้เกมและให้กรอบสำหรับอัลกอริทึมทางพันธุกรรม สิ่งที่คุณต้องทำคือให้ฟังก์ชั่นการเคลื่อนที่
เดี๋ยวก่อนฉันจะทำยังไงกับจีโนม?
ความท้าทายคือการคิดออก!
เนื่องจากชิ้นตัวอย่างไม่มีหน่วยความจำสิ่งที่คุณได้รับในรอบนั้นคือตารางสี 5x5 ที่ไม่ได้มีความหมายอะไรสำหรับคุณ ดังนั้นคุณจะต้องใช้จีโนมเพื่อให้บรรลุเป้าหมาย แนวคิดทั่วไปคือคุณใช้ส่วนต่าง ๆ ของจีโนมเพื่อเก็บข้อมูลเกี่ยวกับสีหรือโครงร่างกริดและบอทของคุณจะทำการตัดสินใจเกี่ยวกับข้อมูลเพิ่มเติมที่เก็บไว้ในจีโนม
ตอนนี้แน่นอนคุณไม่สามารถจัดเก็บอะไรที่นี่ด้วยตนเองได้ ดังนั้นข้อมูลจริงที่เก็บไว้ในตอนแรกจะถูกสุ่มอย่างสมบูรณ์ แต่อัลกอริทึมทางพันธุกรรมจะเลือกตัวอย่างที่จีโนมมีข้อมูลที่ถูกต้องในไม่ช้าในขณะที่ฆ่าสิ่งที่มีข้อมูลผิด เป้าหมายของคุณคือการค้นหาการแมปจากจีโนมบิตและมุมมองของคุณไปสู่การเคลื่อนไหวซึ่งช่วยให้คุณค้นหาเส้นทางไปยังเป้าหมายได้อย่างรวดเร็วและพัฒนาไปสู่กลยุทธ์ที่ชนะอย่างสม่ำเสมอ
ควรมีข้อมูลเพียงพอที่จะเริ่มต้นใช้งาน หากคุณต้องการคุณสามารถข้ามส่วนถัดไปและเลือกตัวควบคุมที่คุณเลือกได้จากรายการตัวควบคุมที่ด้านล่าง (ซึ่งมีข้อมูลเกี่ยวกับวิธีการใช้ตัวควบคุมเฉพาะนั้น)
อ่านต่อหากคุณต้องการทั้งหมด ...
รายละเอียดเลือด
ข้อกำหนดนี้เสร็จสมบูรณ์ ตัวควบคุมทั้งหมดต้องใช้กฎเหล่านี้
การสุ่มทั้งหมดใช้การแจกแจงแบบสม่ำเสมอเว้นแต่จะระบุไว้เป็นอย่างอื่น
ติดตามรุ่น:
- แทร็กเป็นตารางสี่เหลี่ยมกว้างX = 53เซลล์และสูงY = 15เซลล์ เซลล์ที่มีx ≥ 49เป็นเซลล์เป้าหมาย (โดยที่xเป็นศูนย์)
- แต่ละเซลล์มีสีเดียวและอาจจะหรืออาจจะไม่ตาย - เซลล์ไม่ได้ตายนอกจากที่ระบุไว้โดยหนึ่งในเซลล์ชนิดที่อยู่ด้านล่าง
- มีสีของเซลล์ที่แตกต่างกัน16สีติดป้ายจาก
0
เป็น15
ซึ่งความหมายจะเปลี่ยนจากเกมหนึ่งเป็นอีกเกม นอกจากนี้ยัง-1
แสดงให้เห็นถึงเซลล์ที่อยู่นอกขอบเขต - เหล่านี้เป็นตาย - เลือก8 สีแบบสุ่ม สิ่งเหล่านี้จะเป็นเซลล์ว่าง (ซึ่งไม่มีผลกระทบ)
- เลือก4 สีแบบสุ่มมากขึ้น นี่คือเครื่องเคลื่อนย้ายมวลสาร สำหรับสองสีเหล่านี้ให้เลือกการชดเชยที่ไม่เป็นศูนย์ในพื้นที่ใกล้เคียง9x9 (ตั้งแต่ (-4, -4) ถึง (4,4) ยกเว้น (0,0)) สำหรับอีกสองสีให้สลับการชดเชยเหล่านั้น หากชิ้นงานทดสอบไปที่เครื่องเคลื่อนย้ายมวลสารมันจะถูกเคลื่อนย้ายทันทีโดยการชดเชยนั้น
- เลือก2 สีแบบสุ่มมากขึ้น นี่คือกับดัก สำหรับแต่ละสีเหล่านี้ให้เลือกการชดเชยในพื้นที่ใกล้เคียง 3x3 (จาก (-1, -1) ถึง (1,1)) กับดักแสดงให้เห็นว่าเซลล์ที่ว่าชดเชยตาย หมายเหตุ:เซลล์กับดักนั้นไม่จำเป็นว่าจะต้องตาย
- 2 สีเหลือผนังซึ่งเป็นอุปสรรคต่อการเคลื่อนไหว ความพยายามที่จะย้ายไปยังเซลล์ผนังจะทำให้การเคลื่อนไหวยังคงอยู่ เซลล์ผนังตัวเองตาย
- สำหรับแต่ละเซลล์ที่ไม่ใช่เป้าหมายของตารางให้เลือกสีแบบสุ่ม สำหรับแต่ละเซลล์เป้าหมายให้เลือกสีที่ว่างเปล่าแบบสุ่ม
- สำหรับแต่ละเซลล์ที่ขอบด้านซ้ายของแทร็กตรวจสอบว่าสามารถเข้าถึงเป้าหมายได้ภายใน100 ตาแหน่ง (ตามกฎของลำดับการเลี้ยวด้านล่าง) ถ้าเป็นเช่นนั้นเซลล์นี้เป็นเซลล์เริ่มต้นที่ยอมรับได้ หากมีเซลล์เริ่มต้นน้อยกว่า 10 เซลล์ให้ทิ้งแทร็กและสร้างเซลล์ใหม่
- สร้าง15ตัวอย่างแต่ละคนมีจีโนมแบบสุ่มและอายุ0 วางชิ้นงานแต่ละชิ้นบนเซลล์เริ่มต้นแบบสุ่ม
เปิดคำสั่ง:
- ขั้นตอนต่อไปนี้จะดำเนินการตามลำดับสำหรับแต่ละตัวอย่าง ตัวอย่างไม่โต้ตอบหรือเห็นซึ่งกันและกันและอาจครอบครองเซลล์เดียวกัน
- หากอายุของตัวอย่างเท่ากับ100มันจะตาย มิฉะนั้นเพิ่มอายุโดย 1
- ชิ้นงานจะได้รับมุมมองของมัน - ตารางสี 5x5 โดยมีศูนย์กลางอยู่ที่ชิ้นงาน - และคืนค่าการเคลื่อนที่ในพื้นที่ใกล้เคียง 3x3 การย้ายที่อยู่นอกช่วงนี้จะทำให้คอนโทรลเลอร์หยุดทำงาน
- หากเซลล์เป้าหมายเป็นผนังการเคลื่อนที่จะเปลี่ยนเป็น (0,0)
- หากเซลล์เป้าหมายเป็นเครื่องเคลื่อนย้ายมวลสารตัวอย่างจะถูกเคลื่อนย้ายโดยการชดเชยของเครื่องเคลื่อนย้ายมวลสาร หมายเหตุ:ขั้นตอนนี้จะดำเนินการเพียงครั้งเดียวไม่ใช่ซ้ำ ๆ
- หากในปัจจุบันเซลล์ครอบครองโดยชิ้นงาน (อาจเกิดขึ้นหลังจากใช้เครื่องเคลื่อนย้ายมวลสารหนึ่งอัน) จะทำให้ชิ้นงานตายลง นี่เป็นเพียงครั้งเดียวที่ชิ้นงานจะตาย (นอกเหนือจากขั้นตอนที่ 1.1 ด้านบน) โดยเฉพาะตัวอย่างใหม่ที่วางไข่บนเซลล์ที่ตายแล้วจะไม่ตายทันที แต่มีโอกาสที่จะย้ายออกจากเซลล์อันตรายก่อน
- หากชิ้นทดสอบครอบครองเซลล์เป้าหมายให้คะแนนจุดย้ายชิ้นตัวอย่างไปยังเซลล์เริ่มต้นสุ่มและรีเซ็ตอายุของมันเป็น 0
- หากเหลือตัวอย่างน้อยกว่าสองตัวบนกระดานเกมจะจบลง
- สร้าง10ตัวอย่างใหม่กับอายุ0 จีโนมแต่ละตัวจะถูกกำหนด (แยก) โดยกฎการผสมพันธุ์ด้านล่าง วางชิ้นงานแต่ละชิ้นบนเซลล์เริ่มต้นแบบสุ่ม
การปรับปรุงพันธุ์:
เมื่อมีการสร้างตัวอย่างใหม่ให้เลือกผู้ปกครองที่แตกต่างกันสองคนโดยการสุ่มโดยมีอคติต่อชิ้นงานที่เลื่อนไปทางขวา น่าจะเป็นของชิ้นงานที่ได้รับเลือกเป็นสัดส่วนกับปัจจุบันคะแนนออกกำลังกาย คะแนนความฟิตของชิ้นงานคือ
1 + x + 50 * จำนวนครั้งที่ไปถึงเป้าหมาย
โดยที่xคือดัชนีแนวนอน 0-based ไม่สามารถเลือกตัวอย่างที่สร้างในเทิร์นเดียวกันได้ในฐานะผู้ปกครอง
ในพ่อแม่ทั้งสองให้เลือกหนึ่งสุ่มเพื่อรับจีโนมบิตแรกจาก
- ตอนนี้เมื่อคุณเดินไปตามจีโนมให้เปลี่ยนความน่าจะเป็นของผู้ปกครองที่0.05และเอาบิตจากผู้ปกครองที่เกิดขึ้น
- กลายพันธุ์จีโนมประกอบอย่างเต็มที่: สำหรับแต่ละบิตพลิกมันมีความน่าจะ0.01
เกณฑ์การให้คะแนน:
- เกมหนึ่งใช้เวลา10,000รอบ
- ผู้เล่นเริ่มเกมด้วย 1 แต้ม (เพื่ออนุญาตให้ใช้ค่าเฉลี่ยทางเรขาคณิต)
- ทุกครั้งที่ชิ้นงานไปถึงเป้าหมายผู้เล่นจะทำคะแนน
- สำหรับตอนนี้การส่งผู้เล่นแต่ละคนจะถูกเรียกใช้สำหรับ50เกมแต่ละเกมมีแทร็กสุ่มแตกต่างกัน
- วิธีการข้างต้นส่งผลให้เกิดความแปรปรวนมากกว่าที่ต้องการ เมื่อความท้าทายนี้สิ้นสุดลงจะมีการประกาศกำหนดเวลา ในตอนท้ายของกำหนดส่ง 100 บอร์ดจะถูกสุ่มเลือกและการส่งทั้งหมดจะได้รับการช่วยเหลือใน 100 บอร์ด
- คะแนนโดยรวมของผู้เล่นคือค่าเฉลี่ยทางเรขาคณิตของคะแนนของแต่ละเกม
ผู้ควบคุม
คุณสามารถเลือกตัวควบคุมต่อไปนี้ได้ (เนื่องจากเทียบเท่ากับการใช้งาน) เราได้ทดสอบทั้งหมดแล้ว แต่ถ้าคุณพบจุดบกพร่องต้องการปรับปรุงโค้ดหรือประสิทธิภาพหรือเพิ่มคุณสมบัติเช่นเอาท์พุทกราฟิกโปรดส่งปัญหาหรือส่งคำขอดึงบน GitHub! คุณยังสามารถเพิ่มคอนโทรลเลอร์ใหม่ในภาษาอื่น!
คลิกชื่อภาษาสำหรับแต่ละคอนโทรลเลอร์เพื่อไปยังไดเรกทอรีที่ถูกต้องบน GitHub ซึ่งมีREADME.md
คำสั่งการใช้งานที่แน่นอน
หากคุณไม่คุ้นเคยกับ git และ / หรือ GitHub คุณสามารถดาวน์โหลดที่เก็บทั้งหมดเป็น ZIP จากหน้าแรก (ดูปุ่มในแถบด้านข้าง)
หลาม
- ผ่านการทดสอบอย่างละเอียดที่สุด นี่คือการดำเนินการอ้างอิงของเรา
- ใช้งานได้กับทั้ง Python 2.6+ และ Python 3.2+!
- มันช้ามาก เราขอแนะนำให้รันด้วยPyPyเพื่อการเร่งความเร็วที่ดีเยี่ยม
- รองรับผลกราฟิกโดยใช้หรือ
pygame
tkinter
ทับทิม
- ทดสอบกับ Ruby 2.0.0 ควรทำงานกับเวอร์ชันที่ใหม่กว่า
- มันค่อนข้างช้าเช่นกัน แต่ทับทิมอาจจะสะดวกในการทำต้นแบบความคิดสำหรับการส่ง
C ++
- ต้องการ C ++ 11
- สนับสนุนทางเลือกแบบมัลติเธรด
- โดยไกลตัวควบคุมที่เร็วที่สุดในพวง
C #
- ใช้ LINQ ดังนั้นจึงต้องใช้. NET 3.5
- ค่อนข้างช้า
ชวา
- ไม่ช้าโดยเฉพาะอย่างยิ่ง ไม่เร็วมาก
ลีดเดอร์บอร์ดเบื้องต้น
คะแนนทั้งหมดเป็นข้อมูลเบื้องต้น อย่างไรก็ตามหากมีสิ่งผิดปกติหรือล้าสมัยโปรดแจ้งให้เราทราบ การส่งตัวอย่างของเรามีการระบุไว้เพื่อการเปรียบเทียบ แต่ไม่อยู่ในการช่วงชิง
Score | # Games | User | Language | Bot
===================================================================================
2914.13 | 2000 | kuroi neko | C++ | Hard Believers
1817.05097| 1000 | TheBestOne | Java | Running Star
1009.72 | 2000 | kuroi neko | C++ | Blind faith
782.18 | 2000 | MT0 | C++ | Cautious Specimens
428.38 | | user2487951 | Python | NeighborsOfNeighbors
145.35 | 2000 | Wouter ibens | C++ | Triple Score
133.2 | | Anton | C++ | StarPlayer
122.92 | | Dominik Müller | Python | SkyWalker
89.90 | | aschmack | C++ | LookAheadPlayer
74.7 | | bitpwner | C++ | ColorFarSeeker
70.98 | 2000 | Ceribia | C++ | WallGuesser
50.35 | | feersum | C++ | Run-Bonus Player
35.85 | | Zgarb | C++ | Pathfinder
(34.45) | 5000 | Martin Büttner | <all> | ColorScorePlayer
9.77 | | DenDenDo | C++ | SlowAndSteady
3.7 | | flawr | Java | IAmARobotPlayer
1.9 | | trichoplax | Python | Bishop
1.04 | 2000 | fluffy | C++ | Gray-Color Lookahead
เครดิต
ความท้าทายนี้เป็นความร่วมมืออย่างมาก:
- Nathan Merril:เขียนตัวควบคุม Python และ Java เปลี่ยนแนวคิดการท้าทายจาก King-of-the-Hill เป็น Rat Race
- trichoplax: การทดสอบ ทำงานบนคอนโทรลเลอร์ Python
- feersum:เขียนตัวควบคุม C ++
- VisualMelon:เขียนคอนโทรลเลอร์ C #
- Martin Büttner:แนวคิด เขียนตัวควบคุม Ruby playtesting ทำงานบนคอนโทรลเลอร์ Python
- T Abraham: การทดสอบ ทดสอบ Python และสอบทาน C # และ C ++ คอนโทรลเลอร์
ผู้ใช้ทั้งหมดข้างต้น (และอาจจะลืมไปมากกว่านี้อีกสองสามอย่าง) มีส่วนทำให้การออกแบบโดยรวมของความท้าทาย
อัพเดตคอนโทรลเลอร์ C ++
หากคุณใช้ C ++ กับ Visual Studio และ multithreading คุณควรได้รับการอัพเดทล่าสุดเนื่องจากบั๊กที่มีการสร้างตัวสร้างหมายเลขสุ่มซึ่งทำให้สามารถสร้างบอร์ดที่ซ้ำกันได้
'In particular, a new specimen which spawns on a lethal cell will not die immediately, but has a chance to move off the dangerous cell first.'