ПРИМЕЧАНИЕ. В настоящее время этот вызов не решен, поскольку я не могу установить языки, необходимые для запуска матча. Если у кого-то есть время и интерес, чтобы сделать это, я не против.
Смотрите в нижней части поста для лидеров.
Это полу-кооперативный вызов царя холма, где боты строят пути через двумерный сеточный граф. Бот, который контролирует узлы с наибольшим количеством трафика, является победителем. Однако для создания соединительного пути требуется больше, чем один бот, поэтому ботам придется работать вместе - в некоторой степени.
Игровой процесс
Далее, пусть N > 0
будет количество ботов в игре.
Сетки
Игра ведется на двумерной целочисленной сетке размером , нижняя левая координата которой равна . Каждая координата с имеют исходящие ребра к трем координатам , и над ним, где -координаты берутся по модулю . Это означает, что сетка оборачивается на восточном и западном краях. Каждая нижняя координата является источником , а каждая верхняя координата является стоком .⌊4/3N2⌋ × ⌊4/3N2⌋
(0,0)
(x,y)
0 ≤ y < ⌊4/3N2⌋-1
(x-1,y+1)
(x,y+1)
(x+1,y+1)
x
⌊4/3N2⌋
(x,0)
(x,⌊4/3N2⌋-1)
На следующем рисунке показана 8 × 8
сетка.
Каждая вершина графа является неактивной , активной или сломанной . Все вершины начинаются неактивно и могут быть активированы ботами, которые затем станут их владельцами. Кроме того, боты могут ломать вершины, и они не могут быть восстановлены.
Заказ поворота
Поворот состоит из фазы разрушения и фазы активации . На этапе уничтожения каждый бот может сломать одну неактивную вершину. С тех пор эта вершина нарушается и может быть никем не активирована. На этапе активации каждый бот может активировать одну неактивную вершину. С тех пор они владеют этой вершиной, и никто другой не может ее активировать. У нескольких ботов может быть одна вершина, если они все активируют ее в один ход. На каждом этапе выбор вершин выполняется одновременно.
счет
Один раунд длится ровно по очереди. После этого раунд засчитывается следующим образом. Из каждой активной исходной вершины мы выполняем случайный поиск в глубину вдоль активных вершин (это означает, что дочерние элементы каждой вершины посещаются в случайном порядке). Если путь найден от источника до некоторого стока, то для всех вершин вдоль этого пути каждый владелец вершины получает одну точку.N2
N
Вся игра длится 100 раундов, и бот с наибольшим количеством очков является победителем. Я могу увеличить это число, если дисперсия оценок слишком высока.
Дополнительные правила
- Нет возиться с контроллером или другими представлениями.
- Максимум одно представление на одного участника.
- Никакие внешние ресурсы, кроме одного личного текстового файла, очищены в начале игры.
- Не заставляйте своего бота побеждать или поддерживать конкретных противников.
- Предоставьте команды для компиляции и запуска вашего бота. Любой компилятор / интерпретатор, который свободно доступен для Debian Linux, является приемлемым.
Контроллер
Контроллер написан на Python 3 и может быть найден в GitHub . Смотрите файл README для получения подробных инструкций. Вот API для начала:
- Боты запускаются в начале каждого раунда и сохраняются до конца раунда. Связь с контроллером осуществляется через STDIN и STDOUT, используя завершающие строки сообщения.
BEGIN [num-of-bots] [num-of-turns] [side-length]
ввод в начале.DESTROY [turn]
вводится в начале каждой фазы уничтожения. Ваш бот должен ответить либоVERTEX x,y
выбрать вершину, либоNONE
.BROKEN [turn] [your-choice] [other-choices]
вводится в конце каждой фазы разрушения. Порядок других ботов рандомизируется в начале каждой игры, но остается неизменным в течение этого времени. Выбор представлен какx,y
илиN
.ACTIVATE [turn]
иOWNED [turn] [your-choice] [other-choices]
являются эквивалентами вышеуказанного для фазы активации и имеют одинаковую семантику.SCORE [your-score] [other-scores]
ввод в конце игры.- У вашего бота есть 1 секунда, чтобы проанализировать результаты фазы и выбрать следующую вершину, и 1 секунда, чтобы выйти после получения оценки. Я протестирую материалы на своем относительно старом ноутбуке, поэтому лучше оставить здесь запас.
Пожалуйста, не забудьте очистить ваш выходной буфер. Невыполнение этого требования может привести к зависанию контроллера в некоторых средах.
Leaderboard
Обновлено 13.03.2015
Peacemaker запущен и работает, и Funnelweb также получил обновление. Баллы подскочили на порядок. Коннектор превысил ограничение по времени в двух играх.
Funnelweb: 30911
Connector: 18431
Watermelon: 3488
Annoyance: 1552
Explorer: 735
Checkpoint: 720
Random Builder: 535
FaucetBot: 236
Peacemaker: 80
Полный журнал с графикой ASCII можно найти в репозитории контроллера, в graphical_log.txt
.
Некоторые наблюдения:
- Соединитель можно очень легко остановить, разбив одну вершину перед ним. Я подозреваю, что раздражение часто делает это. Однако в настоящее время это не имеет большого смысла, поскольку только Connector может создать путь.
- Арбуз может получить приличный счет, просто оказавшись на соединительном пути (так как DFS, скорее всего, будет использовать его вершины).
- Исследователь любит выращивать виноградные лозы из арбузов.
- Обновленный Funnelweb получает действительно хорошие оценки, поскольку Connector обычно фиксирует его в нижней половине сетки.
- Игры становятся довольно длинными, средний раунд занимает около 25 секунд на моей машине.
4/3*N^2
, и даже там у ботов были проблемы с формированием правильных путей. Однако, Connector был временно дисквалифицирован из-за ошибки, и теперь, когда это было исправлено, я ожидаю, что игры будут более интересными. Сегодня вечером я запущу еще одну партию.Ответы:
Соединитель (Java)
Пытается создать путь в случайной позиции. Поскольку он не может создать путь сам по себе, он ищет активные ячейки и использует их. Кредит идет на Geobits, у которого я украл некоторый код Кроме того, эта отправка еще не закончена, так как она просто перестает делать что-либо, как только будет построен путь.
Редактировать: если путь построен, Connector пытается создать несколько путей вдоль существующего.
источник
java.lang.ArrayIndexOutOfBoundsException: -1 at Connector.findExtendingPathPoint(Connector.java:166)
.Воронка, Python 2
версия 1.2 - улучшено объединение кода, добавлена новая анимация
Назван в честь одного из менее дружелюбных пауков Австралии. Этот бот сначала строит гнездо в форме воронки в верхних рядах, а затем заманивает других ботов на пути строительства к гнезду.
Вот новая анимация игры с 6 ботами на доске 4 / 3N ^ 2, показывающая воронку и несколько простых ботов:
Python-код funnelweb:
Паук бежит с
python funnelweb.py
.источник
Контрольная точка, Java
Этот бот пытается создать контрольные точки, чтобы любой допустимый путь проходил через одну из моих вершин. Так как есть N 2 поворотов и доска имеет 2N 2 в поперечнике, я могу активировать / разбить каждый узел на одной горизонтальной линии (при условии, что я там первый). Сделайте это по-другому (
x
сломано,o
это мое):Если вы хотите проложить путь, вам нужно пройти через мои контрольные точки :)
Теперь есть несколько проблем, с которыми это может столкнуться. Во-первых, это не будет очень хорошо, если есть много путей. Поскольку он сам не делает никаких продуктивных путей, он действительно полностью зависит от присутствия некоторых конкурентов. Даже пара конкурентов, объединившихся в единый путь, мало чем поможет, так как он получает только одно место за каждый найденный путь. То, что ему нужно, чтобы сиять, - это, вероятно, немало ботов, делающих немало разных путей. Даже тогда это может быть не очень высоко, но у меня была идея в чате, так что ...
Если одно из пробелов на линии уже заблокировано / заявлено, я просто ищу ближайший участок, который могу использовать (желательно на той же
x
строке, только смещенный вертикально).Чтобы скомпилировать, это
javac Checkpoint.java
. Бежатьjava Checkpoint
. Вы хотите добавить / изменить путь, чтобы отразить, где бы он ни находился.источник
Арбуз, Ява
Попытки нарисовать арбузы на сетке.
источник
FaucetBot (в R)
Создает узкое место во второй строке и активирует узлы на пути позади него.
Если я не облажался, окончательная конфигурация должна выглядеть примерно так:
Команда есть
Rscript FaucetBot.R
.источник
Миротворец, Ява
Основано на коде Ману.
Миротворец ищет конфликтные зоны (т. Е. Большинство BROKEN или ACTIVE концентрации вершин) и активирует случайную вершину поблизости.
источник
while
циклеactivate
метода. Вы прекращаете поиск, когда находите вершину, которая не принадлежит вам и не нарушена - но она может принадлежать кому-то другому, поэтому вы не можете ее активировать.Случайный строитель, Python 3
Это глупый пример бота, который никогда ничего не разрушает и пытается активировать случайную вершину каждый ход. Обратите внимание, что не нужно проверять, не активна ли вершина; контроллер позаботится об этом.
Запустить с командой
Возможно, вам придется заменить
python3
вpython
зависимости от вашей установки Python. Для этого просто отредактируйтеbots.txt
файл. Я обновил контроллер, и больше не нужно связываться с путями к файлам.источник
sys.stdout.flush()
вас можно просто сделатьflush=True
в качестве аргументаprint
.Explorer, Python 3
Стратегия активации:
Создает тепловую карту на основе состояния каждого узла (активный / неактивный / неисправный) и выбирает узел, который будет иметь наибольшее ожидаемое значение тепловой карты на человека, если он выберет этот.
Стратегия уничтожения:
Никогда ничего не разрушает, так как это мало помогает боту.
источник
Раздражение, Баш
Постарался, чтобы результат выглядел интереснее.
Беги с
bash annoyance.sh
.источник
Средний человек
Я видел, что некоторые боты построены сверху, а некоторые снизу. Это первое (я думаю) начало в середине и работа вверх и вниз.
(он не тестируется с контроллером, поэтому, если он не работает, дайте мне знать.)
источник