Шесть лет подряд мы (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-образы для ЯП).
Полные правила на старте чемпионата откроются в этом репозитории.


Изменения с прошлого чемпионата


Конечно же, мы не сидим на месте. С прошлого чемпионата:


  1. Был разработан правильный localrunner (написали на C).
  2. Симуляция тоже на C, обсчет стал быстрее по сравнению с python-ом, который был в первом конкурсе
  3. Были добавлены debug-виджеты для дебага игр на сайте (начнется конкурс — увидите)
  4. Переработана схема запуска решений, теперь отдельное решение просто общается с STDIN и STDOUT, без необходимости держать локальный tcp-сервер. Мы делаем это за вас.
  5. Добавились всякие мелочи вроде оценок рейтингом и комментариями отдельных игр, правильного шаринга игр и рейтинга в соцсети… кнопочки, ссылочки, короче, вот этот вот весь вебчик
  6. Новые языки стало добавлять значительно проще, как для участников, так и для нас

Дизайн, меж тем, тот же. Мы решили окончательно притвориться, что мы так видим… :)


Погнали?


Регистрироваться можно уже сейчас на сайте aicups.ru, официальная группа чемпионата — @aicups, официальный канал для тех, кто не хочет в группу — @mrgchamps. Ждем вас, будет весело!

Комментарии (60)


  1. roryorangepants
    19.03.2018 19:55

    Добавьте Tensorflow + Keras, а также xgboost + LightGBM для упоротых любителей ML.


    1. sat2707 Автор
      19.03.2018 20:08

      Записал :)


      1. erwins22
        20.03.2018 07:54

        тогда уж и котика для коллекции.
        Ну а тензорфлоу это должно быть по стандарту.



      1. kuzmalex
        20.03.2018 10:01

        У питона удобные и эффективные библиотеки для решения небольших вычислительных задач. Имхо, возможность их использования ставит в очень неравные условия питон и другие языки, для которых подобных инструментов нет.


        1. sat2707 Автор
          20.03.2018 10:08

          Честно говоря, первый раз слышу такое мнение. Обычно, наоборот, именно от питонистов в raic и miniaicup слышно что-то вроде «эх, на питоне бы, ну да скорости не хватит, пойду на java/c/XXX»


          1. roryorangepants
            20.03.2018 10:35

            А вы PyPy используйте, и тогда ни на что, кроме C/C++, не будет смысла переходить ради перфоманса


            1. sat2707 Автор
              20.03.2018 11:14

              Записал. Нормальный такой списочек уже накопился…


          1. kuzmalex
            20.03.2018 10:48

            В raic нельзя было использовать сторонние библиотеки. Питон медленнее, но на java построить модель методами машинного обучения очень сложно, готовые имплементации не идут ни в какое сравнение с питоновскими.


            1. sat2707 Автор
              20.03.2018 11:12

              Ну так традиционно весь ML живет на python/R/что-там-еще, но не на джаве.
              Значит, те же джависты вряд ли будут решать конкурс средствами ML, иначе они пришли бы сразу с python-ом под мышкой :)
              Получается, вполне равновесная ситуация — джависты/сишники/etc решают стандартно; те же, кто хочет зарешать ML — так или иначе приносят с собой совершенно другой инструментарий.
              Вот если бы были предпосылки к тому, что задача однозначно лучше решается ML-средствами, можно было бы говорить о несправедливости. Пока что в тг-чате чемпионата наоборот обсуждают, что «вряд ли ML тут затащит». Посмотрим, нам самим интересно :)


              1. kuzmalex
                20.03.2018 11:15

                Добавьте sklearn, scipy и numpy.


                1. sat2707 Автор
                  20.03.2018 11:51

                  Записал


                  1. doktr
                    21.03.2018 01:59

                    А также pandas.


      1. Inori
        20.03.2018 14:05

        На какие вычислительные мощности можно рассчитывать? Максимальный объем исходников обсуждается?


        1. sat2707 Автор
          20.03.2018 16:08

          max объем исходников обсуждается, по вычислительным мощностям сообщим незадолго до старта. в целом будет что-то типа полгига рама и одно ядро. ну то есть кластер под стратегию не дадим :)
          в финале возможно будет увеличение мощностей для отдельной стратегии


          1. Inori
            20.03.2018 17:02

            Для ML хорошо бы 50-100мб макс объём и модуль hdf5 вдобавок к тому, что уже выше попросили.
            А во время боя в файлик можно будет что-то писать и потом считывать в последующих боях?


            1. sat2707 Автор
              20.03.2018 17:04
              +1

              Подумаем над всем изложенным. Пока что ничего из этого нет :)


  1. DanilinS
    19.03.2018 20:58

    Традиционно добавьте Free Pascal


    1. sat2707 Автор
      19.03.2018 22:26

      Принял :)


  1. dolphin278
    19.03.2018 21:05

    Версию Node можно более новую? Сейчас уже даже LTS — 8-я (http://nodejs.org), да и если вы докером собираете, то вроде ничего сильно менять не придется, так что если 9-ка будет – совсем хорошо.


    1. sat2707 Автор
      19.03.2018 22:26

      Попробоваем


    1. sat2707 Автор
      20.03.2018 11:49

      1. dolphin278
        21.03.2018 20:11

        Супер, спасибо!


  1. Adler3D
    20.03.2018 01:55

    комментарий про бюджет(по курсу 5$/месяц_процессорного_времени) который будет потрачен на запуск стратегий в финале


  1. IL_Agent
    20.03.2018 10:59

    думаю, при наличии поддержки джавы добавить Котлин будет несложно :)


    1. sat2707 Автор
      20.03.2018 11:09

      Принято


      1. solver
        20.03.2018 14:33

        Да и Scala думаю будет так же несложно добавить)


        1. sat2707 Автор
          20.03.2018 16:18

          Понято :)


  1. Alexus819
    20.03.2018 11:05

    пусть победитель сыграет с живым человеком в конце (вне конкурса)


    1. QDeathNick
      20.03.2018 16:19

      Да, было бы круто дать возможность с ним поиграть всем желающим.


  1. izhmyh
    20.03.2018 16:08

    Добавьте PyTorch


  1. holywalley
    20.03.2018 16:08

    А можно Ruby? :)


    1. syntt
      22.03.2018 17:53

      +1


    1. sat2707 Автор
      22.03.2018 17:53

      Можно. Поможете, если сделаете pull сюда аналогично прочим докерфайлам github.com/MailRuChamps/miniaicups/tree/master/agario/dockers
      Питон уже сейчас активно наполняется, хаскель вот прилетел…


  1. varus
    20.03.2018 16:08

    А почему C# с Mono, а не с .NET Core? Может, добавите .NET Core 2.0?


    1. OREZ
      20.03.2018 23:48

      Тоже удивлен, почему моно в 2к18, давно уже кора стабильная.


      1. sat2707 Автор
        20.03.2018 23:50

        Честно говоря, мы с шарпами не очень дружим. Если поможете с докерфайлом, то не вижу препятствий


        1. varus
          21.03.2018 12:48

          На докерхабе у майкрософт есть готовые докерфайлы для разных версий кора: hub.docker.com/r/microsoft/dotnet


  1. sat2707 Автор
    20.03.2018 16:19

    Сразу на три предыдущих комментария — да, постараемся сделать


  1. Tsvetik
    20.03.2018 17:58

    Ни разу не участвовал в подобном. На VS C# Exress 2013 получится что-то сделать или нужны какие-то танцы с бубном? .Net v2.0 выставить или еще что-то?


    1. sat2707 Автор
      20.03.2018 23:49

      По идее, если оно компилится под убунту, то сможет работать


  1. Tsvetik
    20.03.2018 21:20

    А будет ли у ботов non-volatile memory, состояние которой сохраняется между играми?


  1. wide
    21.03.2018 02:23

    Буду рад увидеть Rust в списке поддерживаемых :)


  1. Sliver
    21.03.2018 09:37

    Отличная новость что песочница — бессрочная!


    Для меня каждый раз камнем преткноверия является debug api, в частности, крайне необходима возможность порисовать на экране эмулятора.
    Будет ли поддержка этого в будущих соревнованиях?


    1. sat2707 Автор
      22.03.2018 17:55

      Возможность налепить текстовый бабл есть уже сейчас, над граф-примитивами работаем. Если успеем, то оно может появиться и в текущем соревновании


  1. samsdemon
    21.03.2018 11:42

    TOP участников из песочницы проходят в финал

    а это сколько?


    1. sat2707 Автор
      22.03.2018 17:57

      видимо 50-100, пока мы и сами точно не можем сказать.


  1. erwins22
    21.03.2018 12:49

    Еще введите отдельный рейтинг для тех, кто использует «обучения с подкреплением».


  1. doktr
    21.03.2018 13:37

    Неплохо было бы добавить Eigen для C++.


    1. sat2707 Автор
      22.03.2018 17:57

      Если успеем. Поможете, если пульнете сюда github.com/MailRuChamps/miniaicups/blob/master/agario/dockers/cpp/Dockerfile


  1. BoberCoder
    21.03.2018 14:46

    Простите за офтопик, но хотел спросить когда будет следующий highloadcup?


    1. sat2707 Автор
      22.03.2018 17:58

      Ориентировочно в мае, но точнее сложно сказать — там очень много писать! Подпишитесь на t.me/mrgchamps, точно не пропустите :)


  1. BloodUnit
    22.03.2018 00:07

    Добавьте, пожалуйста, в C# библиотеки
    https://www.nuget.org/packages/System.Numerics.Vectors/
    https://www.nuget.org/packages/C5/


    1. sat2707 Автор
      22.03.2018 17:59

      Постараемся. Поможете, если пульнете сюда github.com/MailRuChamps/miniaicups/blob/master/agario/dockers/c_sharp/Dockerfile


  1. tongohiti
    22.03.2018 17:59

    А сертификаты для https всё ещё не подвезли? :)


    1. sat2707 Автор
      22.03.2018 18:02

      ?\_(?)_/?
      Почему-то самые простые вещи всегда делаются дольше всего


  1. ololome
    22.03.2018 17:59

    Кхм, есть шанс, что можно будет учавствовать, написав стратегию на, кхе-кхе, Swift? :)


  1. MrKusya
    22.03.2018 17:59

    Было бы круто Lua добавить, ибо для игровых скриптов я ничего лучше придумать не могу, да и вообще приятный язык :?


  1. Fe11
    22.03.2018 17:59

    Scala


  1. sat2707 Автор
    22.03.2018 18:03

    В ответ на предыдущие каменты — можно посмотреть на докерфайлы здесь github.com/MailRuChamps/miniaicups/tree/master/agario/dockers и сделать по аналогии пул-реквест, тогда добавление любимого языка пойдет гораздо быстрее :)