この挑戦では、騒々しい反復囚人のジレンマをプレイします。
の 囚人のジレンマが協力し、または欠陥:2人の選手、二つの選択肢と、それぞれがあるゲーム理論ではシナリオです。各プレーヤーは、協力する場合よりも欠陥がある場合のほうが自分にとって有利ですが、両方のプレーヤーは、両方のプレーヤーが欠陥のあるものよりも両方のプレーヤーが協力する結果を好むでしょう。
繰り返される囚人のジレンマは同じゲームです。ただし、同じ対戦相手と繰り返し対戦し、対戦相手が過去に何をプレイしたかを知っています。あなたの目的は、対戦相手の行動に関係なく、常に自分で最高のスコアを獲得することです。
騒々しい反復囚人のジレンマは、コミュニケーションにノイズを導入します。対戦相手が過去に何をプレイしたかを知っていると、ノイズが発生します。また、過去にどのような動きをしたかもわかります。ノイズレートは同じ対戦相手に対するラウンドでは一定ですが、ラウンド間で異なります。
チャレンジ
この課題では、騒々しい反復囚人のジレンマを再生するPython 3プログラムを作成します。
プログラムは3つの入力を受け取ります。
ランダムなフリップを適用せずに、独自の動き。
ランダムなフリップが適用された相手の動き。
状態変数。各ラウンドで空のリストとして開始され、必要に応じて変更できます。使用しない場合は、これを無視できます。
あなたのプログラムは'c'
協力するか'd'
、欠陥があるように出力すべきです。
たとえば、ランダムフリップが適用された後、最初の10フリップで、過去に少なくとも60%の時間、対戦相手が協力した場合に協力するプログラムを次に示します。
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手で構成されます。各動きで、両方のプログラムは、試行されたすべての以前の再生、フリップが適用された後、他のプログラムが行ったすべての以前の再生、および状態変数(プログラムが必要に応じて変更できる可変リスト)を受け取ります。プログラムは動きを出力します。
移動のスコアは次のとおりです。プログラムがを再生する'c'
場合、相手のプログラムは2ポイントを獲得します。プログラムが再生される場合'd'
、そのプログラムは1ポイントを獲得します。
次に、各手は、フリップ確率に等しい確率で独立してフリップされ、対戦相手に見せるために保存されます。
すべてのラウンドがプレイされた後、各プレイヤーが各対戦で獲得したポイント数を合計します。次に、次のスコアリングシステムを使用して、各プレーヤーのゲームのスコアを計算します。このスコアリングは、すべての対戦が完了した後に実行されます。
得点
進化スコアリングを使用します。各プログラムは同じ重みで始まります。次に、ゲームからのポイント合計を使用して、100回の反復に対して、次のように重みが更新されます。
各プログラムの新しいウェイトは、前のウェイトと平均ポイント合計の積に比例し、相手のウェイトで重み付けされます。
このような更新が100回適用され、最終的な重みは、そのゲームの実行に対する各プログラムのスコアです。
全体のスコアは、ゲームの100回の実行の合計になります。
プレーヤーは、このチャレンジに対するすべての有効な回答に加えて、開始するための6つの基本プログラムになります。
注意事項
入力を変更しないでください。他のプログラムの実行に影響を与えようとしないでください。ただし、協力または欠陥がある場合を除きます。別の提出物を認識し、その費用をかけて相手に利益をもたらすことを試みる犠牲的提出物を作成しないでください。標準的な抜け穴は禁止されています。
編集:提出物は、基本プログラムのいずれとも正確に重複していない可能性がありますまたは以前の提出物の。
ご質問がある場合は、お気軽にお問い合わせください。
現在の結果
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
リストに追加しました。同一の戦略に対して非常に異なる結果が得られるのはなぜですか?