У цьому виклику ви зіграєте голосну ітераційну дилему в'язня.
У Дилема укладеного це сценарій в теорії ігор , де є два гравці, кожен з двома варіантами: співпрацювати або дефект. Кожен гравець робить краще для себе, якщо вони перемогли, ніж якщо вони співпрацюють, але обидва гравці вважають за краще результат, коли обидва гравці співпрацюють з тим, де обидва гравці перемагають.
Повторена дилема ув'язненого - це та сама гра, за винятком того, що ви граєте проти того ж суперника неодноразово, і ви знаєте, що грав ваш опонент у минулому. Ваша мета завжди накопичувати найвищий бал для себе, незалежно від того, як робить ваш опонент.
Шумна ітералізована дилема ув'язненого вносить деякий шум у спілкування. Ваші знання про те, що ваш опонент грав у минулому, будуть вносити певний шум. Ви також будете знати, які кроки ви робили в минулому. Шум швидкості постійний протягом раунду проти одного і того ж суперника, але різний між різними раундами.
Виклик
У цьому виклику ви напишете програму 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 запусків гри.
У гравців будуть відповіді на це завдання, плюс шість основних програм для початку роботи.
Коваджі
Не змінюйте входи. Не намагайтеся вплинути на виконання будь-якої іншої програми, за винятком співпраці чи дефектів. Не робіть жертвоприношення, яке намагається визнати інше підпорядкування та виграти цього опонента за власні кошти. Стандартні лазівки заборонені.
EDIT: Подання можуть не точно копіювати жодну з базових програм або будь-яку попередню подачу.
Якщо у вас є якісь питання, не соромтеся задавати питання.
Поточні результати
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
списку. Чому я отримую сильно різні результати за однакові стратегії?