Многие считают RPS азартной игрой. Если оба игрока играют непредсказуемо, лучшая стратегия - играть случайно. Однако давайте представим немного предсказуемости.
У каждого бота будет возможность рассказать другому боту, во что он будет играть одновременно. Затем наступает пауза, в которой каждый бот узнает, что объявил другой игрок. Если он разыгрывает это оружие, он объявил, что получит одно очко в дополнение к очкам за проигрыш или ничью.
Выигрыш стоит два очка, ничья, одно очко, а проигрыш 0 очков.
Honest Bot Dishonest
Win 3 2
Draw 2 1
Loss 1 0
В ваших же интересах быть честным (но также следить за тем, чтобы ваш оппонент не верил вам).
Матчи будут проводиться в формате кругового турнира, и цель будет состоять в том, чтобы максимизировать ваш собственный общий счет по матчам, которые вы играете.
Формат ввода / вывода:
- Ваш бот будет функцией Python 2.7, которая принимает 4 аргумента и должна иметь уникальное имя (которое будет использоваться для представления вашего представления).
- Первые два аргумента всегда будут в порядке: прошлые ходы противника, за которыми следуют ваши прошлые ходы. Это будет список в порядке от первого до самого последнего раунда, где каждый индекс содержит список с ходом, который, по утверждению оппонента, он сделает, после чего следует ход, который они фактически сделали.
- Следующие два аргумента позволят вашему боту определить, является ли это «честным» раундом или «реальным» раундом. Если это «честный» раунд, они оба будут None. Если это «настоящий» раунд, они будут, по порядку, ходом, который ваш оппонент объявил, что он сделает, после того, как вы заявили, что сделаете.
- Все аргументы или части аргументов, которые представляют ходы, будут использовать «R», «P» и «S» для представления камня, бумаги и ножниц соответственно.
- Ваша функция должна возвращать либо «R» для камня, «P» для бумаги или «S» для ножниц. Боты, которые могут возвращать другие значения, будут дисквалифицированы.
- Каждый бот будет запускаться против каждого другого бота 200 раз, а сам - 100 раз. Цель состоит в том, чтобы быть ботом с наибольшим количеством очков в конце соревнования.
- Что касается обсуждения в комментариях, представленные материалы не могут быть прочитаны или записаны в каком-либо файле, или каким-либо образом саботировать или читать код оппонента.
Примеры:
Это четыре примера ботов, которые я собрал быстро. Они будут участвовать в конкурсе в качестве дополнительных ботов. Если вы проиграли последнему, у вас есть работа.
def honestpaper(I,dont,care,about_these):
return "P"
def honestrock(I,dont,care,about_these):
return "R"
def honestscissors(I,dont,care,about_these):
return "S"
import random
def randombot(I,dont,care,about_these):
return random.choice(["R","P","S"])
контроллер:
А вот контроллер, который я буду использовать. Новые материалы будут импортированы в начале и добавлены в словарь bot_map.
from honestrock import honestrock
from honestpaper import honestpaper
from honestscissors import honestscissors
from randombot import randombot
bot_map = {
0:honestrock, 1:honestpaper, 2:honestscissors, 3:randombot
}
player_num=len(bot_map)
def real(history1,history2,number,honest1,honest2):
return bot_map[number](history1,history2,honest1,honest2)
def honest(history1,history2,number):
return bot_map[number](history1,history2,None,None)
def play_match(num1,num2):
history1=[]
history2=[]
score1=0
score2=0
for x in range(250):
h1=honest(history2,history1,num1)
h2=honest(history1,history2,num2)
r1=real(history2,history1,num1,h2,h1)
r2=real(history1,history2,num2,h1,h2)
if h1==r1: score1+=1
if h2==r2: score2+=1
if r1==r2: score1+=1; score2+=1
elif r1=="R":
if r2=="P": score2+=2
else: score1+=2
elif r1=="P":
if r2=="S": score2+=2
else: score1+=2
else:
if r2=="R": score2+=2
else: score1+=2
history1.append([h1,r1])
history2.append([h2,r2])
return score1,score2
scores = []
for x in range(player_num):
scores.append(0)
for _ in range(100):
for x in range(player_num):
for y in range(player_num):
scorex,scorey=play_match(x,y)
scores[x]+=scorex
scores[y]+=scorey
for score in scores:
print score
Итоговые результаты:
csbot 3430397
thompson 3410414
rlbot 3340373
have_we_been_here_before 3270133
mason 3227817
deepthought 3019363
adaptive_bot 2957506
THEbot 2810535
dontlietome 2752984
irememberhowyoulie 2683508
learningbot4 2678388
betrayal 2635901
averager 2593368
honestrandom 2580764
twothirds 2568620
mirrorbot 2539016
tit4tat 2537981
honestscissors 2486401
trusting_bot 2466662
rotate_scissors 2456069
rotate_paper 2455038
rotate_rock 2454999
honestpaper 2412600
honestrock 2361196
rockBot 2283604
trustingRandom 2266456
user5957401bot 2250887
randombot 2065943
Dx 1622238
liarliar 1532558
everybodylies 1452785
источник
Ответы:
каменщик
Пытается собрать информацию о других ботах, например, насколько они честны и как на них повлиял мой первый шаг. Затем я пытаюсь найти других очевидных ботов, которые следуют шаблону, и использовать их, чтобы дать мне больше очков. Наконец, у масона есть секретное оружие: знание тайного общества, в котором оба участвующих бота взаимно участвуют в полном розыгрыше, набирая по 500 очков каждый. К сожалению, секрет довольно ... Ну, секрет и меняется каждый раз, когда это делает Мейсон.
источник
Rlbot: обучение с подкреплением
Использует метод обучения с подкреплением, решая эту игру аналогично проблеме бандитов, вооруженных русскими. Он делает это двумя способами: пытается узнать, какое объявление лучше против каждого оппонента, и придерживается этого (полезно против постоянных ботов), и пытается узнать результат различных ходов в предыдущих аналогичных ситуациях (аналогично в отношении относительных игр). Например, камень против бумаги похож на предыдущий документ против ножниц). Исходные предположения оптимистичны, поэтому этот игрок будет считать, что честность даст ему 3 очка, а ложь даст 2, и поэтому всегда будет честен, пока не доказано обратное.
Обновление: первые результаты турнира высветили проблему с этим ботом, заключающуюся в невозможности обнаружить паттерны в декларациях своих оппонентов (что заставило его играть неоптимально против ротаторов). Затем я добавил компонент соответствия шаблонов в код для честных раундов, который использует регулярное выражение для поиска самого длинного суффикса в истории объявлений оппонентов, который присутствует где-то ранее в этой истории, и какой ход был выполнен после этого , Мы предполагаем, что противник будет снова делать то же самое движение, и использовать обучение подкрепления, как и прежде, чтобы решить, каким должен быть лучший ответ.
Попробуйте онлайн!
источник
Я никогда особо не использовал Python, поэтому уверен, что где-то допустил ошибку.
Он должен проверить последние 10 раундов, чтобы увидеть, как часто противник лгал, а затем выбрать другой ответ в зависимости от этого.
источник
Вот мой адаптивный бот. Он анализирует последние 2 хода противника, чтобы определить, честный он бот или нет, и играет соответственно:
Редактировать 1: Если другой бот является постоянным (то есть всегда играет одно и то же оружие), этот бот сокрушает его, играя выигрышным оружием и будучи честным в то же время.
Редактировать 2: Улучшен постоянный детектор ботов, чтобы работать с ротаторными ботами тоже.
источник
csbot
Будьте честны, пока другой игрок, и выявляйте простых детерминированных ботов. Сыграйте ход, который максимизирует ожидаемое значение, когда мы в основном получаем свои очки, но также не хотим давать очки другому игроку. Но собственные очки лучше в десять раз, отсюда и необычные числа в
value
функции. Движения противников ожидаются в зависимости от того, как часто мы видели их раньше в этой ситуации (объявленные ходы), но недавно увиденные ходы имеют больший вес, чем ходы, замеченные ранее. Для случайных начальных ходов (ситуаций, которых раньше не было) и некоторой дополнительной нечеткости, веса включают небольшие дополнительные случайные числаОбновление: используйте ожидаемые результаты также в честном раунде. Чтобы сделать это, нормализуйте и возьмите дополнительное очко, которое оппонент может получить за честность - это не могло повлиять на наше решение в реальном раунде, но необходимо сейчас. Я думал об этом с самого начала, но ошибочно считал, что это не стоит. Я видел, что можно было бы дать
trusting_bot
меньше очков (но бот в любом случае не является сильным противником), но упустил возможность получить дополнительные очкиrockbot
за хорошую игру в честном раунде, даже если его игра в этом раунде случайна.источник
if mydecl == None:
ошибаетесь.предательство
Идея состоит в том, что в течение первых 50 ходов я играю честно, а затем, как только я заманиваю оппонента, заставляя его думать, что я честен, играю нечестно, пытаясь сыграть то, что противоречит тому, что будет играть противник (в зависимости от того, был ли он честным или нечестным). в прошлом). Когда я достигаю точки, в которой я играл честно, чаще, чем нечестно, я меняю тактику и выбираю наиболее вероятный ход противника на основе предыдущих известных конфигураций.
источник
источник
Имя бота: я помню, как ты лжешь
Протестировано несколько пробежек по 100 раундов, и выяснилось, что победитель набирает в среднем около 220 очков. Скорее честно думаю;)
Впервые для меня, чтобы участвовать в проблемах КОТ, так что я думаю, что есть еще возможности для улучшения
источник
Синица для Тат
Классический аксельродианский участник: обнадеживающий, но мелкий; простой, но надежный. Это не дилемма заключенного, и я не пытался предсказать ход противника, поэтому я очень сомневаюсь, что он будет действительно конкурентоспособным. Но «сотрудничество» по-прежнему приносит участникам наибольшее количество баллов, поэтому я думаю, что это, по крайней мере, сработает.
источник
Две трети
Использует стратегию Питера Тейлора, упомянутую в Песочнице и в этом комментарии .
Он использует равновесие Нэша .
источник
random.choice
выбор случайного номера индекса, а затем возвращает объект в списке с этим индексом. Поскольку наборы не имеют порядка, они также не поддерживают индексацию и, следовательно, не работают с нимиrandom.choice
. Простым решением этой проблемы было бы привести набор к списку перед вызовомrandom.choice
.Глубокая мысль
Просто несколько заметок на нем:
Я новичок как в Koth, так и в Python, так что скажите мне, если я что-то напутал в этом боте. Я не думаю, что это может превзойти усиленное обучение (потому что я думаю, что это выучит мои движения слишком быстро), но давайте попробуем.
Мне нравится этот вызов, и если я найду время, я бы хотел добавить органичный подход к вычислениям (хотя, возможно, будет слишком мало давления на более высокие измерения). Разрешено ли добавлять несколько предложений? Или запрещено предотвращать загрузку вашего основного бота, вставляя в него те, которые предназначены только для проигрыша вашему основному боту?
РЕДАКТИРОВАТЬ: Исправлена опечатка кода, которая характеризовала меня как не говорящего по-английски
источник
return result
требует дополнительного отступа. Я считаю, что это должно быть внутри гигантского оператора if, сразу после него, поскольку переменнаяreturn
объявляется только в этом операторе it. Я сделал эту модификацию в своем коде, и теперь она работает без ошибок. Если бы вы не возражали против такого изменения, это было бы здорово.R=random.Random(seed)
и использовать его как это:R.choice(...)
.{}
кнопку на панели инструментов, чтобы автоматически сделать отступ для каждой строки.источник
have_we_been_here_before
Просто спрашивает «были ли мы здесь раньше» и выбирает ход, который дал бы лучший средний результат в любых таких предыдущих играх.
Редактировать: Честность Клуб. Я добавил небольшой блок кода, потому что другой бот (каменщик) преуспел, создав собственный секретный клуб. Однако обратите внимание, что честная игра против честных оппонентов приносит в среднем одинаковую выгоду, играя против себя, и, возможно, есть и более широкие взаимные выгоды?
Edit2: Во время написания двух ботов впереди меня оба эксплуатировали ротаторы, поэтому я собираюсь добавить еще один блок кода, чтобы тоже запрыгнуть на эту команду. Я предполагаю, что мой код должен казаться довольно старой школой - придерживаться знакомых конструкций, найденных в любом языке программирования, потому что я действительно не знаю Python.
источник
THEbot: Честный эксплуататор
источник
Томпсон
источник
mirrorbot
Я попробую простого бота, который переделает последнюю игру своего противника в этих условиях.
источник
Идея здесь состоит в том, чтобы максимизировать счет, играя себя, и в то же время быть случайным конкурентом на других этапах против других плохих ботов.
источник
is
является ключевым словом, поэтому оно недопустимо.Dx
Я только написал этого бота, чтобы у меня был смайлик на моем имени бота xD.
источник
Все лгут
Он лжет о своем движении («Я буду играть ножницами!») И предполагает, что противник также лгал, и что они попытаются превзойти то, что я сказал, что мой ход будет («хм, Рок бьет ножницы, поэтому я играю это "), но я на самом деле играю ход, который бьет этот ход (" Бумага! Сюрприз! ").
источник
Доверять бот
Всегда претендует на то, чтобы метать ножницы, но будет делать все, что скажет противник. Надежно нарисует с собой.
источник
Имя бота: Лжец, Лжец
Не могу перестать лгать.
источник
RockBot
Предполагается, что противник будет честным и пытается победить их, но отказывается играть в рок.
источник
Название бота: dontlietome
Определяет, лжет противник или нет, в зависимости от того, сколько раз противник солгал в последних 10 раундах. Выбирает ход в зависимости от того, лжет противник или нет. Если оппонент определил, что он лжет, тогда играет, как подсказка.
источник
lost_against_map
и исправил проверку if, если честный раунд)источник
усреднитель
источник
Просто немного лучше, чем моя предыдущая запись ...
источник
csbot на стероидах
Я думаю, что предложение, которое @ user1502040 делает в комментариях, должно следовать. В противном случае у этого бота было бы преимущество, которое я бы счел несправедливым. Я представляю это так, чтобы можно было оценить разницу, которую он имеет. При предложенном случайном посеве стероиды будут нейтрализованы, а бот будет эквивалентен
csbot
, поэтому в соревновании должен участвовать только один.источник