IT Notes

Игровой искусственный интеллект: Тестовая площадка

Рекомендую сначала ознакомиться с вводной частью, в которой даны базовые теоретические принципы: Игровой искусственный интеллект: Введение.

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

Исходники

В этот раз обновлений проекта будет много, поэтому я выложил его на github (страница проекта AISimulator). Вы можете просто скачать архив с исходниками или клонировать проект:

git clone https://github.com/itnotesblog/AISimulator.git

Если вы клонировали проект, то имеет смысл сделать откат на версию, о которой ниже пойдет речь:

git checkout v1.0

Учтите, что для успешной сборки проекта требуются некоторые возможности C++11, поэтому убедитесь, что ваш компилятор их поддерживает.

Реклама

Представление

В качестве представления выступает виджет AISimulatorView:

class AISimulatorView : public QWidget {
    Q_OBJECT

public:
    AISimulatorView( QWidget* parent = 0 );
    ~AISimulatorView();

protected:
    void paintEvent( QPaintEvent* );
    static void drawBlock( int xPoints, int yPoints, int sizePoints, int type, QPainter* painter );

private slots:
    void onTimeOut();

private:
    AIModel m_model;

    int m_width;
    int m_height;

    QTimer m_timer;

};

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

Реклама

Модель

Класс Модели имеет следующий интерфейс:

class AIModel {
public:
    static const int BLOCK_SIZE = 12;
    static const int HALF_BLOCK_SIZE = BLOCK_SIZE / 2;
    static int blocksToPoints( int x ) { return x * BLOCK_SIZE; }

public:
    AIModel();

    int getWidth() const;
    int getHeight() const;

    void setAI( BotAI* ai );

    void reset();
    void doStep();

    int getBlockType( int x, int y ) const;

    const std::set< std::unique_ptr< Bot > >& getBots() const;

    bool hasCollisions( const Bot& bot );

private:
    static std::unique_ptr< Bot > makeBot( int x, int y );

private:
    std::unique_ptr< BotAI > m_ai;

    Matrix m_field;

    std::set< std::unique_ptr< Bot > > m_bots;
}

Модель хранит поле игрового мира (некий лабиринт) в виде матрицы, а также набор Ботов. Под Ботами будем понимать объекты, контролируемые ИИИ. Инициализация состояния игрового мира сейчас жестко зашита в коде функции reset(). Она включает определение матрицы лабиринта и добавление пятерых Ботов в заданные позиции.

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

Боты

Класс Бота Bot предназначен для хранения состояния, которое определяется следующими параметрами:

ai-bot

  1. Уникальный идентификатор. В будущем он нам пригодится;
  2. Центральные координаты x и y. По аналогии с реализацией тетриса используется двойная система координат, основанная на блоках, состоящих из точек. Координаты Бота измеряются в точках;
  3. Размер в точках. Бот геометрически представляет из себя квадрат;
  4. Направление: вверх, вниз, влево, вправо, то есть куда Бот смотрит;
  5. Скорость в точках за шаг;
  6. Флаг перемещения: двигается или стоит на месте.

Всеми этими параметрами (кроме первого) будет управлять наш ИИИ.

Обеспечиваем гибкость выбора ИИИ

Самым интересным для нас в Модели является возможность передать объект BotAI с помощью setAI(). Такой подход представляет собой разновидность паттерна Стратегия. Похожий способ мы использовали, когда говорили о потоках Qt и алгоритмах построения фракталов.

Базовый абстрактный класс ИИИ выглядит довольно просто:

class BotAI {
public:
    virtual ~BotAI();
    virtual void doStep( const AIModel& model, Bot* bot ) = 0;
};

На каждом игровом шаге Модель вызывает функцию BotAI::doStep() для всех Ботов. Таким образом, ИИИ получает всю необходимую информацию о состоянии игрового мира, а затем изменяет состояние Бота в зависимости от результатов анализа.

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

Пробный прогон: Простейший ИИИ

В качестве нашего первого ИИИ возьмем самое простое, что можно придумать (конечно, самый простой ИИИ мог бы вообще ничего не делать, но это скучно). Пусть ИИИ двигает Бота совершенно случайным образом:

class EasyRandomAI : public BotAI {
public:
    void doStep( const AIModel& model, Bot* bot );
};

void EasyRandomAI::doStep( const AIModel&, Bot* bot ) {
    bot->startMoving();
    bot->setDirection( Bot::Direction( rand() % Bot::DIRECTION_COUNT ) );
}

Подключаем его к модели:

m_model.setAI( new EasyRandomAI );

Запускаем и наслаждаемся:

ai-simulation

Да... Не слишком эффектно. Боты ведут себя весьма уныло. Дрыгаются из стороны в сторону, и с трудом решаются куда-то идти. Но ничего, скоро мы над этим поработаем.

Заключение

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

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

Понравилась статья?
Не забудь поделиться ей с друзьями!
Реклама

Похожие публикации

Комментарии

Спасибо автору, очень доступно описано.

Что такое Искусственный «Интеллект». Тема 1.

Сороковые годы прошлого века сформировали множество задач. Термоядерный синтез, космос, код ДНК, Коллайдер и т. д. Все они успешно решены, кроме проблемы ИИ, и это странно... Успешно множатся лишь определения темы, инвестиции и соискатели. Напомню, количество формулировок задачи прямо пропорционально расстоянию до её решения... Можно также утверждать, что определённая область знаний, отвечающая за создание ИИ, значительно деградировала. Поэтому, очень вероятно, что очередной всплеск интереса к этой теме может повторить участь предыдущих. Предлагаю, провести коллективное «расследование» этой загадочной сущности. Следует отбраковать массу формулировок. Предложить не стандартные подходы в аналитике и к моделированию ИИ и, конечно, описать риски этого инструмента. Назовём это: не «там», не «те», и не «то».

Не «там». Факт первый. Тему ИИ разрабатывают представители точных наук. Разберёмся. Качество любых знаний оценивается эффективностью аналитики собственного поля. Например, качество аналитики поля точных наук более 90%. Их возможности ограничены лишь бюджетом. Качество аналитики прогнозирования метеорологии более 46%. Хромают системы счета и алгоритмическая база, поэтому она полна сюрпризов. Качество экспертной аналитики социального поля (социологии) всего 6 - 8%. Заявления Санта-Фе о 16% эффективности, это блеф, поскольку справедливо только для устойчивых систем. Нет алгоритмической базы, систем счета и т. д. но есть сплошные «сюрпризы». Факт второй. В социуме отсутствует важнейшая наука - Высокотехнологичная Социология (ВС). И так, причин кризиса ИИ много. Но главная причина - он находится не «там», а в зоне отсутствующих знаний, т. е. социальных.

Не «те». Парадокс, но кибернетики имеют к ИИ весьма условное отношение. По сути, все сформированные ими кибернетические продукты функционируют по принципу банальной комбинаторики. Конечно, только они могут научить боеголовку попадать точно в цель… А описать смыслы, сущности, творчество и т. д. как продукт человеческого интеллекта, понять их алгоритмическое выражение, это уж точно не их профиль. Это задача ВС. В самом начале, кибернетики решили, что ИИ, это их приз. Поэтому более 60 лет лицо тренда приходится сохранять фигурой речи, а инвестиции осваивать посредством формирования ложных целей.

«Не то». Количество формулировок ИИ «замылило» суть задачи. Интеллект, это лишь «мыслительное начало», т. е. нечто виртуальное. Это не позволяет конкретизировать цель поиска. Суть в следующем. Пока существует факт выживания и времени, будут существовать риски. Оценка рисков - доминанта функций человеческого (и не только) мозга. Только на первый взгляд деньги, секс, сон, пища или доминирование это просто реализация потребностей. Нет. Вначале всегда идет выбор, то есть аналитика по оценке рисков этих и других процедур. Это факт эволюции. Без этого приложения человек бы не состоялся как вид. Можно заявлять разные цели, но подсознательно эксперты всегда будут конструировать подобие человеческой аналитики. То есть аналитики оценки рисков будущего. Разрабатывать следует не абстрактную сущность ИИ, допускающую манипуляции, а Искусственную Аналитику (ИА), база которой - ВС. Что делает понятными её функции задачи, цели и риски. Зная риски - Вы знаете всё.

И так - дилемма. Точные науки доминируют в социальной среде в соотношении 90% к 6%, а Теории Пределов и Баланса нет. Кибернетики оказались в теме по ошибке (эффект «ложного следа» от А. Тьюринга), а социологии нет как науки. Пока мы имеем дело лишь с версионными знаниями. Инструменты для решения проблем ИИ лежат в зоне ВС, а её нет по определению. Качество 6% – 8% соц. аналитики это слишком мало для формирования её алгоритмической базы. Мозг, как творческое начало стремительно теряет в весе и уменьшился в среднем на 300 грамм. Почему? Отвечу. Уменьшились социальные риски. Мнения о его качественном улучшении - блеф. Только последние 30 лет компьютеризации сделали его аналитическим банкротом в соц. плане. Ситуация тупиковая для позитивного решения проблемы ИА, и именно поэтому мы приближаемся к 70- летнему юбилею этого неизвестного…

Предположим нонсенс, ИИ создан. Вопрос, кто его будет обучать (социально адаптировать)? У кибернетиков (или в социуме) что, есть алгоритмы Общей теории социального поля? Причинно - следственных связей? Соц. энтропии, соц. иммунной системы, соц. аудита и т.д., то есть инструментов ВС? Или это потом?..

Прецедент был… «ящик Пандоры» назывался. С существующим пещерным уровнем соц. аналитики (6-8%) заниматься созданием ИИ то же, что запускать атомную эл. станцию без систем стабилизации и защиты. Технологический вектор темы и роскошное финансирование опережает социальный более чем на 90%. Отсутствие возможности «стендовых испытаний» полуфабрикатов ИИ стимулирует формирование его хищной версии. Вопрос «красной кнопки» (социализации), тупиковый по определению. Поясню. У человека нет технологии понимания будущего. Его предел 6 – 8 минут, т. е. до ближайшего телефонного звонка, всё остальное это продукты синдрома амбициозности или примитивного самомнения. «Слабый ИИ, сильный ИИ и другие страшилки - это аналитическая безграмотность. Даже более примитивный инструмент позволит, например, обрушить мировую КФС, что приведет к соц. переформатированию...

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

Крячко Евгений

kem6656@mail.ru

Что такое Искусственный «Интеллект». Тема 2.

Научный мир озабочен рисками ИИ. Забавная ситуация сложилась. Нет ни четкой формулировки этого продукта, ни понимания его свойств, нет характеристик и качеств. Нет понимания конечной цели. Но есть чувство опасности. Так бывает. Натворишь чего то, а потом мучаешься смутными сомнениями, страхи гнетут всякие. Здесь следует уточнить. Чувство опасности свойственно только экспертам. Умельцам, которые участвуют в гонке за приз ИИ, которые понятия не имеют о теории Причинно-Следственных Связей, тем более о её алгоритмическом выражении, не дано сомневаться по определению. Другими словами, эксперт - это, прежде всего специалист по рискам продукта и лишь потом, по его сути. Чтобы оценить риски продукта, об архитектуре которого есть только смутное представление, надо выйти за рамки кибернетики. Вот тут следует поговорить о мозге.

С учетом деградации мозга, как по весу, так и по качеству, выделим главную проблему. Проблему восприятия. Мы легко воспринимаем и адаптируем в себе математические картины полей. На новости высоких технологий, космоса, инженерии, вооружений и т. д. мы реагируем, как правило, «Wow», это круто! Мы можем мирно сомневаться в частностях, но общая картина нам понятна. Абсолютно иначе мы реагируем на социальный вброс. Политика, Трамп, Украина, Крым, Болотная, Сирия, коррупция и т. д. Вначале у нас поднимается давление. Затем, мы начинаем доказывать свою правоту, а если это не получается мы вытаскиваем «маузер», лезем на баррикады и крушим всех и вся. И это при том, что социологию мы можем понимать на 3 -5%. Заметьте, даже против этого утверждения у Вас уже чёткий протест. Парадокс. Социальный антагонизм - это явление, не имеющее ни теории, ни алгоритма, а, следовательно, антидота.

Конечно, всё дело в мозге. Мозг легко формирует картины, где надо считать, но думать он всегда ленился. Думать и считать, это разные вещи. А поскольку в социологии нет алгоритмов и систем счёта, то мозг «глючит». Для него «стрелять» проще, чем думать. Заметьте, как легко он адаптирует социальную статистику. Это только потому, что там есть цифра. До тех пор пока социология будет версионным знанием, а не точной высокотехнологичной наукой, риск маузера будет всегда рядом. Как устранить гигантский разрыв социальных и технологических знаний (6% к 90%)? Тем самым решить проблемы рисков: «красной кнопки», сингулярности, социализации и т. д? Один из вариантов - «Церебральный Сортинг» (Сергей Савельев). У меня есть вопросы к этому инструменту, но пока это единственный выход устранить эволюционное отставание в социальном восприятии. Развить социологию. Наполнить, так называемый Искусственный Интеллект смыслами и сущностями, переформатировать его в Искусственную Аналитику, тем самым избавиться от тисков комбинаторики.

Да, пока ИИ, это совершенный калькулятор, хищная версия которого может «выстрелить» в любой момент. В основе мировой экономики стоит КФС, но сделать её лежачей для ИИ элементарно, как и многое другое. Устойчивость мировой КФС, как не парадоксально, пока обеспечивают коэффициенты соц. загрязнения. Своей токсичностью они пока «парализуют» комбинаторную «логику» ИИ. Именно поэтому интуитивные опасения экспертов обоснованы. ИИ умет считать, но думать он не умеет. Думать ИИ могут научить только социологи, т. е. дать исходные алгоритмы. Вопрос в том, что они сами это пока плохо делают. По сути этот материал не для кибернетиков. Здесь будет явное отторжение. Социологам следует вникнуть в суть проблемы, уйти от соц. штампов, матриц и мантр и начать, не ожидая «Церебрального Сортинга» решать проблему ИИ не стандартно. Другими словами сделать ИИ своим призом.

Крячко Евгений

kem6656@mail.ru

RSS RSS-рассылка

Популярное