Результаты (22 мая 2017 21:40:37 UTC)
Master
выиграл 18 раундов, проиграл 2 раунда и
Save One
выиграл 0 раундов, выиграл 15 раундов, проиграл 3 раунда и
Machine Gun
выиграл 2 раунда, выиграл 14 раундов, проиграл 3 раунда и
Monte Bot
выиграл 3 раунда, выиграл 14 раундов, проиграл 3 раунда и
Amb Bot
выиграл 3 раунда, выиграл 12 раундов, проиграл 8 раундов, и 0 раундов
Coward
выиграл 11 раундов, проиграл 3 раунда, 6 раундов
Pain in the Nash
выиграл 11 раундов, потерял 9 раундов, и 0 раундов
Nece Bot
выиграл 10 раундов, проиграл 7 раундов, а 3 раунда
Naming Things is Hard
выиграл 10 раундов, проиграл 7 раундов и сыграл в три раунда,
The Procrastinator
выиграл 10 раундов, проиграл 8 раундов, проиграл 2 раунда,
Yggdrasil
выиграл 10 раундов, проиграл 10 раундов и сыграл в сетку 0 раундов,
Simple Bot
выиграл 9 раундов, проиграл 4 раунда, и сыграл в 7 раундов,
Table Bot
выиграл 9 раундов, потерял 6 раундов и 5 раундов
Prioritized Random Bot
выиграл 8 раундов, проиграл 7 раундов и 5 раундов
Upper Hand Bot
выиграл 7 раундов, проиграл 13 раундов и
Aggressor
выиграл 0 раундов, выиграл 6 раундов, проиграл 10 раундов и
Insane
выиграл 4 раунда, выиграл 5 раундов, проиграл 15 раундов и сыграл 0 раундов,
The Ugly Duckling
выиграл 4 раунда, проиграл 16 раундов и
Know Bot
выиграл 0 раундов 3 раундов, проиграв 14 раундов и сыграв в 3 раунда,
Paranoid Bot
выиграл 0 раундов, проиграл 19 раундов и 1 раунда
Panic Bot
выиграл 0 раундов, проиграл 19 раундов и связал 1 раунд
К сожалению, я не смог протестировать The Crazy X-Code Randomess, потому что не могу запустить его из bash на Linux. Я включу его, если смогу заставить его работать.
Игра
Это очень простая игра KoTH. Это снежный бой один на один. У вас есть изначально пустой контейнер, который может вместить k
снежки. Вы можете уклониться от j
времени. Каждый ход обоим игрокам предлагается одновременно выбирать, какой ход делать. Есть три хода:
- перезагрузка: дает вам еще один снежный ком (до
k
) - throw: бросает снежный ком, который убьет другого игрока, если он решит перезагрузить. Если оба игрока бросают снежный ком, никто не умирает (у них такая хорошая цель, что они бьют друг друга снежками)
- утка: ничего не делает и избегает попадания, если другой игрок бросает снежок. Если у вас больше не осталось уток, то ничего не происходит, и если другой игрок бросает снежок, вы умрете.
Задача
Не умирай
Challlenge Технические характеристики
Ваша программа может быть написана на любом языке. Вы должны принять каждую из этих переменных в качестве аргумента при каждом выполнении:
[turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs]
turn
- сколько ходов прошло ( 0
на первой итерации)
snowballs
- сколько снежков у вас есть
opponent_snowballs
- сколько снежных комов у противника
ducks
- сколько еще раз вы можете прыгнуть
opponent_ducks
- сколько еще раз противник может прыгнуть
max_snowballs
- максимальное количество снежных комов вы можете магазин ( k
)
Вывод ключевой функции должен быть 0
для перезагрузки, 1
для броска и 2
для утки. Вы должны вывести свой ход, перевод строки завершен. Пожалуйста, не выводите недопустимые ходы, но контроллер очень устойчив и не сломается, если вы выводите недопустимые ходы (даже если ваш ход не является целым числом). Это должно быть завершено новой строкой, хотя. Если движение не включено [0, 1, 2]
, оно по умолчанию будет перемещено в 0
. Победитель будет определен как игрок с наибольшим количеством побед в полном круговом турнире.
правила
Вы можете читать / записывать из / в один файл для хранения памяти между итерациями. Ваш бот будет размещен в своем собственном каталоге, чтобы не возникало конфликтов с именами файлов. Вы не можете изменить встроенные функции (такие как генератор случайных чисел). В первый раз это было довольно забавно , но больше не будет. Ваша программа не имеет права делать вещи, которые являются просто явным срывом выполнения. Применяются стандартные лазейки .
тестирование
Исходный код для контроллера можно найти здесь . Пример бега на нем: java Controller "python program1/test1.py" "python program2/test2.py" 10 5
на 10 снежков и 5 уток.
судейство
Победитель будет определен путем выбора человека, получившего наибольшее количество побед после полного раунда. Пока это ничья, уберите всех людей, у которых больше нет побед. Затем повторяйте, пока один человек не победит. Стандарт судейства - 50 снежков и 25 уток.
С Днем Рождения!
РЕДАКТИРОВАТЬ : Игра будет объявлена ничья, если 1000 раундов проходит. Ваш бот может предположить, что turn < 1000
.
источник
Ответы:
Мастер, C #
Я тренировал небольшую нейронную сеть (используя Sharpneat ). Кажется, нравится собирать снежки и нырять ...
В предыдущей версии контроллера он даже обнаружил ошибку. Он пошел от 0% выигрыша до 100%, когда обнаружил, как выиграть, обманывая.
Изменить: я забыл сбросить внутреннее состояние сети и неправильно обучил сеть. Вновь обученная сеть намного меньше.
источник
Сохранить один, Python
Немедленно выбрасывает большинство снежных комов, но всегда спасает их, если противник наблюдает за отсутствием патронов. Затем он уклоняется как можно дольше (опять же, сохраняя 1) перед перезагрузкой, если нет гарантированной безопасной перезагрузки или гарантированного уничтожения.
источник
PrioritizedRandomBot, Java
Этот бот выбирает случайное целое число в диапазоне
0
доos + od
, а затем выбирает бросок, уток или перезагрузку, с порогами, определяемыми его текущим количеством снежков и уток.Важно понимать, что если у одного бота больше снежков, чем у другого - снежки + утки, вы можете выиграть. Отсюда можно придумать понятие «очки»:
Если любое из этих чисел становится положительным, то этот игрок может выиграть.
Таблица «разница в очках» составляет основу теории игр для этого соревнования. Он не совсем фиксирует всю информацию, но показывает, что снежки в основном ценнее уток (так как снежки - это и нападение, и защита). Если противник бросает снежный ком, и вы успешно уклоняетесь, то вы на один шаг ближе к насильственной победе, поскольку ваш противник израсходовал более ценный ресурс. В этой таблице также описано, что вам следует делать во многих особых случаях, например, когда определенные варианты перемещения недоступны.
Таблица «сумма очков» показывает, как со временем сумма очков приближается к нулю (когда у обоих игроков заканчиваются утки), и в этот момент первый игрок, совершивший ошибку (перезагружается, когда им это не нужно), немедленно проигрывает.
Теперь давайте попробуем распространить эту стратегию форсирования на случаи, когда она на самом деле не является насильственной (например, мы выигрываем с большим отрывом, но чтение мыслей со стороны оппонента нас побьет). В основном, у нас есть
s
снежные комья, но нам нужно время для того, чтобы выиграть у нашего оппонентаs+1
(илиs+2
и т. Д.). В этом случае мы хотим либо выполнить несколько уток, либо несколько перезагрузок, чтобы выиграть себе время.Прямо сейчас, этот бот всегда пытается прокрасться в некоторых утках, просто потому, что тогда он не рискует немедленной потерей: мы предполагаем, что противник придерживается аналогичной стратегии, выпуская как можно больше снежков, поэтому попытка перезагрузки действительно опасно. Кроме того, чтобы предотвратить предсказуемость, мы хотим использовать их в соответствии с равномерно-случайным распределением: вероятность уклонения связана с тем, сколько уток нам нужно выполнить относительно количества снежных комов, которые нам нужно бросить.
Если мы сильно проигрываем, и в этом случае
s + d < os + od
нам нужно подкрасться к некоторым перезагрузкам в дополнение к использованию всех наших уток, в этом случае мы хотим перезагрузить случайно, но только столько раз, сколько нам нужно.Вот почему наши боты расставляют приоритеты в порядке броска, утки и перезагрузки и используют
os + od
для генерации случайного числа, поскольку это пороговое число ходов, которое нам нужно сделать.Есть один крайний случай и два других особых случая, которые в данный момент обрабатывает бот. Крайний случай - когда у противника нет ни снежков, ни уток, и поэтому рандомизация не работает, поэтому мы бросаем, если возможно, в противном случае мы перезагружаемся. Еще один особый случай - когда противник не может перезарядиться, и поэтому нет смысла бросать (так как противник будет либо уклоняться, либо бросать), поэтому мы всегда уклоняемся (поскольку спасение наших снежных комов более ценно, чем спасение наших уток). Последний особый случай - если у противника нет снежных комов, в этом случае мы берем его на себя и перезагружаем, если это возможно.
источник
NeceBot - Python
Вот таблица теории игр для игры:
Где
~
означает отсутствие преимущества,W
это победа,L
проигрыш,+-S
означает, что снежный ком получен / потерян над противником, и+-D
означает, что утка получена / потеряна над противником. Это абсолютно симметричная игра.Обратите внимание, что мое решение не учитывает эту таблицу. Потому что я плохо разбираюсь в математике.
Он называется NeceBot, потому что он сначала пытается уменьшить то, что необходимо. После этого у него есть несколько произвольных стратегий, которые, я надеюсь, сработают.
источник
<3
с лол. +1 за то, что у вас есть игровой стол, а затем он не используется: P Но хорошее решение :)3 + opponent_snowballs <3
это может быть ошибкой?<3
s делает код довольно сложным для понимания :(Трус - Скала
Броски, если у противника нет боеприпасов, в противном случае (в порядке приоритета) уток, бросок или перезарядка.
источник
TheUglyDuckling - Python
Всегда будет прятаться, пока не сможет бросить, если противник пуст, или перезагрузить, если оба пусты. Будет использовать перезагрузку в качестве последнего средства.
источник
SimpleBot - Python 2
Простые вещи.
источник
Бот, который называет вещи сложными - VB.NET
Назвать вещи сложно, и я не уверен, что у меня есть сплоченная стратегия, чтобы назвать это.
Пытается сыграть в первые несколько раундов, чтобы одержать раннюю победу. После этого играет безопаснее остальное время, пытаясь победить путем истощения.
источник
Пулемет, Питон 3
Пытается накопить снежные комья, пока не будет гарантированно убит противник или пока он не выйдет из уток (В этом случае он начинает вслепую стрелять всеми своими снежными комьями, как пулемет)
Он также уклоняется всякий раз, когда у противника есть снежный ком, потому что он не хочет умирать.
источник
Knowbot, Python3
Отслеживает частоту предыдущих ходов, предполагает, что противник сделает самый повторный ход, защищается от этого.
** Обновлено, чтобы не ожидать ходов, которые противник не может сделать **
источник
Брайнгольф , Агрессор
Агрессор не трус! Если у него снежный ком, он бросит! Если у него нет снежков, он сделает больше!
Braingolf , Безумный
На самом деле это не бот, а просто программист, которого я похитил и заставил переносить каждый проект, который он когда-либо делал, в Braingolf. У него больше нет клочка здравомыслия.
Генерирует случайное число меньше 3 и выдает,
t % r
где t - текущий поворот, а r - случайное числоЧтобы запустить их, вам нужно скачать
braingolf.py
с github, а затем либо сохранить код Braingolf в файл и запуститьили просто вставьте код прямо так
Входные данные довольно неактуальны, поскольку второй аргумент после кода / имени файла - это количество снежных комов, которые имеет Агрессор.
Примечание: агрессор фактически ведет себя идентично TestBot, я просто хотел сделать запись в Braingolf
Braingolf , The Brainy [ сломано прямо сейчас]
источник
TestBot - Python
Это тестовое представление, чтобы показать вам, как может выглядеть действительное представление. Стратегия: Альтернативная перегрузка и бросание. Довольно плохая стратегия, но она дает вам представление о том, как ваша программа должна работать.
источник
_, turn, snowballs, opponent_snowballs, ducks, opponent_ducks, max_snowballs = sys.argv
ли аргументы?sys.argv[1:]
если вы не хотите возиться с этим_
UpperHandBot, Python 3
Этот бот пытается собрать больше снежков, чем его противник, и в этот момент начинает бросать. Если в любой момент UHB не имеет больше снежных комов, чем его противник, он будет:
источник
Иггдрасли, Ява
Я назвал этого бота "Yggdrasil", потому что он на самом деле смотрит вниз по дереву игры и выполняет оценку состояния, из которой он может вычислить приблизительно идеальную смешанную стратегию. Поскольку он опирается на смешанные стратегии, он очень недетерминирован. Я не знаю, насколько хорошо это будет сделано в реальной конкуренции.
Несколько вещей об этом боте:
источник
Боль в Нэше (C ++)
Так назвали, потому что факт, что я должен был написать свой собственный решатель равновесия Нэша, был настоящей болью. Я поражен, что нет никаких доступных библиотек, решающих Nash!
Компилировать как C ++ 11 или лучше. Для производительности хорошо скомпилировать с поддержкой OpenMP (но это только для скорости; это не обязательно)
Это использует равновесия Нэша, чтобы решить, что делать на каждом ходу, что означает, что в теории он всегда будет выигрывать или выигрывать в долгосрочной перспективе (в течение многих игр), независимо от того, какую стратегию использует противник. Будет ли это на практике, зависит от того, допустил ли я какие-либо ошибки в реализации. Однако, так как в этом соревновании KoTH есть только один раунд против каждого оппонента, он, вероятно, не будет очень хорошо в таблице лидеров.
Моя первоначальная идея состояла в том, чтобы иметь простую функцию оценки для каждого игрового состояния (например, каждый шар стоит + b, каждая утка + d), но это приводит к очевидным проблемам с определением того, какими должны быть эти оценки, и означает, что это не может действовать на уменьшение отдачи, собирая все больше и больше шаров и т. д. Таким образом, вместо этого будет проанализировано все игровое дерево , работающее в обратном направлении, начиная с хода 1000, и заполнены фактические оценки, основанные на том, как каждая игра может получиться.
В результате я понятия не имею, какую стратегию он использует, за исключением пары жестко закодированных «очевидных» действий (бросайте снежки, если у вас больше мячей, чем у вашего противника, шары + утки, и перезагружайте, если вы оба выбываете) снежки). Если кто-то хочет проанализировать набор данных, который он производит, я думаю, что есть интересное поведение, которое нужно обнаружить!
Тестирование против «Save One» показывает, что он действительно выигрывает в долгосрочной перспективе, но только с небольшим отрывом (514 побед, 486 поражений, 0 ничьих в первой партии из 1000 игр и 509 побед, 491 поражение, 0 рисует во втором).
Важный!
Это будет работать из коробки, но это не очень хорошая идея. На моем ноутбуке с умеренной спецификацией требуется около 9 минут, чтобы создать полное дерево игр. Но он сохранит окончательные вероятности в файле, как только они будут сгенерированы, и после этого каждый ход просто генерирует случайное число и сравнивает его с 2 байтами, так что это супер-быстро.
Чтобы сократить все это, просто загрузите этот файл (3,5 МБ) и поместите его в каталог с исполняемым файлом.
Или вы можете создать его самостоятельно, запустив:
Который будет сохранять один файл за ход, до схождения. Обратите внимание, что каждый файл имеет размер 3,5 МБ, и он будет сходиться на повороте 720 (то есть 280 файлов, ~ 1 ГБ), и, поскольку большинство игр не приближаются к повороту 720, файлы предварительной конвергенции имеют очень низкую важность.
источник
Свифт - TheCrazy_XcodeRandomness
К сожалению, это может быть выполнено только локально, в Xcode, потому что он содержит
Foundation
модуль и его функциюarc4random_uniform()
. Тем не менее, вы можете в значительной степени сказать, что алгоритм:источник
swift
команду, а затем проверьте, работает ли онаFoundation
, извините: /TableBot, Python 2
Вызывается TableBot, потому что он был создан путем реализации этой таблицы:
1 обозначает наличие 1 или более, 0 обозначает отсутствие.
Бот:
Попробуйте онлайн!
источник
AmbBot - Схема ракеток
Я в основном хотел попробовать
amb
, потому что это круто. Этот бот случайным образом упорядочивает параметры (перезагрузить, выбросить и сбросить), отфильтровывает те, которые не имеют смысла, и выбирает первый вариант. Но с помощьюamb
мы получаем использование продолжения и возврата!Я также создал небольшую тестовую программу для запуска двух этих ботов друг против друга. Такое чувство, что второй бот побеждает чаще, так что, возможно, я где-то допустил ошибку.
источник
MonteBot, C ++
Я в основном взял код из этого кота и изменил его для этой задачи. Он использует алгоритм поиска дерева Монте-Карло в разложенном виде. Это должно быть довольно близко к равновесию Нэша.
Инструкция по компиляции для Linux:
Сохранить в
MonteBot.cpp
.Беги
g++ -o -std=c++11 MonteBot MonteBot.cpp
.Команда для запуска:
./MonteBot <args>
источник
Прокрастинатор - Python 3
Промедлитель откладывает игру, сохраняя первые пару ходов. Внезапно панический монстр хочет избежать проигрыша в войне за ресурсы, противодействуя наиболее часто используемому ходу противников.
источник
ParanoidBot и PanicBot - ActionScript3 ( RedTamarin )
Из неподходящего нишевого языка (с расширениями для обеспечения аргументов командной строки) приветствуется хитрый ParanoidBot и его скучный союзник PanicBot.
ParanoidBot
ParanoidBot сходит с ума и имеет совершенно ненужную стратегию, от которой зависит. Во-первых, он запускает снежки до тех пор, пока не будет достигнут порог, оставляя некоторые в запасе. Затем, после трех предостерегающих уток, начинается паранойя, и бот пытается накапливать больше снежных комов между случайными утками. После пополнения запаса ParanoidBot возвращается к слепому броску. Из-за голоса в его голове, ParanoidBot может сказать, гарантированно он выиграет или проиграет, и будет соответствующим образом «разрабатывать стратегию».
Брекеты немного шаткие, чтобы уменьшить размер
PanicBot
Уже сойдя с ума, PanicBot реагирует из-за инстинктивного страха. После того, как утки утекли от страха, PanicBot вслепую бросает все свои снежные комья, затем отчаянно делает и бросает больше снежных комов, пока (вероятно) не победит.
Это одна из менее чем 15 других записей, использующих AS3 здесь на PPCG. Однажды, возможно, этот, возможно, экзотический язык найдет загадку для доминирования.
источник
snow.as
, в bash должно работать следующее:$ ./redshell snow.as -- 0 50 50 25 25
chmod +x redshell
твой друг здесь ...Защитник, Питон
Перезагрузка, когда ни у одного из игроков нет снежков. Если у него есть снежки, он бросает. Если у него нет снежных комов, но у противника есть, он уклоняется, если может, иначе перезагружается.
Примечание: еще не проверено
источник