Pull to refresh

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

Reading time6 min
Views5.3K


Совсем скоро стартует 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:
+60
Comments49

Articles

Change theme settings