Конкурс открыт постоянно - Обновлено 10 августа 2017
Хотя 5 июня 2017 года я объявил победителя (который останется лучшим ответом), я буду набирать новых ботов и обновлять результаты.
Результаты 5 июня
Поздравляем user1502040
Поскольку связей нет, я показываю только процент выигранных матчей.
Statistician2
- 95,7%
Fitter
- 89,1%
Nash
- 83,9%
Weigher
- 79,9%
ExpectedBayes
- 76,4%
AntiRepeater
- 72,1%
Yggdrasil
- 65,0%
AntiGreedy
- 64,1%
Reactor
- 59,9%
NotHungry
- 57,3%
NashBot
- 55,1%
Blodsocer
- 48,6%
BestOfBothWorlds
- 48,4%
GoodWinning
- 43,9%
Rockstar
- 40,5%
ArtsyChild
- 40,4%
Assassin
- 38,1 %
WeightedRandom
- 37,7%
Ensemble
- 37,4%
UseOpponents
- 36,4%
GreedyPsychologist
- 36,3%
TheMessenger
- 33,9%
Copycat
- 31,4%
Greedy
- 28,3%
SomewhatHungry
- 27,6%
AntiAntiGreedy
- 21,0%
Cycler
- 20,3%
Swap
- 19,8%
RandomBot
- 16,2%
Я создал Google Sheet с таблицей результатов каждой пары: https://docs.google.com/spreadsheets/d/1KrMvcvWMkK-h1Ee50w0gWLh_L6rCFOgLhTN_QlEXHyk/edit?usp=sharing
Благодаря дилемме Петри я смог справиться с этим королем горы.
Игра
Игра представляет собой простой «камень-ножницы-бумага» с изюминкой: очки, набранные с каждой победой, увеличиваются во время матча (ваши R, P или S загружаются).
- Бумага побеждает Рок
- Ножницы выигрывает бумага
- Рок выигрывает ножницы
Победитель получает столько же очков, сколько его нагрузка на игру.
Проигравший увеличивает на 1 нагрузку на свою игру.
В случае ничьей каждый игрок увеличивает нагрузку на свою игру на 0,5.
После 100 игр победителем становится тот, у кого больше очков.
Например: P1 имеет нагрузки [10,11,12] (камень, бумага, ножницы) и P2 [7,8,9]. P1 играет R, P2 играет P. P2 выигрывает и получает 8 очков. Нагрузки P1 становятся [11,11,12], нагрузки P2 остаются прежними.
Технические характеристики
Ваша программа должна быть написана на Python (извините, я не знаю, как с этим обращаться в противном случае). Вы должны создать функцию, которая будет принимать каждую из этих переменных в качестве аргумента при каждом выполнении:
my_points, opp_points, my_loaded, opp_loaded, my_history, opp_history
points
- Текущие очки (твой и твой опп)
loaded
- Массив с нагрузками (по порядку RPS) (ваш и ваш опп)
history
- Строка со всеми пьесами, последний персонаж - последняя игра (ваша и ваш оппонент)
Вы должны вернуться "R"
, "P"
или "S"
. Если вы вернете что-то другое, это будет автоматический проигрыш в матче.
правила
Вы не можете изменить встроенные функции.
тестирование
Я буду держать Git обновленным с кодом и всеми ботами, отвечающими требованиям: https://github.com/Masclins/LoadedRPS
судейство
Победитель будет определен путем выбора человека с наибольшим количеством выигрышных матчей после 1000 полных раундов. Связи будут нарушены связанными спичками. Играется 1000 матчей, а не один, потому что я ожидаю много случайностей, и таким образом случайность будет менее актуальной.
Вы можете отправить до 5 ботов.
Конкурс заканчивается 4 июля (это будет последний день, когда я приму любой ответ), а 5 июля я опубликую итоговые результаты (возможно, постараюсь опубликовать предварительную заявку раньше).
Поскольку это мой первый KOTH, я на 100% готов изменить что-либо для улучшения, например, количество матчей против каждого бота.
Отредактировано до 1000 матчей, так как я вижу, что это действительно случайность.
источник
runcode
иbots
)?Ответы:
Статистик(больше не играет)Переключение между несколькими простыми стратегиями, основанными на ожидаемой прошлой производительности
Статистик 2
Nash
Вычисляет приблизительное равновесие Нэша по градиентному спуску.
источник
весовщик
Я потерял рассуждения, когда экспериментировал с кодом, но основная идея - оценить вероятность хода противника за последние 3 хода, используя некоторые веса, и умножить их на другой вес, который зависит от нагрузок. Я думал, что я
my_loaded
тоже могу как-то использовать , но я не мог решить, как, поэтому оставил это.сатана
Вероятно, будет дисквалифицирован, потому что это своего рода обман и он делает некоторые предположения относительно функции тестирования (она должна иметь функцию оппонента в переменной в своем фрейме стека), но технически это не нарушает никаких текущих правил - это не делает переопределить или переписать что-нибудь. Он просто использует черную магию, чтобы выполнить функцию противника, чтобы увидеть, какой ход он сделал / будет делать. Он не может справиться со случайностью, но у детерминированных ботов нет шансов победить сатану.
источник
my_loaded
вы можете добавить вес, который оценивает ход, который потеряет по сравнению с вашим последним ходом. Это все равно что предполагать, что ваш противник будет делать что-то похожее на то, что вы делали, и поэтому наказывать его за то, что вы будете продолжать играть так же. Что-то вроде:for i, m in enumerate(reversed(my_history[-3:])): sc[(idx[m]+1)%3] += (K / (1 + i))
монтер
Этот бот улучшает Pattern и объединяет его с Economist (Pattern и Economist больше не будут участвовать)
Улучшение паттерна заключается в том, что бот теперь ищет два типа паттернов: противник реагирует на его последнюю игру и оппонент реагирует на мою последнюю игру. Затем оценивает оба прогноза, чтобы использовать тот, который подходит лучше всего.
Из этого паттерна у бота теперь есть вероятность для R, P и S. Принимая это во внимание и ожидаемую ценность каждой игры (как это сделал Экономист), бот играет ту, которая дает наибольшую ценность.
Вот два старых кода
Pattern(больше не играет)Шаблон пытается найти шаблоны на своего противника. Похоже, что противник сыграл после последней игры (придавая больше веса последним играм). Посредством этого он угадывает, что будет играть противник, и играет противодействие этому.
Экономист(больше не играет)The Economist делает следующее: угадывает вероятность каждой игры противника, наблюдая за тем, что он сыграл последние 9 ходов. Исходя из этого, вычисляется ожидаемая выгода от каждой игры и идет с той, которая имеет наилучшую ожидаемую ценность.
источник
Иггдрасиль
Это называется "Yggdrasil", потому что он смотрит в будущее в дереве игры. Этот бот не выполняет никакого предсказания противника, он просто пытается сохранить статистическое преимущество, если оно ему дано (путем балансирования текущей и будущей прибыли). Он рассчитывает примерно идеальную смешанную стратегию и возвращает случайный ход, выбранный с этими весами. Если бы этот бот был безупречен (а это не так, потому что функция оценки состояния довольно плохая, и она не выглядит слишком далеко вперед), тогда было бы невозможно победить этого бота более, чем в 50% случаев. Я не знаю, насколько хорошо этот бот будет делать на практике.
источник
Anti-повторитель
Выбирает бумагу в первый ход, после чего он возвращает все, что бьет больше, чем сделал противник, выбирая бумагу в случае ничьей.
обезьяна
Просто копирует противников последний ход.
Anti-Anti-Жадные
Выбирает все, что проигрывает наиболее взвешенному выбору противника.
Немного голодный
источник
Мессенджер
рокзвезда
убийца
объяснение
Теперь вы можете подумать, что эти боты совершенно глупы.
не совсем верно, они на самом деле основаны на идее накопления огромного бонуса, когда противник делает оплошность и получает за это удар.
теперь эти боты играют очень похоже на жадных, однако они проще и не выбирают случайным образом, пока не получат нагрузку на одно оружие, они придерживаются своего выбора.
Еще одна вещь, которую стоит отметить: каждый из них будет биться жадным примерно в половине случаев, занимая треть времени и теряя одну шестую времени. когда они действительно побеждают, они будут стремиться выиграть много. почему это?
Жадный, пока он не проиграет раунд, будет случайным образом подбирать оружие. это означает, что когда он не выигрывает раунд, он снова выбирает оружие случайным образом, которое снова может быть выигрышным. если жадный тянет или проигрывает, он придерживается этого оружия. если жадный выигрывает хотя бы один раунд, то выбирает то же оружие, что и бот, жадный выигрывает. если в какой-то момент жадный игрок выберет утерянное оружие, наш бот выиграет, потому что нагрузка на наше оружие была бы выше, чем у жадного игрока.
Предполагая, что жадный игрок не всегда просто выбирает выигрышное оружие из-за большого шанса, это означает, что шансы:
1/3: {1/2 победы (всего 1/6). 1/2 проигрыша (всего 1/6). }
1/3 ничья
1/3 победа
итак: 1/3 шанс на ничью, 1/6 шанс на проигрыш, 1/2 шанс на победу.
это, вероятно, показывает, что вам нужно сделать несколько игр из нескольких раундов
это главным образом, чтобы бросить вызов
источник
Реактор
Делает игру, которая выиграла бы в предыдущем раунде.
источник
opp_history[len(opp_history)-1]
наopp_history[-1]
.Вычурный ребенок
Этот бот ведет себя как ребенок, играющий в поделки, начнёт с бумаги и будет использовать бумагу или ножницы случайным образом, но не будет использовать ножницы после камня или ножницы, потому что ей нужно использовать ножницы на бумаге. Бросит камень обратно в любого, кто бросит камень в нее.
источник
Вот три бота, которые я собрал для тестирования:
RandomBot
жадный
Просто выбирает его наиболее загруженный вариант.
Antigreedy
Предполагается, что противник будет играть жадным и разыгрывает альтернативу победы.
источник
Не голодны
Это буквально обратное Greedy, оно выбирает вариант с наименьшим количеством баллов.
источник
Используйте оппонента в избранное
Для первого хода выбирается случайный предмет. Для каждого второго хода используется наиболее распространенный выбор противника. Если есть связь, по умолчанию это самый ранний и наиболее распространенный выбор.
// Я украл код отсюда
Победа это хорошо
Возвращает выбор победителя предыдущего раунда. Если предыдущий раунд был ничьим, рекурсивно проверяет раунд до этого. Если это были только связи, или это первый раунд, возвращается случайный выбор.
источник
Лучшее обоих миров
Этот бот в основном сочетает в себе Anti-Greedy и Greedy (отсюда и название).
источник
find
для строк.my_loaded
иopp_loaded
оба списка.index
должно быть хорошо для того, что вы хотите.NashBot
Произвольно выбирает один из трех вариантов таким образом, чтобы у оппонента статистически не было предпочтения между ходами в отношении того, сколько очков он набрал; иными словами, у Жадного и Не голодного должен быть одинаковый средний ожидаемый результат.
источник
Expectedbayes
Изменить: Обновленный рейтинг
Это новый топ-рейтинг после включения Expectedbayes:
Пояснения
(NB: сообщение от 05.06.2017)
Этот бот пытается максимизировать ожидаемую ценность своего следующего хода:
Вероятности обновляются каждые десять ходов. Количество прошлых ходов, использованных для вычисления вероятностей, было установлено равным 10 для каждого бота (таким образом, всего 20 функций). Это, вероятно, перезаписывает данные, но я не пытался проверить дальше.
Он полагается на библиотеку scikit для вычисления вероятностей ходов противника (я говорю это в случае, если я неправильно прочитал правила, и это фактически было запрещено).
Он легко выигрывает у ботов, которые всегда делают один и тот же выбор. Удивительно, но он довольно эффективен против случайного бота с 93% -ной вероятностью выигрыша (я полагаю, это связано с тем, что он ограничивает количество очков, которые может получить его оппонент, при этом максимально увеличивая свое количество возможных очков за каждый раунд).
Я сделал быструю попытку с 100 ходами и ограниченным количеством ботов, и вот что я получил от result_standing:
Что не так уж и плохо!
источник
велосипедист
0
источник
Ансамбль
Несколько конкурирующих алгоритмов голосуют за лучшее решение.
Обмен
Делает случайный ход, но без повторения последнего хода.
источник
blodsocer
socery
Я дал это исправить, так что, вероятно, теперь должно работать
Я снова что-то испортил, поэтому удалил и восстановил. Я делаю много беспорядков.
источник
if opp_history[1] == "S": return "R" elif opp_history[1] == "R": return "R" else: return "P"
что это за недовольство?elif min(opp_history.count(i) for i in "RPS")/max(opp_history.count(i) for i in "RPS") >0.8 and len(my_history)>30:
"RPS"[my_loaded.index(max(my_loaded))+len(my_history)%2]
но это выглядит вне диапазона (как и дальнейшие строки).Взвешенный случайный
Как и RandomBot, но он выбирает только 2 для броска при каждом вызове. Иногда будет бить Rockstar или Assassin, но будет накапливать баллы другого (например, если он побьет Rockstar, это даст Assassin повышение балла).
источник
Жадный психолог
Назван так потому, что по умолчанию он жадный, но если он не может решить, он противостоит тому, что сделает противник, если он использует жадную стратегию. Если это все еще не может решить, это идет случайно.
источник