이 도전에서, 당신은 시끄러운 반복 죄수의 딜레마를 할 것입니다.
죄수의 딜레마는 협력, 또는 결함 : 두 선수, 두 가지 옵션이 각각가 게임 이론의 시나리오입니다. 각 플레이어는 협력하는 것보다 결함이있는 경우 자신을 위해 더 나아지지만, 두 플레이어는 두 플레이어 모두 결함이있는 사람과 협력하는 결과를 선호합니다.
반복 된 죄수의 딜레마는 같은 상대입니다. 같은 상대를 반복해서 상대하고 과거에 상대가했던 것을 알고 있습니다. 당신의 목표는 상대방이 어떻게 행동하든 항상 자신을 위해 가장 높은 점수를 쌓는 것입니다.
시끄러운 죄수의 딜레마는 의사 소통에 약간의 소음을 유발합니다. 상대방이 과거에 한 일에 대한 지식은 약간의 소음이 발생합니다. 또한 과거에 어떤 움직임을했는지 알게 될 것입니다. 소음은 같은 상대에 대한 라운드에서 일정하지만 다른 라운드마다 다릅니다.
도전
이 도전에서, 당신은 시끄러운 반복 죄수의 딜레마를 연주하는 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 프로그램을 작성할 수 있습니다.
게임 플레이
토너먼트 러너는 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
목록에 추가했습니다 . 동일한 전략에 대해 왜 크게 다른 결과를 얻습니까?