Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Old от Июнь 27, 2013, 09:53



Название: Арена для ботов
Отправлено: Old от Июнь 27, 2013, 09:53
Если найдутся желающие поучаствовать в проекте арены - отпишитесь здесь.
Кратко идеи арены я описал в теме http://www.prog.org.ru/topic_25120_0.html

Как я уже писал, у самого ядра может быть много интересных применений, это не только игра.


Название: Re: Арена для ботов
Отправлено: m_ax от Июнь 27, 2013, 20:38
Если найдутся желающие поучаствовать в проекте арены - отпишитесь здесь.
Кратко идеи арены я описал в теме http://www.prog.org.ru/topic_25120_0.html

Как я уже писал, у самого ядра может быть много интересных применений, это не только игра.

Хотелось бы уточнить пару моментов:
1) Как я понимаю, бот на каждом шаге имеет информацию о локальном своём окружении (пусть не о всём поле, но о некоторой его окрестности в которой он непосредственно в данный момент времени находится)?
2) Состояние бота на следующей итерации зависит от того, какой из множества вариантов стратегии он выбрал?

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


Название: Re: Арена для ботов
Отправлено: Old от Июнь 27, 2013, 20:56
Я предлагаю сделать систему, на которой можно создавать разные арены со своими ботами.
Это может быть арена для моделирования предложенной задачи, может быть арена для моделирования жизни океана (планктон, рыбы, акулы), торговых роботов и т.д.
Идеи по реализации такой системы есть.

А потом на этой системе можно смоделировать арену для решения этой конкретной задачи с двигающимся по карте ботом (или даже усложнить ее).

Это тонкости конкретной реализации этой арены.
1) Как я понимаю, бот на каждом шаге имеет информацию о локальном своём окружении (пусть не о всём поле, но о некоторой его окрестности в которой он непосредственно в данный момент времени находится)?
Мне кажется, будет интересней если бот будет видеть только небольшой участок карты вокруг себя.

2) Состояние бота на следующей итерации зависит от того, какой из множества вариантов стратегии он выбрал?
Да. Бот это объект класса и он сможет сохранять любую информацию, какую посчитает нужной и соответственно использовать ее в дальнейшем для принятия решений.
 


Название: Re: Арена для ботов
Отправлено: ecspertiza от Июнь 28, 2013, 08:35
Не знаю в верную ли сторону мыслю. Хотел бы поделится мыслями по реализации арены. На мой взгляд было бы неплохо написать API в котором можно было бы проинициализировать Арену (задав размеры, количество бонусов и прочие штуки.). А так же с помощью это го самого API управлять ботом или еще чем нибудь. То есть API предоставит возможность пользователю создавать "Арену" перемещать на ней элементы, увеличивать и уменьшать вес некоторых значений. Но при этом алгоритм реализации уже будет зависеть от пользователя API, хочет видит всю карту, хочет только часть, хочет теряет вес мощности при передвижении хочет нет. Верно понимаю ? Есть ли репозитарий на гитхабе ? Времени не особо много, но вроде как идея интересная.


Название: Re: Арена для ботов
Отправлено: Old от Июнь 28, 2013, 11:17
Арены могут сильно отличаться друг от друга. Например, для одних задач нужна карта, на которой развиваются все действия, для других нет - это для торговых ботов или систем датчиков и выключателей. Поэтому, в первом случае арена должна предоставлять ботам сенсоры (для исследования карты) и рычаги для управления транспортером, а во втором данные по рынку и возможность осуществлять куплю/продажу.
Есть идея сделать библиотеку, с помощью которой пользователь сможет описывать конкретную арену, писать для нее ботов и запускать их внутри этой арены.
Само ядро не очень сложно реализовать, весь функционал будет в арене.
Ядро по сути будет хранить сам объект скриптового движка и список объектов ботов, которые будут выполняться.
Арена же будет предоставлять все возможные рычаги для бота, внутри скриптового движка.
Библиотека будет содержать абстрактные арены, которые пользователь сможет наследовать и настраивать под себя.
Визуализаторы будут тесно связаны с аренами, поэтому нужно будет написать инструментальные классы облегчающие визуализацию карт.


Название: Re: Арена для ботов
Отправлено: ViTech от Июнь 28, 2013, 23:28
Идея интересная и много наворотов уже предложено :). Мне кажется, что нужно начать с простого варианта, прототипа, и посмотреть, как это дело пойдет. Будет активно развиваться - хорошо, заглохнет - не так много времени потеряется. На основе этого варианта станет понятно, как в последствии надо будет делать "по уму". Так что сейчас надо определить простую задачу, открыть проект в каком-нибудь репозитории и писать код :).


Название: Re: Арена для ботов
Отправлено: Old от Июнь 29, 2013, 11:21
Тогда опишу свои мысли по этому хозяйству.
Хорошо бы делать систему так, что бы скриптовый движек можно было менять: Qt+js, lua, python. Но для прототипа можно остановиться на Qt+js.

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

Основные подсистемы:
Core - ядро, содержит само скриптовый движек и шедуллер для выполнения кода ботов.
Arena - предоставление и обслуживание всех вызовов бота, управление картой и т.д.
Viewer - визуализатор состояния арены.

Пространство Core.
Класс Engine - сам движек, предоставляет методы для удобной регистрации классов и функций внутри сриптового движка (Arena регистрирует нужный API).
Класс BotSheduler - шедулер ботов, позволяет добавлять/удалять/запускать/останавливать ботов.
Класс TimeLine - класс для управления временем симуляции. Позволяет задавать, от простого, один шаг в секунду до сложного, в начале симуляции время идет быстро, а после каких-то событий или шагов может замедляться и т.д. Позволит пользователю манипулировать временем, как ему захочется.

Пространство Arena.
Класс Model - модель арены (базовый класс). Основной метод - настроить скриптовый движек для работы ботов.
Класс Map - базовый класс для карт, предоставляет основной функционал для управления картой.
Класс MapModel - наследник Model, заточенный для работы с картами.

Пространство Viewer.
Класс View - базовый класс для гляделок.
Класс MapView - виджет, умеющий отображать Map. Пользователь сможет наследоваться от него для отображения своих карт.

Код
C++ (Qt)
int main(...)
{
   ba::core::engine eng;             // Создаем объект движка
 
   myMap m( "map.dat" );                  // Создаем и загружаем карту
   ba::arena::myMapModel mod( m );  // Создаем модель арены с картой
 
   ba::core::easyTimeLine tl( 1000 ); // Создаем объект времени: шаг в секунду
   eng.installModel( mod );      // Модель регистрирует в пространстве скрипта все доступные для ботов функции
   eng.setTimeLine( tl );         // Настраиваем время
   eng.loadScript( "bots.js" );  // Загружаем и выполняем файл с кодом бота
                                         // (в скрипте создается объект бота и регистрируется в шедулере ядра, через api шедулера)
 
   eng.run();                        // Запуск симуляции
}
 

Шедулер испускает сигналы, при начале выполнения тика каждого бота (может и в конце выполнения?) и после полного прохода по всем ботам. Это будет удобно для визуализатора, он сможет обновлять свое представление.


Название: Re: Арена для ботов
Отправлено: ViTech от Июнь 29, 2013, 13:36
Хорошо бы делать систему так, что бы скриптовый движек можно было менять: Qt+js, lua, python. Но для прототипа можно остановиться на Qt+js.

Основные подсистемы:
Core - ядро, содержит само скриптовый движек и шедуллер для выполнения кода ботов.
Arena - предоставление и обслуживание всех вызовов бота, управление картой и т.д.
Viewer - визуализатор состояния арены.

С такой основной системой вполне согласен. Детали смогут определиться позднее.

По начальной задаче арены для ботов у меня сложилась такая история:
Космический корабль прилетает на планету и спускает на нее исследовательского бота-разведчика (scout). Скаут должен исследовать (увидеть) всю поверхность планеты и вернуться в исходную точку, где его заберут обратно на корабль. Изначально у бота есть определенный запас энергии, который тратится на движение и починку самого себя (в ямке отвалилось колесо, сверху упал камень/дерево и т.п.). Энергия может пополняться из найденных ресурсов. Планету могут исследовать несколько враждебных друг другу ботов, победителем будет тот, который потратит на это меньше времени и вернется в исходную точку с бОльшим количеством энергии.

Теперь в деталях:
1. Карта двумерная, прямоугольная с квадратными ячейками.
2. Карта статическая и не изменяется (только исчезают ресурсы).
3. Ячейки карты могут иметь различные типы местности с разной проходимостью (на движение тратится 1, 2, 3... единиц энергии).
4. Чтобы жизнь медом не казалась, в одной ячейке может быть несколько объектов.
5. Объекты на карте: непреодолимое препятствие, ресурс с энергией, предмет наносящий урон.
6. При прохождении ячейки с объектом урона он остается, объект ресурса исчезает.
7. Бот может распознать ячейку с уроном, но изначально сила урона ему не известна (задается на карте рандомно в начале). После получения урона он может эту силу запомнить. Сила урона ограничена (10 единиц энергии).
8. Бот видит ячейку с ресурсом и уровнем его энергии сразу. Максимальный уровень энергии ресурса ограничен (10 единиц).
9. В начале бот имеет максимальный запас энергии (100, 200), который при собирании ресурсов не может быть превышен.
10. Если энергия снижается до 0, то разведчик считается потерянным (погибает).
11. За один шаг бот может сдвинуться только на одну соседнюю ячейку, по диагонали двигаться не может.
12. Сканер бота имеет ограниченную видимость (радиус 3-5 ячеек).
13. Изначально бот опускается в случайную свободную ячейку.
14. Соревнования ботов на одной карте могут проходить в несколько этапов (меняются друг с другом стартовыми позициями).

Для начала хватит :). Можно уточнить эти пункты, но особо усердствовать не стоит, чтобы не усложнять начальную задачу.

Проект можно разместить на:
1. github.com - наибольшее удобство по содержанию кода, но маловато инструментов для сопровождения проекта.
2. assembla.com - чуть меньшее удобство по содержанию кода (но есть интеграция с гитхаб), много удобных инструментов для командной работы.
3. bitbucket.org - в общем средне, но есть приватные рабочие пространства.
Высказывайтесь за/против или предлагайте свои варианты размещения проекта :).


Название: Re: Арена для ботов
Отправлено: Old от Июнь 29, 2013, 14:37
Для начала хватит :). Можно уточнить эти пункты, но особо усердствовать не стоит, чтобы не усложнять начальную задачу.
Ok. История интересная, основные условия тоже. :)
Давайте начнем проектировать движек: детально описывать сущности, их задачи и связи. Потом распределим задачи и будем кодировать.
Репозиторий я уже создал на гитхабе: https://github.com/OldMen/botarena.git
Обсуждать проект можно будет здесь.


Название: Re: Арена для ботов
Отправлено: ViTech от Июнь 30, 2013, 00:25
Добавил немного описания в readme репозитория, принимайте pull request :).

Одной этой темы для обсуждения не хватит, скоро она переплетется в разных вопросах и запутается. Лучше обсуждать и проектировать в рабочем пространстве проекта: вопросы в Issues, описание и документация в Wiki.

Надо еще продумать структуру файлов проекта. Ядро само просится в dll, в конечном итоге оно все равно там окажется, поэтому чем раньше оно там оформится - тем лучше. Тестовое приложение будет использовать ядро из dll, грузить карты и ботов, показывать это все на экране. Пока так видится :).


Название: Re: Арена для ботов
Отправлено: Old от Июнь 30, 2013, 13:36
Сформировал дерево исходников.
Систему сборки - CMake.
Директория game будет содержит исходники для реализации конкретной игры, в engine - общая библиотека.
Подсистемы: core, arena и view - оформлены разделяемыми отдельными библиотеками.


Название: Re: Арена для ботов
Отправлено: ViTech от Июнь 30, 2013, 17:10
Теперь надо реализовать абстрактные и базовые классы с заглушками из этого поста (http://www.prog.org.ru/index.php?topic=25134.msg179407#msg179407), чтобы было от чего отталкиваться.

Надо еще сразу договориться о стиле кодирования. Предлагаю за основу взять Qt Coding Style (http://qt-project.org/wiki/Qt_Coding_Style), только фигурные скобки на новую строку всегда переносить. Сам пользуюсь Uncrustify (http://uncrustify.sourceforge.net) и другим советую :). Все сущности документировать комментариями в стиле Doxygen (http://www.doxygen.org), хотя бы одним простым предложением, чтобы видеть зависимости между классами (вряд ли кто возьмется графы наследования/зависимости руками рисовать).

Думаю впоследствии смогу взять на себя карту и объекты на ней. Но заниматься этим проектом смогу по остаточному принципу (после основной работы, отдыха), в совсем свободное время, так что продвигаться это будет довольно медленно.


Название: Re: Арена для ботов
Отправлено: Old от Июнь 30, 2013, 17:21
Теперь надо реализовать абстрактные и базовые классы с заглушками из этого поста (http://www.prog.org.ru/index.php?topic=25134.msg179407#msg179407), чтобы было от чего отталкиваться.
Основные вещи я набросаю. Продумаю более детально сущности и их связи.

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

Сам пользуюсь Uncrustify (http://uncrustify.sourceforge.net) и другим советую :).
А выложите куда нибудь свой конфиг для него. :)

Все сущности документировать комментариями в стиле Doxygen (http://www.doxygen.org), хотя бы одним простым предложением, чтобы видеть зависимости между классами (вряд ли кто возьмется графы наследования/зависимости руками рисовать).
Ok

Думаю впоследствии смогу взять на себя карту и объекты на ней. Но заниматься этим проектом смогу по остаточному принципу (после основной работы, отдыха), в совсем свободное время, так что продвигаться это будет довольно медленно.
У меня возможности такие же. :)
Постараюсь что бы быстрей все "задышало", тогда может люди потянутся помочь...


Название: Re: Арена для ботов
Отправлено: ViTech от Июнь 30, 2013, 17:50
Сам пользуюсь Uncrustify (http://uncrustify.sourceforge.net) и другим советую :).
У меня свой стиль, сформированный еще при царе Горохи, поменять все равно не получиться. :)

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


Название: Re: Арена для ботов
Отправлено: Old от Июнь 30, 2013, 17:57
В том и прелесть форматировщика, что писать можно в своем стиле, а парой кнопок отформатировать в другой. Свой стиль остается при себе, а разные проекты ведутся в своих настройках. По крайней мере голова не болит о всяких пробелах между скобками и разными уровнями отступов :D.
Я сначала подумал, что вы ссылку на какой-то стандарт кодирования выложили.
Посмотрел их сайт, поставил себе, теперь бы на ваш конфик взглянуть. :)


Название: Re: Арена для ботов
Отправлено: Old от Июль 09, 2013, 18:02
Набросал основной функционал ядра. Времени уделять много не получается, но по чуть-чуть делаю.

Как это видит пользователь библиотеки:
Код
C++ (Qt)
int main( int argc, char *argv[] )
{
       QApplication app( argc, argv );
 
       core::ScriptEngine eng;    // Скриптовый движек
 
       core::BotScheduler sh;    // Шедулер ботов
       qDebug() << "Install botscheduler api to scriptengine.";
       sh.installTo( eng );    // Инсталлирует в скриптовое пространство свой api (appendBot/removeBot)
 
       arena::Model mod;    // Арена
       qDebug() << "Install model api to scriptengine.";
       mod.installTo( eng );    // Инсталлирует в скриптовое пространство свой api (пока арену не делал)
 
       // Загружаем файл с ботом и выполняем его в скриптовом пространстве
       // Объекты ботов добавляют себя в шедулер через его api
       qDebug() << "Load bot-code.";
       if( !eng.executeFile( "bot.js" ) )
       {
               qWarning() << "Error execution script bot.js.";
               return 1;
       }
 
       qDebug() << "Running...";
       core::LineTimeGenerator gen( 500 );    // Создаем линейгый генератор времени с тиком каждые 0,5 сек
       QObject::connect( &gen, SIGNAL( cycle() ), &sh, SLOT( process() ) );    // Связываем генератор и шедулер
       gen.start();    // Запускаем генератор
 
       return app.exec();
}
 

Шаблон бота:
Код
Java
bot = function( _id )
{
       var id = _id;
       this.tick = function()
       {
               print( "tick" + id );
       }
}
 
var o1 = new bot( 10 );    //Создаем два объекта бота
var o2 = new bot( 20 );
 
BotScheduler.appendBot( "bot1", o1.tick )    // Регистрируем их в шедулере, указывая уникальное имя и точку входа.
BotScheduler.appendBot( "bot2", o2.tick )
 

Сейчас займусь ареной для ботов на карте и основой для карт.