У цьому питанні була розроблена гра, в якій гравці зіштовхуватимуться один з одним за парою в дилемі в'язня, щоб визначити, яка ітеративна стратегія набрала найбільшу оцінку проти інших.
У цьому питанні я розробив спосіб для кількох людей грати в дилему в'язнів один проти одного одночасно. У цьому варіанті матриця виплат є непотрібною, при цьому кожен результат між кожною парою двох гравців є сумою двох функціонально незалежних рішень.
Ваше завдання - створити AI, щоб грати в цю симетричну, узагальнену версію мультиплікаційної дилеми в'язня, яка дозволить досягти максимально можливого балу
Правила гри
У кожному раунді цієї багатокористувацької, багатогранної дилеми в'язня, гравець A
може вирішити "взяти 1" у якогось іншого гравця B
. У цьому випадку A
рахунок збільшується на 1, а B
рахунок зменшується на 2. Це рішення дозволяється відбуватися між кожною впорядкованою парою гравців.
Це єдине рішення, яке приймається для кожного гравця - або "брати 1", або не "брати 1" один від одного гравця, які є гомологічними до дефектів і співпраці відповідно. Ефективна матриця виграшів між двома гравцями P1
і P2
виглядають наступним чином :
P1/P2 P1 Take1 P1 Don't
P2 Take1 -1/-1 -2/+1
P2 Don't +1/-2 0/ 0
Порядок проведення турніру
Гра буде складатися з P * 25
раундів, де P
кількість гравців, що беруть участь. Усі гравці починаються з рахунку 0
. Кожен раунд складається з наступної процедури:
На початку туру кожній програмі буде надано історію попередніх раундів зі стандартного введення у такому форматі:
Одна лінія , яка містить 3 числа,
P
,D
, іN
.P
- загальна кількість гравців у грі. Кожному гравцеві випадково присвоюється ідентифікаційний номер від1
доP
початку гри.D
ідентифікатор поточного гравця.N
- кількість відіграних раундів.
N
рядки, кожен рядок представляє результати раунду. На лініїk
зN
, буде деяка кількістьn_k
упорядкованих пар(a, b)
, розділених пробілами, які представляють собою , що гравець з ідентифікаторомa
«прийняв 1» від гравця з IDb
в цьому раунді.Рівномірно випадкове число
R
від0
до18446744073709551615
(2 64 - 1), щоб діяти як псевдовипадкове насіння. Ці цифри будуть прочитані з попередньо створеного файлу, який буде випущений наприкінці турніру, щоб люди могли перевірити результати для себе.Один додатковий рядок, який представляє певну форму стану, яку слід прочитати у вашій програмі, якщо ваша програма дала такий результат у попередньому раунді. На початку гри цей рядок завжди буде порожнім. Цей рядок не змінюватиметься ні кодируючим кодом, ні іншими програмами.
Після цього кожна програма використовуватиме свою стратегію для отримання наступних стандартних результатів :
Список
K
номерів, які є ідентифікаторами програм, які він "займе 1" з цього раунду. Порожній вихід означає, що він нічого не зробить.Необов'язково - одна додаткова лінія, яка представляє певну форму стану для переходу до наступних раундів. Цей точний рядок буде повернуто програмі в наступному раунді.
Нижче наводиться приклад для початку гри для гравця з ідентифікатором 3
у грі для 4 гравців:
4 3 0
4696634734863777023
Нижче наведено приклад введення для тієї ж гри з кількома вже зіграними раундами:
4 3 2
(1, 2) (1, 3) (1, 4) (4, 2)
(1, 3) (2, 1) (2, 4) (3, 1) (4, 1)
4675881156406346380
Кожна програма подаватиметься однаково вхідним кодом, за винятком ідентифікаційного номера, D
який є унікальним для кожної програми.
Нижче наведено приклад результату, у якому гравець 3
бере 1 від усіх інших:
1 2 4
В кінці всіх необхідних раундів переможець буде гравець з найвищим підсумковим балом.
Хронологія
Кодування цього турніру триватиме загалом 7 днів. Кінцевий термін подання заявок - 2014-05-09 00:00 UTC
.
Не публікуйте фактичні програми до цієї дати - опублікуйте хеш SHA256 вихідного коду вашої програми як зобов’язання. Ви можете змінити цей хеш будь-коли до встановленого терміну, але зобов'язання, розміщені після цього терміну, не приймаються до рішення. (Будь ласка, використовуйте позначення бази 64 для своїх хешів, оскільки моя програма підтвердження випилює базу 64, і це більш компактне позначення.)
Після закінчення терміну у вас буде 1 день (до 2014-05-10 00:00 UTC
), щоб опублікувати фактичний вихідний код вашої програми для подання. Якщо хеш SHA256 вашого розміщеного вихідного коду не відповідає жодному хешу, який ви опублікували до встановленого терміну, ваш код не буде прийнятий до турніру.
Після цього я завантажу всі матеріали на свій власний комп'ютер і запускаю всі записи турніру в цій бойовій рояллі, сподіваюся, розміщую результати протягом 2 днів з того часу 2014-05-12 00:00 UTC
.
Я прийму відповідь з найбільшою оцінкою та нагороду отримаю в розмірі +100 за цю відповідь, якщо її кінцевий бал перевищує 0
.
Після закінчення турніру я опублікую випадковий насіннєвий файл, який використовується для проведення змагань, і люди можуть почати розміщувати інші рішення, намагаючись довершити ті, які використовуються в турнірі. Однак вони не зараховуються до акцепту чи виграші.
Хост-машина
Я буду запускати ці рішення на віртуальній машині на своєму комп’ютері. Ця віртуальна машина буде працювати з Ubuntu Linux 14.04, з 2 гігабайтами оперативної пам’яті. У моєї базової машини є процесор Intel i7-2600K, який працює на частоті 3,40 ГГц.
Вимоги
Ваша програма повинна бути написана мовою, для якої існує компілятор або інтерпретатор, який буде компілювати вашу програму, і вона є доступною для останньої версії Ubuntu Linux, щоб я міг запускати всі матеріали та оцінювати їх у віртуальній машині.
Ваша програма не повинна займати більше, ніж 2.000 seconds
проводити кожен раунд. Якщо у вашої програми не вистачає часу або виникає помилка, її висновок буде вважатися порожнім для цього раунду.
Ваша програма повинна бути детермінованою; тобто він повинен завжди повертати один і той же вихід на один і той же вхід. Дозволені псевдовипадкові розчини; однак їх випадковість повинна залежати від випадкового насіння, що дається йому як вхідне і нічого іншого. Насіннєвий файл був створений за допомогою Python's os.urandom
. Він містить загалом 500 рядків (при необхідності буде створено більше), а його хеш SHA256 є K+ics+sFq82lgiLanEnL/PABQKnn7rDAGmO48oiYxZk=
. Він буде завантажений сюди, коли турнір закінчиться.
Рослини
Щоб розпочати справи, будуть чотири "заводи", що представляють початкові наївні стратегії. Вони будуть грати в турнірі разом з вашими заявами. Однак у маловірогідному випадку, коли хтось із них виграє, найвищий бал, отриманий гравцем, крім рослини, буде вважатися переможцем.
Щоб обчислити хеш файлів кожної рослини, замініть кожну групу з 4 пробілів на вкладку, оскільки форматеру тут не подобаються символи вкладки.
Ледачий - ніколи нічого не робить.
n1bnYdeb/bNDBKASWGywTRa0Ne9hMAkal3AuVZJgovI=
pass
Жадібний - завжди бере 1 у всіх.
+k0L8NF27b8+Xf50quRaZFFuflZhZuTCQOR5t5b0nMI=
import sys
line1 = sys.stdin.readline()
n = [int(i) for i in line1.split()]
for i in range(n[0]):
if i+1 != n[1]:
print i+1,
print
Гнівний - приймає 1 у всіх в першому раунді, а 1 - у всіх, хто взяв 1 з нього в попередньому раунді.
Ya2dIv8TCh0zWzRfzUIdFKWj1DF9GXWhbq/uN7+CzrY=
import sys
import re
line1 = [int(i) for i in sys.stdin.readline().split()]
players = line1[0]
pid = line1[1]
rounds = line1[2]
lines = []
if rounds == 0:
for i in range(players):
if i+1 != pid:
print i+1,
print
else:
for i in range(rounds):
lines.append(sys.stdin.readline())
lastline = lines[-1]
takes = re.findall(r'\([0-9]+, [0-9]+\)', lastline)
for take in takes:
sides = [int(i) for i in re.findall(r'[0-9]+', take)]
if sides[1] == pid:
print sides[0],
print
Заздрісники - беруть 1 із 50% гравців, за винятком яких є найвищий бал, закруглюючи його вниз.
YhLgqrz1Cm2pEcFlsiIL4b4MX9QiTxuIOBJF+wvukNk=
import sys
import re
line1 = [int(i) for i in sys.stdin.readline().split()]
players = line1[0]
pid = line1[1]
rounds = line1[2]
lines = []
scores = [0] * players
if rounds == 0:
for i in range(players):
if i+1 != pid:
print i+1,
print
else:
for i in range(rounds):
takes = re.findall(r'\([0-9]+, [0-9]+\)', sys.stdin.readline())
for take in takes:
sides = [int(i) for i in re.findall(r'[0-9]+', take)]
scores[sides[0] - 1] += 1
scores[sides[1] - 1] -= 2
score_pairs = [(i+1, scores[i]) for i in range(players)]
score_pairs.sort(key=lambda x:(x[1], x[0]))
score_pairs.reverse()
taken = 0
j = 0
while taken < (players) / 2:
if score_pairs[j][0] != pid:
print score_pairs[j][0],
taken += 1
j += 1
На турнірі в 100 раундів серед цих чотирьох вони отримують бали:
Lazy: -204
Greedy: -100
Wrathful: -199
Envious: -199
Програма суддівства
Я опублікував програму судді, яку я буду використовувати в Github . Завантажте його і протестуйте. (І, можливо, виправте помилку чи дві, якщо її знайдете.: P)
Наразі у нього немає варіантів компіляції для нічого, крім Python. Я буду включати тих, хто пізніше - якщо люди зможуть внести сценарії для компіляції чи інтерпретації іншими мовами, я буду дуже зобов'язаний.
Фаза 2: подання вихідного коду
Я опублікував нову гілку tournament
до сховища Github для конкурсу, що містить файл pd_rand та інші записи рослин. Ви можете опублікувати свій вихідний код тут або надіслати його до цієї гілки як запит на виклик.
Порядок учасників конкурсу буде таким:
'begrudger'
'regular'
'patient'
'lazy'
'backstab'
'bully'
'lunatic'
'envious'
'titfortat'
'greedy'
'wrathful'
'judge'
'onepercent'
Підсумкові бали
Вихід моєї програми тестування:
Final scores:
begrudger -2862
regular -204
patient -994
lazy -2886
backstab -1311
bully -1393
lunatic -1539
envious -2448
titfortat -985
greedy -724
wrathful -1478
judge -365
onepercent -1921
Рейтинг:
1. regular -204
2. judge -365
3. greedy -724
4. titfortat -985
5. patient -994
6. backstab -1311
7. bully -1393
8. wrathful -1478
9. lunatic -1539
10. onepercent -1921
11. envious -2448
12. begrudger -2862
13. lazy -2886
Так виходить, що переможець справді є гравцем - це The Regular, з -204 балами!
На жаль, його оцінка не була позитивною, але навряд чи можна очікувати, що в симуляції Ітерованої дилеми в'язня, де всі грають, щоб перемогти.
Деякі дивовижні результати (принаймні, я вважав, що вони дивні):
Жадібний набрав більше, ніж Тит за Тата, і насправді, взагалі вище, ніж більшість бомбардирів взагалі.
Суддя, який мав бути своєрідним "правозахисником" характеру (в основному це брав 1 від того, хто взяв 1 у когось вище середнього числа разів) закінчився очок досить високим, тоді як в симуляційному тестуванні це було б насправді отримати досить низький бал.
І інші, які (я думав) були не такі дивні:
Пацієнт набрав повних 484 балів більше, ніж The Wrathful. Це дійсно платить співпрацювати в перший раз.
Один Процент дуже швидко не мав кого бити, поки вони були вниз. Здається, що 1% може залишатися таким, тому що в грі більше гравців.
У будь-якому випадку, тепер, коли турнір закінчився, сміливо розміщуйте стільки зайвих гравців, скільки хочете, і тестуйте їх разом із програмою судді.