在此挑战中,您将扮演吵杂的囚徒困境。
在囚徒困境是博弈论中一个场景,其中有两名球员,每两种选择:合作或者缺陷。如果每个球员都缺阵,他们会为自己做得比他们合作时更好。
反复犯人的困境是相同的游戏,只是您反复与同一个对手比赛,并且您知道对手过去玩过什么。您的目标始终是为自己积累最高分,而不管对手的表现如何。
嘈杂的囚徒困境使沟通变得有些混乱。您对对手过去玩过的游戏的了解会带来一些干扰。您还将了解过去的举动。面对同一个对手的回合中,噪声率是恒定的,但是不同回合之间的噪声率却不同。
挑战
在这个挑战中,您将编写一个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,请使用伪代码编写提交内容,然后某个人(我或该站点的另一个成员)可以制作相应的Python程序。
游戏玩法
比赛亚军可以在这里找到:noisy-game。运行noisy-game.py
以运行锦标赛。我将使用新提交的内容更新该存储库。示例程序可以在中找到basic.py
。
程序的总体得分是其在100多个游戏中得分的总和。
游戏由每个玩家与每个玩家(包括其自身)的循环赛对决组成。一场对决包括100发回合。一回合包含300个动作,每个动作涉及输出'c'
或'd'
。
您的提交将与每个提交(包括您自己的提交)进行对战。每场比赛将进行100场比赛。在每个回合中,翻转概率将从中均匀地随机选择[0, 0.5]
。
每回合将包含300步。在每次移动时,两个程序都将收到他们尝试过的所有先前播放的声音,以及在应用了翻转之后另一个程序已经做出的所有先前播放的声音,以及一个状态变量,该变量是可变的列表,程序可以根据需要对其进行修改。程序将输出其动作。
动作得分如下:如果一个程序播放a 'c'
,则相反的程序将获得2分。如果某个程序播放'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
列表中。为什么相同的策略会产生截然不同的结果?