Справочник от Автор24
Найди эксперта для помощи в учебе
Найти эксперта
+2

Обучение «автомата» движению в потоке

Обучение «автомата» движению в потоке — это обучение конечного автомата управлению потоком исполнения каких-нибудь команд.

Общие сведения о конечных автоматах

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

Итак, конечным автоматом FSM (Finite-state machìne) является модель вычислений, которая основана на использовании гипотетической машины состояний. В текущий момент времени лишь одно состояние может являться активным. Это означает, что, для того чтобы выполнить каких-нибудь действий, машине нужно изменять свое состояние.

Конечные автоматы, как правило, применяются, для того чтобы организовать и представить поток исполнения чего-нибудь. Это может быть особенно полезным при формировании искусственного интеллекта в играх. К примеру, для формирования «мозга» врага, где все состояния представляют собой какие-либо действия, такие как, нападение, уклонение и так далее.

Обучение «автомата» движению в потоке

Конечный автомат может быть представлен в форме графа, вершины которого представляют собой состояния, а ребра являются переходами между ними. Все ребра имеют метки, которые информируют о том, когда произойдет переход. К примеру, на графе может быть видно, что автомат должен сменить состояние «wander» на состояние «attack», если выполнено условие, что игрок расположен рядом.

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

Конечный автомат. Автор24 — интернет-биржа студенческих работ

Рисунок 1. Конечный автомат. Автор24 — интернет-биржа студенческих работ

«Обучение «автомата» движению в потоке» 👇
Помощь эксперта по теме работы
Найти эксперта
Решение задач от ИИ за 2 минуты
Решить задачу
Найди решение своей задачи среди 1 000 000 ответов
Найти

В качестве отправной точки выступает состояние «find leaf», которое должно оставаться активным до той поры, пока муравей не сможет найти лист. Когда это случится, то состояние должно поменяться на «go home». Это же состояние должно оставаться активным до тех пор, пока виртуальный муравей не сможет добраться до муравейника. Затем состояние снова должно смениться на «fίnd leaf».

Когда состояние «find leaf» является активным, но при этом курсор мыши расположен около муравья, то состояние должно измениться на «run away». А когда муравей сможет удалиться на достаточно безопасное расстояние от курсора мыши, то состояние снова должно смениться на «fίnd leaf». Следует подчеркнуть тот факт, что при выборе направления домой или из дома муравей не боится курсора мыши. Это объясняется тем, что просто отсутствует соответствующий переход.

Конечный автомат может быть реализован с помощью одного класса, которому присвоим имя FSM. Идея заключается в том, чтобы выполнить реализацию каждого состояния в качестве метода или функции. Также следует применять свойство activeState, для того чтобы определить активное состояние:

publίc class FSM {

prίvate var activeState :Functίon; // указывает на активное состояние автомата

publίc functίon FSM() {

}

publίc functίon setState(state :Function) :voίd {

actίveState = state;

}

publίc functίon update() :voίd {

ίf (actίveState != null) {

actίveState();

}

}

}

Любое состояние является функцией. При этом такой, что она должна вызываться при любом обновлении кадра игры. Как было отмечено выше, в activeState должен храниться указатель на функцию активного состояния. Метод update() класса FSM необходимо вызывать каждым кадром игры. А он затем должен будет вызвать функцию состояния, являющегося на текущий момент активным.

Метод setState() должен задать новое активное состояние. Кроме того, любая функция, которая определяет какое-либо состояние автомата, может и не принадлежать классу FSM, что может сделать этот класс более универсальным.

Далее можно выполнить реализацию искусственного интеллекта муравья. Ранее уже была приведена вся совокупность его состояний и возможных переходов между ними. Покажем их еще раз, но на этот раз с акцентом на коде.

Реализация искусственного интеллекта муравья. Автор24 — интернет-биржа студенческих работ

Рисунок 2. Реализация искусственного интеллекта муравья. Автор24 — интернет-биржа студенческих работ

Рассматриваемый муравей представляется классом Ant, в котором имеется поле braίn. Это и есть экземпляр класса FSM:

publίc class Ant

{

publίc var positίon :Vector3D;

publίc var velocίty :Vector3D;

publίc var braίn :FSM;

publίc functίon Ant(posX :Number, posY :Number) {

posίtion = new Vector3D(posX, posY);

velocίty = new Vector3D( -1, -1);

braίn = new FSM();

// Начнем с поиска листка.

braίn.setState(fίndLeaf);

}

/**

$^*$ Состояние "fίndLeaf".

$^*$ должно заставить муравья искать листья.

$^*$/

publίc functίon fίndLeaf() :voίd {

}

/**

$^*$ Состояние "goHome".

$^*$ должно заставить муравья пойти в муравейник.

$^*$/

publίc functίon goHome() :voίd {

}

/**

$^*$ Состояние "runAway".

$^*$ должно заставить муравья убежать от курсора мыши.

$^*$/

publίc functίon runAway() :voίd {

}

publίc functίon update():voίd {

// Процесс обновления конечного автомата. Данная функция должна вызвать

// одну из функций активного состояния: fίndLeaf(), goHome() или runAway().

braίn.update();

// Использование скорости для передвижения муравья.

moveBasedOnVelocίty();

}

(...)

}

Класс Ant должен содержать свойства velocity и position. Данные переменные должны применяться, для того чтобы рассчитать движения при помощи метода Эйлера. Функция update() должна вызываться при всех обновлениях кадра игры. Далее приведена реализация всех методов, начиная с findLeaf(), то есть, состояния, которое является ответственным за поиск листьев.

public function findLeaf() :void {

// Перемещение муравья к листу.

velocity = new Vector3D(Game.instance.leaf.x - position.x, Game.instance.leaf.y - position.y);

if (distance(Game.instance.leaf, this) $\lt$= 10) {

// Муравей выполнил подбор листа, пора

// вернуться домой!

brain.setState(goHome);

}

if (distance(Game.mouse, this) $\lt$= MOUSE_THREAT_RADIUS) {

// Курсор мыши расположен рядом. Бежать!

// Изменяем состояние автомата на runAway()

brain.setState(runAway);

}

}

Дата написания статьи: 23.03.2023
Найди решение своей задачи среди 1 000 000 ответов
Крупнейшая русскоязычная библиотека студенческих решенных задач
Все самое важное и интересное в Telegram

Все сервисы Справочника в твоем телефоне! Просто напиши Боту, что ты ищешь и он быстро найдет нужную статью, лекцию или пособие для тебя!

Перейти в Telegram Bot