ในการท้าทายนี้คุณจะเล่นสถานการณ์ที่ไม่แน่นอนของนักโทษที่มีเสียงดัง
ขึ้นเขียงนักโทษเป็นสถานการณ์ในทฤษฎีเกมที่มีผู้เล่นสองคนแต่ละคนมีสองตัวเลือก: ความร่วมมือหรือมีความบกพร่อง ผู้เล่นแต่ละคนทำได้ดีกว่าสำหรับตัวเองหากพวกเขาบกพร่องกว่าถ้าพวกเขาร่วมมือกัน แต่ผู้เล่นทั้งสองต้องการผลลัพธ์ที่ผู้เล่นทั้งสองร่วมมือกันกับผู้เล่นที่ทั้งคู่เสีย
ภาวะที่กลืนไม่เข้าคายไม่ออกของนักโทษที่ซ้ำแล้วซ้ำกันเป็นเกมเดียวกันยกเว้นคุณเล่นกับคู่ต่อสู้คนเดิมซ้ำแล้วซ้ำเล่าและคุณรู้ว่าคู่ต่อสู้ของคุณเคยเล่นในอดีต เป้าหมายของคุณคือการสะสมคะแนนสูงสุดให้ตัวเองเสมอไม่ว่าฝ่ายตรงข้ามจะทำเช่นไร
ภาวะที่กลืนไม่เข้าคายไม่ออกซ้ำแล้วซ้ำอีกของเสียงดังขึ้นส่งเสียงดังในการสื่อสาร ความรู้ของคุณเกี่ยวกับสิ่งที่คู่ต่อสู้ของคุณได้เล่นในอดีตจะมีเสียงรบกวนบ้าง คุณจะรู้ว่าสิ่งที่คุณทำเคลื่อนไหวในอดีต อัตราเสียงนั้นคงที่ตลอดหนึ่งรอบกับคู่ต่อสู้เดียวกัน แต่ต่างกันระหว่างรอบที่แตกต่างกัน
ท้าทาย
ในการท้าทายนี้คุณจะเขียนโปรแกรม Python 3 เพื่อเล่นวิกฤติของนักโทษที่มีเสียงดัง
โปรแกรมของคุณจะได้รับสามอินพุต:
การเคลื่อนไหวของคุณเองโดยไม่ต้องใช้การพลิกแบบสุ่ม
การเคลื่อนไหวของฝ่ายตรงข้ามโดยใช้การโยนแบบสุ่ม
ตัวแปรสถานะซึ่งเริ่มต้นเป็นรายการว่างในแต่ละรอบและคุณสามารถแก้ไขได้หากคุณต้องการ คุณสามารถละเว้นสิ่งนี้หากคุณไม่ต้องการใช้
โปรแกรมของคุณควรส่งออก'c'
ไปให้ความร่วมมือหรือมี'd'
ข้อบกพร่อง
ตัวอย่างเช่นต่อไปนี้เป็นโปรแกรมที่ให้ความร่วมมือหากฝ่ายตรงข้ามได้ให้ความร่วมมืออย่างน้อย 60% ของเวลาในอดีตหลังจากการใช้การสุ่มแบบสุ่มและ 10 ครั้งแรก:
def threshold(my_plays, their_flipped_plays, state):
if len(their_flipped_plays) < 10:
return 'c'
opp_c_freq = their_flipped_plays.count('c')/len(their_flipped_plays)
if opp_c_freq > 0.6:
return 'c'
else:
return 'd'
ถ้าคุณไม่รู้จัก Python เขียนการส่งของคุณใน pseudocode และใครบางคน (ฉันหรือสมาชิกคนอื่นของไซต์) สามารถสร้างโปรแกรม Python ที่สอดคล้องกันได้
เพลย์
รองชนะเลิศอันดับการแข่งขันสามารถพบได้ที่นี่: มีเสียงดังเกม วิ่งnoisy-game.py
เพื่อแข่งขัน ฉันจะอัปเดตที่เก็บข้อมูลนั้นด้วยการส่งใหม่ basic.py
โปรแกรมตัวอย่างที่สามารถพบได้ใน
คะแนนโดยรวมของโปรแกรมคือคะแนนรวมของเกมมากกว่า 100 ครั้ง
เกมประกอบด้วย matchups รอบโรบินของผู้เล่นแต่ละคนกับผู้เล่นแต่ละคนรวมถึงตัวเอง การแข่งขันประกอบด้วย 100 รอบ รอบประกอบด้วย 300 การเคลื่อนไหวของแต่ละคนที่เกี่ยวข้องกับการ outputting หรือ'c'
'd'
การส่งของคุณจะเล่น matchup กับทุกการส่งรวมถึงของคุณเอง การแข่งขันแต่ละครั้งจะประกอบด้วย 100 รอบ [0, 0.5]
ในระหว่างแต่ละรอบน่าจะพลิกจะได้รับเลือกโดยการสุ่มจากสม่ำเสมอ
แต่ละรอบจะมี 300 การเคลื่อนไหว ในการย้ายแต่ละครั้งทั้งสองโปรแกรมจะได้รับการเล่นก่อนหน้านี้ทั้งหมดที่พวกเขาพยายามและการเล่นก่อนหน้านี้ทั้งหมดที่โปรแกรมอื่นทำหลังจากใช้การพลิกและตัวแปรสถานะซึ่งเป็นรายการที่ไม่แน่นอนซึ่งโปรแกรมสามารถปรับเปลี่ยนได้ถ้าต้องการ โปรแกรมจะแสดงผลการเคลื่อนไหวของพวกเขา
การเคลื่อนไหวมีคะแนนดังนี้: ถ้าโปรแกรมเล่น a 'c'
, โปรแกรมตรงข้ามได้รับ 2 คะแนน หากโปรแกรมเล่น a 'd'
โปรแกรมนั้นจะได้ 1 คะแนน
จากนั้นการเคลื่อนไหวแต่ละครั้งจะถูกพลิกอย่างอิสระโดยมีความน่าจะเป็นเท่ากับความน่าจะเป็นพลิกและเก็บไว้เพื่อแสดงต่อฝ่ายตรงข้าม
หลังจากรอบทั้งหมดได้รับการเล่นเรารวมจำนวนคะแนนที่ผู้เล่นแต่ละคนได้รับในการแข่งขันแต่ละครั้ง จากนั้นเราใช้ระบบการให้คะแนนต่อไปนี้เพื่อคำนวณคะแนนของผู้เล่นแต่ละคนสำหรับเกม การให้คะแนนนี้จะดำเนินการหลังจากการจับคู่ทั้งหมดเสร็จสมบูรณ์
เกณฑ์การให้คะแนน
เราจะใช้การให้คะแนนวิวัฒนาการ แต่ละโปรแกรมเริ่มต้นด้วยน้ำหนักที่เท่ากัน จากนั้นน้ำหนักจะได้รับการอัปเดตดังนี้สำหรับการวนซ้ำ 100 ครั้งโดยใช้คะแนนรวมจากเกม:
น้ำหนักใหม่ของแต่ละโปรแกรมนั้นขึ้นอยู่กับน้ำหนักของผลิตภัณฑ์ก่อนหน้านี้และผลรวมคะแนนเฉลี่ยโดยน้ำหนักตามน้ำหนักของคู่ต่อสู้
มีการอัปเดต 100 รายการดังกล่าวและน้ำหนักสุดท้ายเป็นคะแนนของแต่ละโปรแกรมสำหรับการดำเนินการของเกมนั้น
คะแนนรวมจะรวมกันมากกว่า 100 เกม
ผู้เล่นจะได้คำตอบที่ถูกต้องสำหรับความท้าทายนี้รวมถึงโปรแกรมพื้นฐานหกประการเพื่อให้เราเริ่มต้น
คำเตือน
อย่าแก้ไขอินพุต อย่าพยายามที่จะส่งผลกระทบต่อการดำเนินการของโปรแกรมอื่น ๆ ยกเว้นผ่านทางความร่วมมือหรือการเสียเปรียบ อย่าส่งการเสียสละที่พยายามจดจำการยอมจำนนอื่นและเป็นประโยชน์แก่คู่ต่อสู้โดยเสียค่าใช้จ่ายเอง ช่องโหว่มาตรฐานถูกแบน
แก้ไข: การส่งอาจไม่ซ้ำกันแน่นอนของโปรแกรมพื้นฐานใด ๆ หรือการส่งก่อนหน้านี้
หากคุณมีคำถามใด ๆ อย่าลังเลที่จะถาม
ผลลัพธ์ปัจจุบัน
nicht_genug: 40.6311
stealer: 37.1416
enough: 14.4443
wait_for_50: 6.947
threshold: 0.406784
buckets: 0.202875
change_of_heart: 0.0996783
exploit_threshold: 0.0670485
kickback: 0.0313357
tit_for_stat: 0.0141368
decaying_memory: 0.00907645
tit_for_whoops: 0.00211803
slider: 0.00167053
trickster: 0.000654875
sounder: 0.000427348
tit_for_tat: 9.12471e-05
stubborn_stumbler: 6.92879e-05
tit_for_time: 2.82541e-05
jedi2sith: 2.0768e-05
cooperate: 1.86291e-05
everyThree: 1.04843e-05
somewhat_naive: 4.46701e-06
just_noise: 1.41564e-06
growing_distrust: 5.32521e-08
goldfish: 4.28982e-09
vengeful: 2.74267e-09
defect: 3.71295e-10
alternate: 2.09372e-20
random_player: 6.74361e-21
ผลลัพธ์ที่มีเพียงคำตอบสำหรับคำถามนี้และโปรแกรมพื้นฐานที่ไม่สนใจการเล่นของคู่ต่อสู้:
nicht_genug: 39.3907
stealer: 33.7864
enough: 20.9032
wait_for_50: 5.60007
buckets: 0.174457
kickback: 0.0686975
change_of_heart: 0.027396
tit_for_stat: 0.024522
decaying_memory: 0.0193272
tit_for_whoops: 0.00284842
slider: 0.00153227
sounder: 0.000472289
trickster: 0.000297515
stubborn_stumbler: 3.76073e-05
cooperate: 3.46865e-05
tit_for_time: 2.42263e-05
everyThree: 2.06095e-05
jedi2sith: 1.62591e-05
somewhat_naive: 4.20785e-06
just_noise: 1.18372e-06
growing_distrust: 6.17619e-08
vengeful: 3.61213e-09
goldfish: 3.5746e-09
defect: 4.92581e-10
alternate: 6.96497e-20
random_player: 1.49879e-20
การชนะ
การแข่งขันจะยังคงเปิดอยู่เรื่อย ๆ เนื่องจากมีการโพสต์ใหม่ อย่างไรก็ตามฉันจะประกาศผู้ชนะ (ยอมรับคำตอบ) ตามผลลัพธ์ 1 เดือนหลังจากโพสต์คำถามนี้
exploit_threshold()
หลายครั้งในขณะที่exploit_threshold1()
ฯลฯ และเพิ่มลงในplayers
รายการ ทำไมฉันถึงได้ผลลัพธ์ที่แตกต่างอย่างมากมายสำหรับกลยุทธ์ที่เหมือนกัน