Практика: AI Contest



Введение

В данной лабораторной предлагается попрактиковаться в написании искусственного интеллекта (AI = Artificial Intelligence).

Ваша программа (стратегия) будет управлять танком, движущемся на плоском поле. На поле одновременно находятся танки двух противников, танки могут двигаться в произвольном направлении с постоянной скоростью 5 пикселей за ход (ускорения нет). Стрелять также можно в произвольном направлении, независимо от направления движения. Скорость снаряда также является константой (20 пикселей за ход) и не зависит от движения танка. Танки представляют собой круги радиуса 20, снаряды - круги радиуса 2. Поле битвы имеет форму прямоугольника 800x600. Также, начальное здоровье танка составляет 100 единиц, при попадании снимается 10 единиц. На поле также раз 500 ходов появляется бонус - круг радиуса 5. Бонус восстанавливает 20 единиц здоровья (но больше 100 все равно не будет).

Пример стратегии - bot0

Рассмотрим следующую стратегию:

def move(me, enemies, bullets, bonuses, m):
    if me['pos'][1] < 500:
        m.down()

    m.shot(400, 300)

Эта стратегия едет вниз, пока не достигнет координаты 500 по оси y, и все время стреляет в сторону центра экрана (координаты (400, 300)). Итак видно, что все что нужно - это написать функцию move, которая решает, что делать танку в данный момент. Вам передается следующая информация:

me - Ваш танк.
enemies - танки соперников (там будет пока только один элемент)
bullets - пули
bonuses - бонусы

Каждый танк описывается словарем со следующими ключами:

t['health'] - здоровье
t['timeout'] - оставшееся время (количество ходов) на перезарядку
t['pos'][0] - координата центра по оси x
t['pos'][1] - координата центра по оси y

Каждая пуля описывается словарем со следующими ключами:

t['pos'][0] - координата центра по оси x
t['pos'][1] - координата центра по оси y
t['dir'][0] - направление по оси x
t['dir'][1] - направление по оси y
(дляна вектора dir равна 1)

Каждый бонус описывается словарем со следующими ключами:

t['pos'][0] - координата центра по оси x
t['pos'][1] - координата центра по оси y

Параметр m - это описание Вашего хода, т.е. что сделает танк в данный момент. Для принятия решения о том что делать, нужно использовать следующие методы:

m.up() - вверх
m.left() - влево
m.down() - вниз
m.right() - вправо
m.dir(x, y) - задать вектор скорости танка. Абсолютное значение скорости - либо 0, либо константа (5 пикселей за ход). Поэтому длина указанного вектора будет приведена к заданной. Т.е., всеравно, указать m.dir(3, -4) или m.dir(6, -8), скорость будет (3, -4). Можно сказать, что .dir() задает не скорость а направление движения танка (dir = direction).
m.shot(x, y) - выстрелить в направлении к точке (x, y)

За один вызов вашей функции move вы делаете только один ход, поэтому не имеет смысла звать несколько функций движения. Также, если идет перезарядка орудия, выстрел не произойдет.

Вот пример, с использованием m.dir(x, y):

def move(me, enemies, bullets, bonuses, m):
    m.dir(enemies[0]['pos'][0] - me['pos'][0], enemies[0]['pos'][1] - me['pos'][1])

Получили стратегию, которая едет в сторону врага.

Если вам нужно хранить информацию между ходами, храните ее в глобальной переменной, например так:

n = 0

def move(me, enemies, bullets, bonuses, m):
    global n

    n += 1

    if (n // 100) % 2:
        m.left()
    else:
        m.right()

    m.shot(400, 300)
  • Получили бота, который в течении первых ста ходов пытается ехать вправо (выехать за границы поля невозможно), в течении следующих ста ходов - влево, потом опять вправо и так далее.

Локальный запуск

Бои можно запускать локально, т.е. у себя на компьютере. Для этого нужно скачать следующие файлы:

  1. game.py
  2. move.py
  3. battlelib.py
  4. vis.py

Стратегии нужно создавать в тойже папке, куда сохранили эти файлы. Допустим у вас есть две стратегии в файлах bot1.py и bot2.py. Запустить бой можно так (попросите преподавателя объяснить (или напомнить), как запускать программы из терминала):

./battlelib.py bot1.py bot2.py
./vis.py out.json

При этом, первая команда непосредственно прогоняет бой. Результатом являются полученные ботами очки и файл out.json с записью боя. Вторая команда проигрывает бой визуально.

Можно запустить бой стратегии самой с собой:

./battlelib.py bot2.py bot2.py
./vis.py out.json

Сайт соревнования [читать внимательно!]

Итак, мы научились запускать бои локально. Но цель - участие в соревновании, поэтому нужно научиться заливать свою стратегию на сайт.

  1. Идем на ai-contest.vdi.mipt.ru

  2. Вводим свой логин и пароль (пароль можно использовать любой, но логин обязательно должен совпадать с Вашим логином на ejudge). Пользователи с левыми логинами будут удалены.

  3. Нажимаем signup (Если уже входили, то нажимаем login).

  4. Попадаем в интерфейс участника. Что тут можно делать?

    4.1. Можно загрузить файл со стратегией

    4.2. Можно запустить бой между любыми участниками (и любыми версиями их стратегий)

    4.4. Также видна таблица текущих результатов и список последнийх 100 боев (обратите внимания на выпадающий список, где можно выбрать, отображать все бои или только бои "со мной")

    4.5. Каждый бой из списка можно просмотреть.

По поводу загрузки стратегий. Запрещается использовать доступ к файлам или сети, а также иным способом пытаться нарушить работу сервера и/или получить доступ к внутренней информации. Нарушители будут забанены и получат минус баллы на зачете.

ps: Просто, отнеситесь уважительно к чужому труду. Я потратил кучу времени на этот сайт, до обеспечения хорошей безопасности руки не дошли. Может кто захочет этим заняться на плюс?

ps2: Случайные ошибки в коде, из-за которых стратегия "падает" или даже не запускается (например, ошибки в синтаксисе, деление на ноль, выход за границу массива) - это не страшно. Просто Ваша стратегия будет получать 0 очков за такие бои.

ps3: По поводу ошибок в системе можно обращаться ко мне вконтакт - vk.com/senua

Практика

Упражнение №1

Напишите бота, который ездит вверх-вниз, от одного края поля до другого и обратно. Проверьте его локально, с помощью battlelib.py и vis.py.

Загрузите его на сайт ai-contest.vdi.mipt.ru, и создайте бой для этого бота против себя самого, дождитесь пока бой появится в списке и посмотрите его.

Упражнение №2

Научите бота стрелять в сторону своего противника. Запустите бой против первой версии бота. (загружать бота на сайт необязательно)

Упражнение №3

Пусть он теперь ездит по периметру поля (и стреляеет в сторону противника). (загружать бота на сайт необязательно)

Упражнение №4

Очевидно, стрелять в сторону противника не эффективно - он обычно успевает уехать, пока снаряд долетит. Подумайте о том, как можно усовершенствовать стратегию. Напишиты бота, который побеждает все три предыдущих версии. Загрузите его на сайт.

Упражнение №5 + домашнее задание

Напишите бота, способного побеждать других участников и одержите победу в соревновании. Автоматические бои проходят постоянно, на основе их результатов складывается рейтинг участников (бои, которые создаете Вы сами в рейтинге не учитываются). Через три недели сайт будет остановлен, и последние отправленные версии лучших участников сразятся в турнире каждый-с-каждым. Призы - конечно же плюсы на зачете.