Шесть лет подряд мы (Mail.Ru Group) совместно с СГУ проводим Russian Ai Cup (соревнование по написанию игровых ботов). Придумываем игровой мир, пишем к нему API и сталкиваем лбами стратегии, написанные участниками. Выходит каждый раз довольно интересно, самобытно и вообще это крупнейший в СНГ ежегодный конкурс по ИИ!
Под этим же соусом мы осенью 2017-го года написали, запустили и провели первый контест на еще одной площадке, MiniAiCups, получился мини-клон Russian Ai Cup со своей странной атмосферой, правилами и механикой. Очень многим понравилось, и, после раздачи призов, мы, под шумок, обещали еще один конкурс. И наконец-то рады пригласить всех в нём поучаствовать.
Механика площадки
Существует игровой мир, живущий по определенным законам. Наружу из этого мира торчит API (просто текстовый протокол). В соответствии с этим API стратегия игрока, написанная на любимом языке, в цикле читает (просто из STDIN) изменения в состоянии мира и отправляет (просто в STDOUT) свои действия. Таким образом и происходит сама игра. Технические подробности — в конце поста.
Расписание
Все игры чемпионата будут проводиться в формате 4x1 (4 игрока в игре, каждый сам за себя). Игра может быть рейтинговой (влияет на расстановку игроков в рейтинговой таблице) и нерейтинговой (просто "дуэль", присмотреться к сопернику, потестировать стратегию, этакая песочница).
28 марта — открываем контест, начинаются нерейтинговые игры по 7500 тиков (тик — это одна неделимая единица времени в игровом мире)
2 апреля — старт рейтинговых игр по 7500 тиков (раз в несколько минут система будет стартовать несколько игр, выбирая участников по системе trueskill и начисляя очки по результатам)
19 апреля — TOP участников из песочницы проходят в финал, рейтинговые игры мы останавливаем и даем возможность создавать нерейтинговые игры по 25000 тиков
23 апреля — полностью останавливаем песочницу и проводим финал. Это будет множество игр по 40000 тиков, подбирать их мы будем так, чтобы в рамках игр 4x1 каждый сыграл с каждым. Потом дарим призы (о них ниже), все участники финала по традиции получают майки на память
26 апреля мы включим обратно песочницу с нерейтинговыми играми, и эта задача станет второй (вместе с осенней задачкой), которая останется работать вечно.
Вот так это будет. Мы постарались сделать так, чтобы между важными событиями конкурса было как можно больше выходных. Всё для вас.
Задача вкратце
А всё просто. Мы взяли agar.io, восхитились и решили сделать конкурс по механике сей замечательной игры. Сделали. Потом нам стало казаться, что слишком просто. Добавили инерцию при движении, немного физики… Всё ещё простовато. Окей, подумали и решили выставлять на каждую игру собственный набор коэффициентов инерции, ускорения, роста массы и всего того, что и составляет физику этого странного мира. На этом мы и остановились.
Таким образом, задача игрока сводится к тому, чтобы сначала разобраться с текущими физическими законами (либо всё на игровом поле летает пулей, мгновенно останавливаясь и разворачиваясь, либо ползает на инерции, норовя выйти куда-нибудь на орбиту). Ну а уже потом наступает такое милое сердцу "сожри-их-всех". Более подробные правила — ниже, после призов (да, есть призы).
Призы
За первое место дарим новый MacBook Air (или эквивалент по стоимости, у участника будет возможность выразить собственные пожелания).
Второе и третье места — Apple iPad
С четвертого по шестое место — Samsung Gear S3. Но, честно говоря, мы сами не знаем, что подарить, набросайте вариантов в комментариях. Мы ж сообщество.
По традиции, все, прошедшие в финал, получат майки с нашей символикой.
Правила чуть более подробно
Здесь я постараюсь неофициально описать правила так, чтобы донести суть механики чемпионата. Итак:
Игровой мир
Начнем с шок-контента — игровое поле у нас прямоугольное! Никто никогда так не делал, и вот опять :)
Отсчет координат начинается из левого верхнего угла. Каждый объект на поле обладает двумя координатами, массой и вектором скорости. Каждый объект — круг.
Коэффициенты
Перед стартом стратегия игрока вычитывает у игрового мира серию физических коэффициентов, в соответствии с которыми игровой мир будет жить. Это мера инерции, мера роста массы, максимальные скорости, и так далее. На каждую игру генерируем случайные величины (в определенных пределах).
Объект игрока, движение
В начале игры в мире рандомно (но симметрично от центральных осей) располагаются четыре игрока, представленные каждый своей выбранной стратегией. Масса у каждого пока небольшая, скорость нулевая. Пора двигаться, отжираться и расти, в этом и состоит суть победы. Указываем себе вектор движения (по сути, две координаты) и начинаем набирать скорость в соответствии с определенным в данной игре коэффициентом инерции, массы итп (всё это будет подробно описано в полных правилах на старте чемпионата). Вкратце, чем больше масса объекта, тем менее отзывчиво он реагирует на попытки придать ему импульс, кроме того, ограничивается максимальная скорость, которую он может развить.
Еда
Есть два способа увеличить собственную массу (а это нужно делать, так как игрок со временем эту массу теряет):
Во-первых, по игровому полю рассыпано некоторое количество "еды" — это небольшие неподвижные объекты, обладающие определенной массой. При перекрытии такого объекта, игрок добавляет массу такого объекта себе, а объект уничтожается. Время от времени на игровое поле добавляется еда (в рандомном месте, но равнозначно для четырех сторон поля).
Во-вторых, можно жрать друг друга. Если полностью перекрываются два игрока, то тот, который больше, добавляет себе массу того, который меньше. Съеденный же выносится с поля. Насовсем, до конца игры.
Звезды смерти
По факту, это вирус в терминологии agar.io. На карте случайным образом расположено некоторое количество "звезд смерти". Если игрок, уже превышающий массу звезды смерти, сталкивается с ней, то звезда смерти уничтожается. Игрока же разбрасывает взрывом на несколько более мелких частей (их количество, массы и импульсы зависят от многих параметров). После этого игрок управляет уже всеми этими объектами скопом (давая им вектор импульса в одну и ту же точку). В таком виде игрока легче сожрать, но скорость и отклик у более мелких объектов выше. При соприкосновении друг с другом части целого сливаются, так что можно и собраться обратно в нечто большое.
Деление, выброс массы
Кроме движения, стратегии игрока доступно еще два действия:
Деление. Каждая из подконтрольных игроку частей делится ровно на 2 части.
Выброс массы. Каждая из подконтрольных игроку частей выбрасывает небольшое количество собственной неуправляемой массы, направление которой считается по вектору скорости игрока. Получается этакий "выстрел едой". Если такая штуковина попадает в звезду смерти, то становится её (звезды) частью. "Перекормленная" звезда смерти выбрасывает свою часть в сторону, противоположную последнему выстрелу. Таким образом можно посплитить на части чужую слишком отожравшуюся стратегию.
Fog of war
Да, он есть. Видим не всё. Считается эллипсом, с учетом направления движения, зависит от множества параметров (размер группы, массы частей в группе, скорость). В целом, fog of war получился эм… весёлым.
Выбор победителя
В течение всей игры игроки так или иначе набирают игровые очки (начисляющиеся по игровым событиям). По этим очкам и присуждается победа в конце игры.
Если трое из четырех стратегий погибают, то игра может досрочно остановиться в тот момент, когда оставшийся выберется в top1 по очкам.
Технические подробности
В данный момент мы работаем с Go 1.10, Java 1.8, C# Mono 4.3, NodeJS 6, C++11, Python 2.7/3.5, php7. Кроме того, мы постарались максимально упростить добавление новых языков — нам понадобится лишь dockerfile по определенному шаблону, если вы захотите, чтобы ваш любимый язык XXX появился в списке поддерживаемых.
Максимальный объем исходного кода для одной стратегии — 20 мегабайт в архивированном виде в данный момент.
Если вы хотите, чтобы в списке уже поддерживаемых языков появились какие-либо библиотеки, нужные вам (мало ли, кто-то решит упороться в ML) — пишите в каментах, поставим всё, что успеем до 25 марта (впрочем, в ходе чемпионата будем по возможности продолжать наполнять docker-образы для ЯП).
Полные правила на старте чемпионата откроются в этом репозитории.
Изменения с прошлого чемпионата
Конечно же, мы не сидим на месте. С прошлого чемпионата:
- Был разработан правильный
localrunner
(написали на C). - Симуляция тоже на C, обсчет стал быстрее по сравнению с python-ом, который был в первом конкурсе
- Были добавлены debug-виджеты для дебага игр на сайте (начнется конкурс — увидите)
- Переработана схема запуска решений, теперь отдельное решение просто общается с STDIN и STDOUT, без необходимости держать локальный tcp-сервер. Мы делаем это за вас.
- Добавились всякие мелочи вроде оценок рейтингом и комментариями отдельных игр, правильного шаринга игр и рейтинга в соцсети… кнопочки, ссылочки, короче, вот этот вот весь вебчик
- Новые языки стало добавлять значительно проще, как для участников, так и для нас
Дизайн, меж тем, тот же. Мы решили окончательно притвориться, что мы так видим… :)
Погнали?
Регистрироваться можно уже сейчас на сайте aicups.ru, официальная группа чемпионата — @aicups, официальный канал для тех, кто не хочет в группу — @mrgchamps. Ждем вас, будет весело!
Комментарии (60)
dolphin278
19.03.2018 21:05Версию Node можно более новую? Сейчас уже даже LTS — 8-я (http://nodejs.org), да и если вы докером собираете, то вроде ничего сильно менять не придется, так что если 9-ка будет – совсем хорошо.
Adler3D
20.03.2018 01:55комментарий про бюджет(по курсу 5$/месяц_процессорного_времени) который будет потрачен на запуск стратегий в финале
holywalley
20.03.2018 16:08А можно Ruby? :)
sat2707 Автор
22.03.2018 17:53Можно. Поможете, если сделаете pull сюда аналогично прочим докерфайлам github.com/MailRuChamps/miniaicups/tree/master/agario/dockers
Питон уже сейчас активно наполняется, хаскель вот прилетел…
varus
20.03.2018 16:08А почему C# с Mono, а не с .NET Core? Может, добавите .NET Core 2.0?
OREZ
20.03.2018 23:48Тоже удивлен, почему моно в 2к18, давно уже кора стабильная.
sat2707 Автор
20.03.2018 23:50Честно говоря, мы с шарпами не очень дружим. Если поможете с докерфайлом, то не вижу препятствий
varus
21.03.2018 12:48На докерхабе у майкрософт есть готовые докерфайлы для разных версий кора: hub.docker.com/r/microsoft/dotnet
Tsvetik
20.03.2018 21:20А будет ли у ботов non-volatile memory, состояние которой сохраняется между играми?
Sliver
21.03.2018 09:37Отличная новость что песочница — бессрочная!
Для меня каждый раз камнем преткноверия является debug api, в частности, крайне необходима возможность порисовать на экране эмулятора.
Будет ли поддержка этого в будущих соревнованиях?sat2707 Автор
22.03.2018 17:55Возможность налепить текстовый бабл есть уже сейчас, над граф-примитивами работаем. Если успеем, то оно может появиться и в текущем соревновании
erwins22
21.03.2018 12:49Еще введите отдельный рейтинг для тех, кто использует «обучения с подкреплением».
doktr
21.03.2018 13:37Неплохо было бы добавить Eigen для C++.
sat2707 Автор
22.03.2018 17:57Если успеем. Поможете, если пульнете сюда github.com/MailRuChamps/miniaicups/blob/master/agario/dockers/cpp/Dockerfile
BoberCoder
21.03.2018 14:46Простите за офтопик, но хотел спросить когда будет следующий highloadcup?
sat2707 Автор
22.03.2018 17:58Ориентировочно в мае, но точнее сложно сказать — там очень много писать! Подпишитесь на t.me/mrgchamps, точно не пропустите :)
BloodUnit
22.03.2018 00:07Добавьте, пожалуйста, в C# библиотеки
https://www.nuget.org/packages/System.Numerics.Vectors/
https://www.nuget.org/packages/C5/sat2707 Автор
22.03.2018 17:59Постараемся. Поможете, если пульнете сюда github.com/MailRuChamps/miniaicups/blob/master/agario/dockers/c_sharp/Dockerfile
ololome
22.03.2018 17:59Кхм, есть шанс, что можно будет учавствовать, написав стратегию на, кхе-кхе, Swift? :)
MrKusya
22.03.2018 17:59Было бы круто Lua добавить, ибо для игровых скриптов я ничего лучше придумать не могу, да и вообще приятный язык :?
sat2707 Автор
22.03.2018 18:03В ответ на предыдущие каменты — можно посмотреть на докерфайлы здесь github.com/MailRuChamps/miniaicups/tree/master/agario/dockers и сделать по аналогии пул-реквест, тогда добавление любимого языка пойдет гораздо быстрее :)
roryorangepants
Добавьте Tensorflow + Keras, а также xgboost + LightGBM для упоротых любителей ML.
sat2707 Автор
Записал :)
erwins22
тогда уж и котика для коллекции.
Ну а тензорфлоу это должно быть по стандарту.
erwins22
catboost
tech.yandex.com/catboost/doc/dg/concepts/python-quickstart-docpage
kuzmalex
У питона удобные и эффективные библиотеки для решения небольших вычислительных задач. Имхо, возможность их использования ставит в очень неравные условия питон и другие языки, для которых подобных инструментов нет.
sat2707 Автор
Честно говоря, первый раз слышу такое мнение. Обычно, наоборот, именно от питонистов в raic и miniaicup слышно что-то вроде «эх, на питоне бы, ну да скорости не хватит, пойду на java/c/XXX»
roryorangepants
А вы PyPy используйте, и тогда ни на что, кроме C/C++, не будет смысла переходить ради перфоманса
sat2707 Автор
Записал. Нормальный такой списочек уже накопился…
kuzmalex
В raic нельзя было использовать сторонние библиотеки. Питон медленнее, но на java построить модель методами машинного обучения очень сложно, готовые имплементации не идут ни в какое сравнение с питоновскими.
sat2707 Автор
Ну так традиционно весь ML живет на python/R/что-там-еще, но не на джаве.
Значит, те же джависты вряд ли будут решать конкурс средствами ML, иначе они пришли бы сразу с python-ом под мышкой :)
Получается, вполне равновесная ситуация — джависты/сишники/etc решают стандартно; те же, кто хочет зарешать ML — так или иначе приносят с собой совершенно другой инструментарий.
Вот если бы были предпосылки к тому, что задача однозначно лучше решается ML-средствами, можно было бы говорить о несправедливости. Пока что в тг-чате чемпионата наоборот обсуждают, что «вряд ли ML тут затащит». Посмотрим, нам самим интересно :)
kuzmalex
Добавьте sklearn, scipy и numpy.
sat2707 Автор
Записал
doktr
А также pandas.
Inori
На какие вычислительные мощности можно рассчитывать? Максимальный объем исходников обсуждается?
sat2707 Автор
max объем исходников обсуждается, по вычислительным мощностям сообщим незадолго до старта. в целом будет что-то типа полгига рама и одно ядро. ну то есть кластер под стратегию не дадим :)
в финале возможно будет увеличение мощностей для отдельной стратегии
Inori
Для ML хорошо бы 50-100мб макс объём и модуль hdf5 вдобавок к тому, что уже выше попросили.
А во время боя в файлик можно будет что-то писать и потом считывать в последующих боях?
sat2707 Автор
Подумаем над всем изложенным. Пока что ничего из этого нет :)