В этом задании вы сыграете дилемму зашумленного итератора.
В Дилемма Заключенного это сценарий в теории игр , где есть два игрока, каждый с двумя вариантами: сотрудничать или дефект. Каждый игрок делает лучше для себя, если он уходит, чем если бы он сотрудничал, но оба игрока предпочли бы результат, в котором оба игрока сотрудничали, чем тот, где оба игрока дефектовали.
Дилемма повторного заключенного - та же самая игра, за исключением того, что вы неоднократно играете с одним и тем же противником, и вы знаете, что играл ваш противник в прошлом. Ваша цель всегда состоит в том, чтобы набрать для себя наибольшее количество очков, независимо от того, как это делает ваш противник.
Шумная повторяющаяся дилемма заключенного вносит некоторый шум в общение. В ваших знаниях о том, что ваш оппонент играл в прошлом, появится немного шума. Вы также будете знать, какие движения вы сделали в прошлом. Уровень шума постоянен в течение раунда против одного и того же противника, но отличается в разных раундах.
Вызов
В этом задании вы напишите программу на 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.py
чтобы запустить турнир. Я буду держать этот репозиторий обновленным с новыми представлениями. Примеры программ можно найти в basic.py
.
Общий балл программы - это сумма баллов за 100 игр в игре.
Игра состоит из круговых матчей каждого игрока против каждого игрока, включая его самого. Матч состоит из 100 раундов. Раунд состоит из 300 ходов, каждый из которых включает в себя вывод 'c'
или'd'
.
Ваша заявка будет играть матч против каждой подачи, включая вашу собственную. Каждый матч будет состоять из 100 раундов. Во время каждого раунда вероятность переворота будет выбираться равномерно случайным образом [0, 0.5]
.
Каждый раунд будет состоять из 300 ходов. На каждом ходу обе программы будут получать все предыдущие попытки воспроизведения, которые они предприняли, и все предыдущие воспроизведения, сделанные другой программой, после применения переворотов, и переменную состояния, которая является изменяемым списком, который программа может изменить, если она хочет. Программы выведут свои ходы.
Ход оценивается следующим образом: если программа играет '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
список. Почему я получаю совершенно разные результаты для идентичных стратегий?