Pull to refresh

Пишем своего бота для Google AI Challenge. Быстрый старт

Sport programming *
Sandbox


Совсем скоро стартует Google AI Challenge Ants. Два дня назад уже был анонс на хабре про это состязание:
http://habrahabr.ru/blogs/sport_programming/130457/
. Для тех, у кого есть желание поучаствовать или хотя бы просто узнать поподробнее, как это делается, я написал этот «Быстрый Старт».
Из статьи вы узнаете как запустить у себя на машине игру, написать своего первого бота и запустить две копии бороться друг против друга.


Я использую Linux (Debian), но на сайте также есть комплект и для Windows (в системе должен быть установлен Python).
Пример бота я приведу на языке Perl, но это никак не отменяет полезности статьи для тех, кто пишет на другом языке.
В комплекте от aichallenge есть уже готовые боты, написанные на языках: Java, PHP, C#, Python.
Более того, сейчас на сайте вы можете скачать стартовый пакет для написания своего бота на языках:
C#, C++, Common Lisp, D, Go, Java, JavaScript, Lua, OCaml, Pascal, Perl, PHP, Python, Ruby, Scala.
В скором времени будут добавлены и эти языки:
C, Clojure, CoffeeScript, Erlang, Groovy, Haskell, Visual Basic.

И да. Вы можете одновременно запускать сражение ботов, написанных на разных языках программирования.

Напутствие

Даже если у вас мало опыта в программировании и вы считаете, что вам ничего не светит, все равно рекомендую попробовать свои силы хотя бы на локальной машине. Как минимум, вы увидите образец хорошего стиля программирования и получите такой полезный навык программиста, как работа с чужим кодом.
И кстати, гугл обещает какие-то специальные призы студентам-первокурсникам.

Ну что ж, приступим.

Что нужно для старта?



В первую очередь, вот ссылка на официальный сайт, где есть вся полезная информация: http://beta.aichallenge.org/

Для написания своего бота понадобится стартовый пакет. На странице
http://beta.aichallenge.org/starter_packages.php выбираете свой язык программирования и скачиваете архив. Я выбрал Perl:
$ wget http://beta.aichallenge.org/starter_packages/perl_starter_package.zip


Распаковываем, например, в каталог MyBot:
$ unzip -d MyBot perl_starter_package.zip
Archive:  perl_starter_package.zip
  inflating: MyBot/Ants.pm
  inflating: MyBot/MyBot.pl
  inflating: MyBot/MyBot.pm
  inflating: MyBot/Position.pm
  inflating: MyBot/README.md


Это простая, но уже рабочая версия бота! Можно ее запускать в действие. Но сначала расскажу что для чего нужно.
Битва происходит на прямоугольном участке. На участке есть земля, вода, еда, муравейники и, собственно, главные действующие лица — муравьи.
Игра пошаговая.
Ваш бот — это программа, которая в бесконечном цикле (один цикл — один шаг) получает состояние игрового поля и возвращает новое положение для своих муравьев.
Ваш бот — это коллективный разум всех ваших муравьев, он знает все, что знают ваши муравьи. На каждом цикле бот для каждого вашего муравья должен определить следующий шаг, куда пойдет муравей: север, юг, восток, запад или останется на месте. Все. В этом заключается вся суть игры.

Теперь обратимся к реализации. Реализация бота находится в файле MyBot.pm.
Файлы Ants.pm и Position.pm — необходимые файлы для взаимодействия с игровым миром. Файл MyBot.pl — файл для запуска бота.
Вся работа по написанию бота будет происходить в файле MyBot.pm.
И главная функция здесь — это:


sub create_orders {
    my $self = shift;

    for my $ant ($self->my_ants) {
        my @food = $self->nearby_food($ant);
        for my $f (@food) {
            my $direction = $self->direction($ant, $f);
            next unless $self->passable(
                Position->from($ant)->move($direction)
            );
            $self->issue_order( $ant, $direction );
            last;
        }
    }
}

Это именно та функция, которая вызывается на каждом шаге.
В ней для каждого муравья из всех ваших муравьев
   for my $ant ($self->my_ants) {

что-то делается… и в итоге дается указание системе:
      $self->issue_order( $ant, $direction );

что этот муравей пойдет в эту сторону.

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

Но прежде чем приступать, нужно разобраться где мы будем смотреть на баталии наших ботов.
На официальном сайте предлагается специальный комплект: Ants game visualizer, написанный на Python.
Версия для Linux/MacOS: http://beta.aichallenge.org/tools.tar.bz2
Версия для Windows: http://beta.aichallenge.org/tools.zip

Берем:
$ wget http://beta.aichallenge.org/tools.tar.bz2

Распаковываем:
$ tar -xjvf tools.tar.bz2


Смотрим. В корне папки есть два shell-скрипта с говорящими названиями:
play_one_game.sh
play_one_game_live.sh

Чтобы понаблюдать за процессом, нам понадобится файл play_one_game_live.sh.
Посмотрим внимательно:


#!/usr/bin/env sh
./playgame.py -So --player_seed 42 --end_wait=0.25 --verbose --log_dir game_logs --turns 1000 --map_file maps/maze/maze_9.map "$@" \
        "python sample_bots/python/HunterBot.py" \
        "python sample_bots/python/LeftyBot.py" \
        "python sample_bots/python/HunterBot.py" \
        "python sample_bots/python/LeftyBot.py" |
java -jar visualizer.jar


При запуске игры:
$ ./play_one_game_live.sh

откроется визуализатор, в котором вы увидите большое поле с 4-мя муравейниками и можете понаблюдать за битвой.
Как уже видно из кода, воевать здесь будут 4 питон-бота, идущих в комплекте с визуализатором. Помимо питон-ботов, как я уже говорил, есть боты, написанные на C#, Java и PHP.



Первый шаг сделан. Отлично! Что дальше?

А дальше мы хотим подключить своего Perl-бота к игре. Будем изменять скрипт.
Строчка «python sample_bots/python/HunterBot.py» представляет из себя команду для запуска вашего бота. Результатом работы этой команды должен стать запущенный процесс, который будет принимать входные данные и выдавать результат. Таким образом здесь может быть любая ваша программа, написанная на любом языке программирования.
В моем случае — программа которая запускает моего бота — MyBot.pl.

Создадим каталог sample_bots/perl и скопируем все нужные файлы нашего бота из стартового комплекта в этот каталог:

$ cp MyBot/*.pl MyBot/*.pm tools/sample_bots/perl/


Бот есть. Выберем карту попроще. Карты находятся в каталоге maps. Каждая карта — это текстовый файл. В первых трех строчках стоят размеры и количество игроков на карте.
Будьте внимательны, запускайте ровно столько игроков, сколько указано в карте!
Я выбрал небольшую карту с двумя игроками:
maps/example/tutorial1.map

Вношу изменения в файл запуска play_one_game_live.sh:

#!/usr/bin/env sh
./playgame.py -So --player_seed 42 --end_wait=0.25 --verbose --log_dir game_logs --turns 1000 --map_file maps/example/tutorial1.map "$@" \
        "python sample_bots/python/HunterBot.py" \
        "perl sample_bots/perl/MyBot.pl" |
java -jar visualizer.jar


Все готово. Можем запускать и наблюдать за игрой нашего бота.


Пишем бота, который ходит случайным образом



Приступим к реализации задачи. Открываем файл MyBot.pm и удаляем все лишнее из функции sub create_orders. Отправная точка будет такая:

sub create_orders {
    my $self = shift;
    for my $ant ($self->my_ants) {
         $self->issue_order( $ant, $direction );
    }
}


Она пока не рабочая, т.к. у нас не определено $direction. Если посмотреть код функции issue_order (она находится в файле Ants.pm), то мы узнаем что она принимает в качестве второго аргументы букву: N, S, W или E (север, юг, запад или восток).

Создадим массив из букв, и для каждого муравья возьмем произвольный элемент этого массива. Таким образом каждый муравей на каждом шаге пойдет в неизвестном никому направлении.

Язык perl дает соблазн написать все это в пару строчек, но т.к. статья рассчитана на разный тип и уровень программистов, то распишу это так:

sub create_orders {
    my $self = shift;
    my @directions = qw(N S W E);
    for my $ant ($self->my_ants) {
        my $index = int (rand (4));
        $self->issue_order( $ant, $directions[$index] );
    }
}


Сохраняемся, выбираем себе противника, запускаем и наблюдаем как наших слепых котят пожирают злобные безжалостные муравьи соперника.



Ну что ж. Бот готов, хоть и глупый, но зато свой. Дело за малым: добавить боту интеллекта, научить его искать пищу, воевать, и можно отправлять его за победой. Тут наши пути расходятся.
Функции для поиска еды и соперников оставляю на самостоятельное изучение. Смотрите файл Ants.pm.

И в заключении хочется сказать пару слов про регистрацию.
Правильная ссылка на регистрацию вот: beta.aichallenge.org/submit.php
На сайте в некоторых местах дана неправильная ссылка (видимо на прошлый чемпионат), что меня спугнуло вначале и я чуть было не бросил эту затею.
После регистрации можно загрузить исходный стартовый пакет, как есть, в архиве, для того чтобы ваше имя как можно раньше появилось в рейтингах.

До встречи на поле боя!
Tags:
Hubs:
Total votes 72: ↑66 and ↓6 +60
Views 5.1K
Comments Comments 49