Архитектуры принятия решений в игровой искусственной инженерии: Деревья поведения (BT) и Конечные автоматы (FSM)
Исследование

Архитектуры принятия решений в игровой искусственной инженерии: Деревья поведения (BT) и Конечные автоматы (FSM)

АвторGameDev Base
Дата20 октября 2026 г.
25 мин чтения

Всесторонний анализ деревьев поведения (Behavior Trees) и конечных автоматов (FSM)

Механизмы принятия решений, лежащие в основе автономных агентов, сложных персонажей видеоигр и промышленных робототехнических систем, представляют собой одну из наиболее критических и обсуждаемых областей современной программной инженерии и исследований в области искусственного интеллекта. То, как агент будет реагировать на постоянно меняющиеся стимулы окружающей среды, какие из бесчисленных целей он будет приоритизировать и в каком порядке выполнять конкретные задачи, полностью зависит от надежности и гибкости его базовой архитектуры принятия решений. Исторический процесс развития показывает, что в течение многих лет в этой области доминировали конечные автоматы (Finite State Machines — FSM). Однако возрастающая сложность цифровых миров и физических робототехнических задач подтолкнула разработчиков и исследователей к поиску более масштабируемых, реактивных и модульных структур, что привело к появлению революционных иерархических конструкций, таких как деревья поведения (Behavior Trees — BT).

В данном отчете эти две основные архитектуры, которые сегодня считаются отраслевым стандартом для принятия решений и моделирования поведения в автономных системах, глубоко рассматриваются в контексте всех технических деталей, математических основ, исторической эволюции, сценариев промышленного применения и их структурных преимуществ и недостатков по отношению друг к другу. Кроме того, в качестве неотъемлемой части данного анализа рассматриваются новейшие гибридные подходы в современных игровых движках (например, в Unreal Engine) и решения нового поколения, такие как деревья состояний (State Trees).

Конечные автоматы (FSM): Теоретическая база и математические основы

Конечный автомат (FSM) — это абстрактная математическая модель машины, в которой система в каждый конкретный момент времени может находиться только в одном из заранее определенных состояний (state) и совершает переходы (transition) между ними в ответ на определенные внешние воздействия или внутренние события (inputs/events). Будучи одним из фундаментальных строительных блоков теории вычислений, эта модель широко применяется в информатике — от проектирования алгоритмов до создания цифровых электронных схем.

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

Логическое представление и динамика переходов состояний

По своей сути конечные автоматы визуализируются и выражаются в виде ориентированного графа (directed graph) или диаграммы состояний (state diagram). В этом ориентированном графе узлы (nodes) представляют внутренние состояния абстрактной машины, а соединяющие их направленные стрелки (edges) — переходы между состояниями. Текущее состояние системы в любой момент времени «t» всегда вычисляется как детерминированная функция от предыдущего состояния и текущих входящих в систему в данный момент входных данных.

В математическом контексте эта функция перехода состояний выражается следующим образом:

В этой формулировке следующее состояние системы, предыдущее (текущее) состояние машины, текущее значение входных данных (input) и обозначает функцию перехода состояний (state transition function). В литературе эта зависимость часто обозначается как процесс отображения декартова произведения множества состояний (S) и множества входных данных (I) обратно на множество состояний, то есть следующим образом. В зависимости от природы производимых ими выходных данных (output) автоматы подразделяются на два основных архитектурных подкласса: в модели машины Мура функция вывода зависит исключительно от текущего состояния системы (), в то время как в модели машины Мевли функция вывода одновременно зависит как от текущего состояния, так и от мгновенного входного значения ().

В системном проектировании состояния и входные данные обычно представляются в виде бинарного (binary) алфавита или заранее определенных перечислений (enum), а функции и обычно кодируются в виде таблицы поиска (look-up table) или таблицы переходов состояний (state transition table). В программной архитектуре осуществление переходов зависит не только от наличия входных данных, но и от соблюдения дополнительных условий (guards). В типичной диаграмме состояний UML или при реализации в современных движках нотация перехода обычно выражается синтаксисом триггер[условие]/действие (trigger[guard]/effect). Здесь триггер (trigger) может представлять собой сигнал, вызов, таймер или событие изменения. Условие (guard) — это дополнительная логическая проверка, которую необходимо подтвердить для совершения перехода. Действие (effect) же представляет собой специфическую операцию, выполняемую во время перехода.

Тем не менее, сила архитектуры FSM кроется не только в переходах между состояниями, но и в действиях, которые могут выполняться при входе в определенные состояния, нахождении внутри них и выходе из них. При входе в состояние FSM (entry action), периодически во время нахождения в состоянии (during action) и при выходе из состояния (exit action) могут выполняться специальные блоки кода. Например, в радиосистеме нажатие кнопки «Вперед», когда устройство находится в состоянии «Радио», обеспечивает переход к следующей радиостанции, в то время как нажатие той же кнопки «Вперед», когда устройство находится в состоянии «CD», инициирует переход к следующему треку; таким образом, один и тот же внешний раздражитель производит совершенно разные действия в зависимости от контекстного состояния, в котором находится машина.

Место FSM в индустриальных стандартах и их практические преимущества

Конечные автоматы сохраняют статус промышленного стандарта на протяжении широкой исторической ретроспективы, простирающейся от проектирования цифровых схем до индустрии видеоигр. Их наиболее очевидными преимуществами являются чрезвычайная простота концептуального понимания, архитектурная простота и огромная скорость работы на аппаратном и программном уровнях. Визуализация того, что может делать персонаж или система, в какие состояния может переходить, с помощью диаграммы «коробок и стрелок» («box and arrow» diagram) делает FSM чрезвычайно интуитивной структурой в процессе кодирования и легкой для отладки (debugging).

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

Во-первых, файтинги (fighting games) — это одна из самых ярких областей применения архитектуры FSM. В файтинге такие состояния персонажа, как «Атака», «Прыжок», «Оглушение» (Stunned), «Приседание» или «Защита», должны быть четко отделены друг от друга логическими линиями. Например, когда персонаж получает мощный удар от противника и переходит в состояние «Оглушение», он не может совершить прыжок, даже если игрок нажмет кнопку прыжка. Если не использовать архитектуру FSM, при каждой попытке действия персонажа пришлось бы писать тянущиеся бесконечно и не поддающиеся обслуживанию вложенные условные выражения (conditional) вида «если персонаж не оглушен, и если он не в воздухе, и если он не заблокирован в анимации атаки...». FSM предотвращают эту гигантскую спагетти-путаницу в блоках кода, безупречно реализуя логику «если персонаж находится в состоянии А, он может переходить только в состояние B или C».

Во-вторых, контроллеры анимации персонажей в значительной степени базируются на FSM. В современных игровых движках — лидерах индустрии, таких как Unreal Engine, анимация персонажей управляется интерфейсами под названием «Animation Blueprints» (Анимационные чертежи), которые запускают конечный автомат в фоновом режиме. Когда и как персонаж переключается с анимации «Ожидание» (Idle) на анимацию «Ходьба» (Walk), а оттуда на анимацию «Бег» (Run) — это основная задача FSM, управляемых с помощью данного интерфейса с коробками и стрелками.

В-третьих, в аркадных системах и играх, требующих простой логики принятия решений, FSM идеально подходят для работы по принципу «KISS» (Keep It Simple, Stupid — Сделай это проще, глупышка). Во многих играх в аркадном стиле у врагов есть очень ограниченные и специфические состояния, такие как «Патрулировать», «Преследовать», «Атаковать» или «Убегать». FSM, реализованный в среде Native C++, обеспечивает уникальную производительность, работая на уровне наносекунд на современных процессорах. Используя безымянные перечисления (unnamed enums) для определения состояний, разработчики программного обеспечения могут связывать эти состояния с идентификаторами событий (event IDs) с помощью структуры «одного большого switch» (one big switch) или техник битовых масок. Аккуратная архитектура кода, привносимая этой структурой, позволяет компилировать FSM во время выполнения (hot-recompiling), а также обеспечивает безопасное и беспрерывное выполнение (execution safety) за счет возврата ненулевых идентификаторов состояний из обработчиков событий (event handlers) вместо подпрограмм вроде SetState(). Этот линейный поток выполнения предотвращает любые заикания (stutter) в игровом цикле, делая возможным достижение высокой частоты кадров (framerate).

Архитектурная точка кризиса: Проблема взрыва состояний (State Explosion)

Хотя FSM безупречны и производительны для детерминированных моделей поведения с ограниченным числом состояний, они имеют тенденцию структурно разрушаться по мере роста сложности автономной системы, количества переменных среды и поведенческого репертуара, ожидаемого от искусственного интеллекта. В литературе эта хроническая уязвимость называется «Взрывом состояний» (State Explosion).

Основное ограничение архитектуры FSM заключается в том, что машина может находиться только в одном состоянии одновременно. Если персонаж должен уметь одновременно бежать и стрелять, то в архитектуре FSM он не может находиться в состояниях «Бег» и «Стрельба» одновременно; вместо этого необходимо создать совершенно новое гибридное состояние под названием «Стрельба на бегу». Каждая новая переменная, добавляемая в систему, требует создания новых состояний в количестве, равном всем возможным комбинациям со всеми существующими состояниями. Количество состояний, которые должна представлять модель, достигает гигантских размеров, равных декартову произведению наборов переменных.

Еще более критичной проблемой является сложность переходов (transition), порождаемая растущим числом состояний. Добавление состояния в FSM означает не просто его создание; это требует поочередного кодирования по специфическим правилам того, как система будет переходить в это вновь добавленное состояние из всех остальных связанных состояний и в какие состояния можно вернуться из него. В жаргоне информатики скорость роста сложности переходов с увеличением числа состояний выражается как квадратично пропорциональная. Эта геометрическая скорость роста создает кумулятивную нагрузку на сложность, похожую на закон Меткалфа, который утверждает, что ценность телекоммуникационной сети пропорциональна квадрату числа ее пользователей в сетевой экономике.

Когда количество состояний FSM достигает примерно 10, управление им усложняется; когда количество состояний достигает 40 (например, в продвинутом ИИ босс-файта в стиле Sekiro или Dark Souls), файл кода заполняется сотнями

строк логики переходов и превращается в буквальное «спагетти-код» (Spaghettification). На этом этапе техническое обслуживание (maintenance) или отладка (debugging) кода превращаются в кошмар. Поскольку первопричиной любой возникающей логической ошибки (bug) может быть ошибочный триггер в одном из десятков различных переходов состояний, неверно выстроенная очередь приоритетов или забытая стрелка перехода.

Для смягчения этого взрыва состояний и предотвращения возникновения спагетти-кода были разработаны «Иерархические конечные автоматы» (Hierarchical Finite State Machines — HFSM). В модели HFSM состояния проектируются с возможностью вложенности друг в друга; «родительское состояние» (parent state) содержит внутри себя независимо работающие подсостояния (substates). Например, основное состояние под названием «Бой» может содержать подмашину, в которой выполняются подсостояния «Укрыться», «Прицелиться» и «Стрелять». Если игрок отступает, когда система находится в основном состоянии «Бой», один «групповой переход» (Group Transition) из основного состояния в состояние «Патрулировать» независимо от того, в каком из внутренних подсостояний находилась система, избавляет от необходимости писать код побега или отмены для каждого из внутренних подсостояний по отдельности. Благодаря точкам перехода (transition points) и приоритетам запуска событий (event triggering precedence) HFSM поднимают возможности FSM на более высокий уровень. Однако когда сложность системы превышает определенный порог (например, в сложном планировщике задач, содержащем десятки состояний и сотни переходов), даже HFSM поддаются визуальной путанице и становятся структурно хрупкими.

Деревья поведения (Behavior Trees): Эволюция, структура и логика выполнения

Барьер геометрической масштабируемости, создаваемый конечными автоматами (FSM) и иерархическими конечными автоматами (HFSM), сделал неизбежным появление новой архитектурной парадигмы в процессах принятия решений автономными персонажами и агентами. Деревья поведения (Behavior Trees — BT) представляют собой модульные иерархические структуры принятия решений, разработанные именно для преодоления этого тупика и предоставления искусственному интеллекту визуальной и четкой дорожной карты, свободной от жестких лабиринтов переходов в стиле «если это произойдет, то сделай то». 2

Исторические истоки и процесс промышленного внедрения

Хотя академические и промышленные рассказы о том, где и когда именно появились деревья поведения, имеют некоторые небольшие различия, широко распространено мнение, что эти структуры родились не в утонченных исследовательских лабораториях, а непосредственно в окопах студий разработки игр. 2 Одно из самых ранних зафиксированных применений восходит к игре SimCopter 1996 года, разработанной Maxis. Согласно заявлениям бывшего сотрудника Maxis Дона Хопкинса (Don Hopkins), для управления NPC внутри игры использовался визуальный язык под названием «SimAntics», который в файле people.df игрового кода фигурировал как «реакционные деревья» (reaction trees). Комментарии в этом файле содержат определения, напоминающие современную механику деревьев поведения, такие как «реакционное дерево может быть вызвано из другого реакционного дерева, но не может быть прервано в этот момент». 25

Однако формулировка архитектуры дерева поведения в современном смысле, ее превращение в промышленный стандарт и обретение прочной академической основы во многом произошли благодаря знаковому выступлению Дамиана Ислы (Damian Isla) на Конференции разработчиков игр (GDC) в 2005 году, где он представил революционную ИИ-архитектуру игры Halo 2 («Handling Complexity in the Halo 2 AI»). 3 Во время разработки Halo 2 команда Bungie столкнулась с двумя серьезными тупиками, порожденными FSM: потерей масштабируемости системы на фоне быстро растущего разнообразия поведения и нестабильностью, вызванной метанием ИИ между быстрыми решениями, то есть проблемой «дизеринга» (dithering). 3

Желая решить эту ментальную перегрузку (mental bandwidth), вызванную FSM, команда поместила поведение персонажей в иерархию, названную «DAG поведения» (Directed Acyclic Graphs — Направленные ациклические графы). 3 Эта система содержала около 50 различных базовых вариантов поведения.

В описанной Ислой структуре узлы в верхней части дерева отвечали за алгоритмы принятия решений, а конечные листовые узлы — за выполнение действий. Этот подход позволил ИИ не только знать, что делать, но и действовать здраво (common sense). Кроме того, персонажи имели собственные внутренние «списки целей» (target lists) и пространственную осведомленность (firing positions) для восприятия целей. 3 Эта модульная структура оказалась настолько гибкой, отказоустойчивой и читаемой, что концепция вскоре перекочевала в сферу робототехники и академию. Сегодня деревья поведения стали де-факто стандартом (de facto standard) в самых разных областях: от беспилотных летательных аппаратов до промышленных коллаборативных роботов (collaborative robots) и систем автономного вождения. 1

Структурная архитектура BT и иерархия узлов (Nodes)

Деревья поведения представляют собой иерархическую структуру данных древовидного типа, которая связывает действия и решения подобно цифровым блокам LEGO. 2 В отличие от классических деревьев решений (Decision Trees), BT не просто следуют по пути до достижения результата; они управляют логическим контролем узлов, процессами асинхронного выполнения (execution flows) и прерываниями (interrupts) с помощью регулярных сигналов (обычно называемых «тиками» / tick), отправляемых от корня (root) системы к ее листьям (leaves). 1

Самой жизненно важной и отличительной концепцией в работе этой архитектуры является то, что в результате операции «тика», поступающей к каждому узлу, он обязательно возвращает родительскому узлу (parent node) статус логического состояния (status). Эти возвращаемые состояния состоят из трех универсальных разновидностей:

  1. Success (Успех): Узел полностью и без проблем завершил свою задачу, либо проверяемое условие истинно.

  2. Failure (Неудача): Узел не смог выполнить задачу, столкнулся с препятствием, либо проверяемое условие ложно.

  3. Running (Выполняется): Операция еще не завершена; для завершения действия требуется несколько циклов времени (тик/кадр). 8

Именно наличие этого состояния «Running» представляет собой технологический скачок, отличающий деревья поведения от всех остальных классических древовидных структур. 27 Нельзя ожидать, что физический робот завершит команду «Идти к цели» за десятую долю секунды, или что игровой персонаж мгновенно завершит анимацию «Открыть сусун». Состояние Running позволяет конкретной ветви дерева асинхронно продолжать действие в фоновом режиме, предотвращая зависание и блокировку системы (blocking the execution thread). 27

По своей структуре деревья поведения состоят из трех основных категорий узлов: композиты, декораторы и листья. 28

1. Композитные узлы (Composite Nodes)

Композитные узлы — это точки ветвления дерева. Это строительные блоки, которые имеют несколько дочерних узлов и определяют, в каком порядке, при каких условиях или одновременно должны выполняться привязанные к ним дочерние узлы. 28

  • Селекторы (Selector / Fallback Nodes): Это отражение оператора OR (ИЛИ) в базовой логике программирования. Они последовательно выполняют привязанные к ним дочерние узлы слева направо. Если один из дочерних узлов возвращает Success или Running, узел Селектора немедленно прекращает проверку остальных потомков и передает этот статус своему родительскому узлу. Единственный способ для узла Селектора вернуть Failure (Неудача) — это неудача всех дочерних узлов, подключенных к нему. Эта структура идеально подходит для определения приоритетов выживания агента или альтернативных планов (fallback): система сначала пробует вариант «Исцелить себя», в случае неудачи переходит к варианту «Укрыться», а если и это не работает — пробует «Бежать». Как только один из них оказывается успешным, цепочка действий удовлетворяется. 8

  • Последовательности (Sequence Nodes): Это эквивалент оператора AND (И) из базового программирования для дерева поведения. Они проверяют дочерние узлы слева направо. Однако, в отличие от селекторов, последовательности немедленно прерывают операцию, если один из дочерних узлов возвращает Failure, и возвращают Failure родительскому узлу. Чтобы последовательность вернула Success, абсолютно все содержащиеся в ней дочерние узлы должны быть успешно выполнены без исключения. Этот узел используется для построения цепочки логических шагов задачи: цепочка, необходимая NPC для прохождения через дверь, настраивается как «Идти к двери», затем «Открыть замок», затем «Нажать ручку», затем «Войти внутрь». Если дверь заперта и персонаж не может открыть замок (Failure), нет смысла переходить к следующим шагам; последовательность терпит неудачу, и персонаж отказывается от плана прохождения через дверь. 8

  • Параллельные узлы (Parallel Nodes): Это одни из самых сложных членов семейства композитов. Они выполняют свои дочерние узлы не последовательно слева направо, а одновременно (синхронно). Они возвращают результат дереву на основе определенной политики успеха или неудачи (например, «завершить операцию, когда любой из дочерних узлов станет успешным» или «ждать, пока все они не станут успешными»). Это используется для управления одновременными задачами, такими как «махание руками во время разговора» персонажа или «продвижение к цели при одновременном сканировании радаром» роботизированного транспортного средства. 30

2. Узлы-декораторы (Decorator Nodes)

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

  • Inverter (Инвертор): Это оператор NOT в классическом программировании. Он преобразует результат Success дочернего узла в Failure, а результат Failure — в Success.

  • Limiter (Ограничитель): Позволяет дочернему узлу запускаться только определенное количество раз в секунду или за весь жизненный цикл; в случаях превышения этой квоты возвращает неудачу.

  • Timer (Таймер): Задерживает выполнение действия дочернего узла на определенное время вместо немедленного выполнения. 8

3. Листовые узлы (Leaf Nodes)

Это узлы выполнения, которые находятся на самом верхнем, самом нижнем уровне дерева и по своей природе не могут иметь никаких дочерних узлов. 29 Листья — это конечные точки системы, которые напрямую взаимодействуют с виртуальным игровым миром или реальными датчиками робота и создают осязаемые эффекты. 22

  • Действия (Actions/Tasks): Это основные блоки кода, которые создают физические или логические изменения в мире, воспроизводят анимацию, издают звуки или подают питание на двигатели («Выстрелить», «Идти к цели», «Остановить двигатели»).

  • Условия (Conditions/Queries): Это логические мгновенные проверки и запросы датчиков, которые обычно возвращают Success или Failure и не выполняют никаких действий («Враг в дальности видимости?», «У меня остались патроны?», «Уровень батареи ниже 20%?»). 8

Деревья поведения, управляемые событиями (Event-Driven), и наблюдатели (Observers)

Ранние классические BT работали по логике пуллинга (polling / постоянного опроса), при которой на каждом «тике» (обычно в каждом визуальном кадре) дерево непрерывно заново оценивалось сверху донизу, начиная с корня. 19 Хотя эта ситуация была безупречной с точки зрения реактивности, она создавала огромную вычислительную нагрузку на процессор (CPU) при расчете каждого кадра. По мере того как дерево становилось все глубже и глубже, стоимость многократной проверки всех условий сверху донизу в каждом кадре переставала быть устойчивой. 9

Современные игровые движки, такие как Unreal Engine, и отраслевые стандарты эволюционировали эту архитектуру в модель «Деревьев поведения, управляемых событиями» (Event-Driven Behavior Trees), чтобы преодолеть это аппаратное узкое место. 32 В этой инновационной структуре система не проверяет условия от начала до конца, как полиция, на каждом «тике», а использует реактивные декораторы, называемые «Прерываниями наблюдателя» (Observer Aborts). Например, если кошачий ИИ преследует мышь, классический параллельный узел каждую секунду спрашивает, вошла ли мышь в нору. В структуре, управляемой событиями, условие «Мышь наблюдаема?» помещается в дерево в качестве наблюдателя (Observer). Как только мышь убегает в нору (event), это событие запускается, и Наблюдатель мгновенно прерывает (abort) текущую последовательность кота «Бежать» и «Прыгать». Благодаря этому искусственный интеллект производит перерасчет только тогда, когда его состояние действительно меняется, достигается огромная экономия вычислительной мощности процессора, сводятся к минимуму пути одновременного выполнения в сложных деревьях, а оптимизация системы невероятно упрощается. Кроме того, в систему Unreal Engine в композитные узлы могут добавляться специальные узлы, называемые «Сервисами» (Services). Сервисы работают через определенные периоды (например, каждые 2 секунды), пока поддерево активно, заменяя периодические действия «during» из FSM и постоянно обновляя такие данные, как преследование врага.

Проблема памяти и механизм «Черной доски» (Blackboard)

Огромная модульность деревьев поведения имеет свою цену: узлы BT по своему дизайну полностью изолированы и не имеют состояния (stateless). То есть узел действия «Идти к цели» не знает, что нашел узел условия «Найти врага» слева от него или какие решения были приняты в предыдущих циклах. В отличие от FSM, BT не сохраняют прошлые решения или данные датчиков реального времени в своих внутренних структурах.

Для заполнения этого жизненно важного коммуникационного пробела и придания дереву своего рода «кратковременной памяти» используется паттерн проектирования Blackboard (Черная доска). Blackboard — это внешняя общая пулы данных (обычно настраиваемая как структура данных Dictionary, Hash Map или Variant в языках программирования), которую все узлы дерева могут читать и записывать во время работы.

Работа устроена следующим образом: когда дерево доходит до узла условия «Видеть врага», этот узел определяет координаты врага, но не хранит эту информацию у себя; он записывает ее прямо на Blackboard как TargetPosition = . Когда поток дерева доходит до следующего шага, узла действия «Идти туда», этот узел подключается к Blackboard, считывает данные TargetPosition и прокладывает свой маршрут.

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

Сравнительный анализ: Столкновение конечных автоматов и деревьев поведения

Для архитекторов, готовящихся заложить основы системы искусственного интеллекта с нуля, выбор между конечными автоматами (FSM) и деревьями поведения (BT) — это не просто вопрос синтаксиса или выбора движка, а жизненно важное архитектурное решение, которое глубоко повлияет на весь жизненный цикл проекта. Доклады Конференции разработчиков игр (GDC), промышленные тематические исследования и академические симуляции робототехники, опубликованные в последние годы, всесторонне сравнивают структурные характеристики этих двух систем с точки зрения принятия решений, модульности, реактивности, читаемости и масштабируемости.

1. Принятие решений (Decision-Making) против контроля состояний (State Control)

Наиболее сильный консенсус в индустрии программного обеспечения заключается в том, что деревья поведения специализируются на процессах «принятия решений», а конечные автоматы — на процессах «контроля состояний».

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

В следующей таблице систематически обобщаются эти фундаментальные философские различия:

2. Кризис модульности и связанности (Coupling)

Деревья поведения, как общепризнано в индустрии, являются архитектурами с «низкой связанностью» (low-dependency). Конечный узел дерева поведения (например, действие «Бежать к цели») представляет собой самодостаточный инкапсулированный объект, совершенно не зависящий от того, где именно он находится в дереве. Этот узел можно скопировать и перетащить в совершенно другую ветку под названием «Режим обороны из тяжелого пулемета», и он будет бесперебойно работать без изменения какого-либо исходного кода.

Напротив, в конечных автоматах «состояние» (state) должно само по себе или через своего менеджера определять, в какие конкретные состояния можно перейти после него и с помощью каких условий будет осуществляться этот переход. Такой подход с «жесткой связью» (tight coupling) делает практически невозможным копирование написанного блока кода из проекта и перенос его на другой искусственный интеллект. Любое незначительное изменение, сделанное в конечном автомате, или добавление нового состояния требует индивидуальной калибровки всех входящих и исходящих стрелок (transitions), привязанных к этому состоянию. В исследовании по управлению робототехникой было статистически доказано, что добавление нового поведения с допуском ошибок (например, возвращение к автономной зарядке при разрядке батареи) в системы на базе конечных автоматов в разы сложнее по сравнению с системами на базе деревьев поведения.

3. Конфликт выразительности (Expressiveness) и реактивности

Лабораторные сравнения, проведенные в архитектурах управления робототехникой, раскрывают философские различия в природе этих двух архитектур с помощью чрезвычайно ярких метрик.

Выразительность (Expressiveness): вопреки ожиданиям, академические исследования доказали, что конечные автоматы более «выразительны», чем деревья поведения. Активное состояние, в котором находится конечный автомат, является осязаемым физическим накоплением решений, принятых в прошлом. Если конечный автомат подает сигнал «В настоящее время я нахожусь в состоянии тревоги», эта информация неотъемлемо (inherently) содержит факт того, что в прошлом была обнаружена угроза, система признала эту угрозу действительной и инициировала последовательность действий. Деревья поведения же полностью забывчивы. В каждом новом цикле «тика» дерево начинает сканирование от корневого узла так, будто мир только что создан. Для того чтобы помнить прошлые действия или режимы, оно полностью зависит от внешних данных на черной доске (Blackboard).

Реактивность: в качестве платы за модульность реактивность в конечных автоматах развита слабо. Если разработчик конечного автомата не нарисовал стрелку перехода в виде «Если робот внезапно услышит пожарную тревогу во время переноски предмета, перейти в такое-то состояние», робот никогда не бросит коробку в руках и не убежит. Деревья поведения же гораздо более реактивны, чем конечные автоматы. Поскольку в каждом цикле мир проверяется заново или используются Наблюдатели (Observers), даже малейшее изменение окружающей среды позволяет дереву мгновенно перенаправиться на ветку с наивысшим приоритетом (например, «Экстренный побег») и прервать (preempt) действие по переноске предмета, которое в данный момент находится в статусе «Running».

4. Стоимость установки, отладка (Debugging) и обслуживание

В системах принятия решений стоимость обслуживания (maintenance) — это область, на которую разработчики тратят больше всего времени. Конечные автоматы могут быть созданы с нуля за считанные минуты на начальном этапе с очень низкими затратами, состоящими из нескольких простых перечислений (enum) и операторов switch-case. Однако со временем, по мере роста системы, это преимущество испаряется, и отладка превращается в настоящий хаос.

Деревья поведения же начинают работу с тяжелой нагрузкой из «бойлерплейта» (шаблонного кода) с самого начала. Корневые механизмы, системы тиков, интеграция с черной доской — запуск системы даже на базовом уровне представляет собой серьезную архитектурную инвестицию. Тем не менее, как только эта цена уплачена, предоставляемые ими возможности визуальной отладки (visual debugging) в реальном времени огромны. В таких системах, как встроенные инструменты деревьев поведения в Unreal Engine или плагин Beehave, разработанный для Godot, разработчик может в реальном времени следить за потоками данных по дереву (горящие зеленые, красные статусы) во время игры или выполнения симуляции, а также за считанные секунды определить, почему тот или иной узел действия дал сбой. Поиск источника ошибки визуально в «паутине» на базе конечных автоматов часто занимает часы.

Продвинутые реализации гибридной архитектуры и целеориентированные системы

Зацикливание только на одном архитектурном шаблоне часто приводит к сбоям в проектах автономных систем. В то время как чистый подход с конечными автоматами упирается в стену масштабируемости, попытка спроектировать даже малейший цикл движения или алгоритм прыжка с использованием деревьев поведения увеличивает количество «наблюдателей» (Observer), создавая избыточную проверку условий и огромные затраты CPU. По этой причине в современных AAA-играх и промышленных робототехнических решениях «золотым стандартом» являются гибридные (смешанные) проекты, в которых эти две архитектуры искусно интегрированы так, чтобы перекрывать слабые места друг друга.

Слияние дерева поведения и конечного автомата (Layered AI)

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

Например, в продвинутом ИИ противника или в агенте автономного наблюдения система работает следующим

образом:

  1. Слой принятия решений (BT — Стратегический мозг): Считывает через Blackboard количество угроз вокруг персонажа, значение собственного здоровья и боеприпасов. В результате селективной оценки принимается решение о «Тактическом отступлении».35

  2. Слой выполнения (FSM — Моторные навыки): Команда «Тактического отступления» передается в качестве триггера автомату состояний, интегрированному в скелетную систему персонажа. Конечный автомат немедленно выводит персонажа из текущего состояния «Анимация атаки» в состояние «Бег спринтом», а оттуда плавной последовательностью переводит в анимационное состояние «Приседание» за укрытием.

    Благодаря такому многоуровневому подходу дерево поведения не увязает на каждом кадре (frame) в деталях выполнения вроде «Какая нога персонажа впереди — левая или правая?», а конечный автомат не вынужден задавать макростратегические вопросы вроде «Где враг?».22

В области робототехники ситуация выглядит аналогично. Макроуровневые изменения режимов автономного управляемого транспортного средства (AGV), работающего на логистическом складе (Ручной контроль человеком, Режим автономного задания, Режим аппаратной ошибки / Чрезвычайной ситуации), координируются макро-HFSM для гарантии понятности.27 Однако когда робот переходит в «Режим автономного задания», такие операции, как обход динамических препятствий на пути к цели, манипуляции с хрупкими объектами и мгновенная обратная связь от датчиков, доверяются уникальной иерархической реактивности деревьев поведения.27 В литературе также успешно применяются продвинутые решения, где с помощью планировщиков с обратной цепочкой (backward-chaining) динамически генерируются автономные деревья поведения с нуля путем упорядочивания условий в обратном порядке от цели.27

Другие аспекты автономного принятия решений: Контекст GOAP

Для полного понимания сложности архитектур важно также упомянуть концепцию «Целеориентированного планирования действий» (Goal-Oriented Action Planning — GOAP), которая выходит за рамки систем FSM и BT в индустрии. Основанный на академической теории планирования STRIPS 1971 года и популяризированный Джеффом Оркиным (Jeff Orkin), архитектором легендарного ИИ противника в игре F.E.A.R., GOAP добавил совершенно новое измерение в процессы принятия решений.13

В системе GOAP действия не объединяются заранее в жесткое дерево. Системе предоставляется лишь список «Действий» (Actions — например, Открыть дверь), «Предварительных условий» (Preconditions — например, Находиться рядом с дверью) и «Эффектов» (Effects — например, Дверь теперь открыта). Система (обычно с использованием алгоритма поиска A*) автоматически объединяет эти действия во время выполнения (runtime) для достижения желаемого «целевого» состояния и создает наиболее идеальный план. Гениальность F.E.A.R. заключается в том, что для выполнения планов, создаваемых этим огромным фоновым движком автономного планирования, на самом деле используется очень простой, минималистичный конечный автомат всего с 3 состояниями (GoTo, Animate, Use Smart Object).13 Точно так же, как и в современных гибридах с BT, пока мозг представляет собой сложный алгоритм, мышцы всегда состоят из надежного конечного автомата.

Экосистемы игровых движков нового поколения: Видение "State Trees" (Деревьев состояний) в Unreal Engine

Будучи глобальным пионером в технологиях игровых движков и симуляциях автономных систем, компания Epic Games представила индустрии визионерский инструмент, цель которого — положить конец продолжающемуся десятилетиями соперничеству между деревьями поведения и конечными автоматами в революционной структуре Unreal Engine 5 (особенно в том виде, в каком она проявилась в обновлении 5.5): «State Trees» (Деревья состояний).36

«Безгосударственная» (stateless) природа традиционных деревьев поведения (BT), которая после определенного масштаба начинает становиться громоздкой, и жесткие границы конечных автоматов, лишенные гибкости и склонные к генерации спагетти-кода, были умно смешаны в концепции Деревьев состояний.36 С помощью архитектуры State Tree компания Epic Games устраняет структурные уязвимости старых BT и наделяет линейную мощь конечных автоматов современным механизмом принятия решений.

Выдающимися особенностями архитектуры State Tree являются следующие:

● В качестве основного потока обработки вместо недружелюбной к процессору структуры BT, постоянно тикающей и «бесконечно проверяющей условия», за основу берется производительность оптимизированного контроля состояний (state flow), предоставляемого конечными автоматами.36 ● При определении переходов между состояниями вместо использования «сложных взаимосвязанных запутанных стрелок переходов», что является слабейшим местом конечных автоматов, задействуется гибкость узлов Выбора (Fallback), используемых деревьями поведения. ● Идя на шаг дальше, алгоритмы Utility (Оценки полезности/веса) интегрируются непосредственно в выбор состояний.38 Вместо того чтобы рисовать статичные и хрупкие стрелки переходов для действий «Сражаться» или «Бежать» к цели, разработчик может определить для каждого состояния параметры математического веса и вероятностные распределения. По мере того как здоровье персонажа падает, оценка полезности (utility) функции, вычисляющей состояние «Бежать», превышает оценку состояния «Сражаться».38 Таким образом, дерево совершает органичный переход от одного состояния к другому без необходимости в бесчисленных стрелках переходов, словно изящное дерево решений.38

Этот технологический шаг нового поколения является революционным шагом в области автономного принятия решений. Тот факт, что инженеры Epic Games напрямую уделяют приоритетное внимание архитектуре State Tree в новых аппаратных и системных разработках, рисует четкую проекцию того, что чистые классические деревья поведения в будущем постепенно уйдут в прошлое, уступив место гибридным «Деревьям состояний», оснащенным производительностью конечных автоматов и обогащенным функциями полезности.36

Заключение

При проектировании основы принятия решений для автономных персонажей, робототехнических рук, беспилотных транспортных средств и продвинутых агентов искусственного интеллекта в видеоиграх абсолютного, единственного теоретического ответа на вопрос «Какая архитектура лучше?» не существует. Каждое архитектурное решение, принимаемое в информатике и программной инженерии, влечет за собой глубокий расчет компромиссов (trade-off).

Конечные автоматы (FSM) благодаря своей высокой скорости в детерминированных переходах состояний, простоте логического восприятия для разработчика и природе, наделенной четкими аппаратными границами, продолжают оставаться незаменимым строительным блоком, особенно в низкоуровневых игровых элементах управления, файтингах, аркадных механиках и сложных анимационных системах. Тем не менее в когнитивных сценариях, где количество представляемых переменных возрастает и условия окружающей среды меняются мгновенно, «взрыв состояний», вызываемый конечным автоматом, превращается в опасный структурный кризис, обрекающий проект на поддержку неуправляемого спагетти-кода в кратчайшие сроки.

Деревья поведения (Behavior Trees), напротив, вывели игровой искусственный интеллект и робототехническую автономность на совершенно новый уровень, привнеся в индустрию парадигмы гибкости, экстремальной модульности, повторного использования на основе компонентов и высокой реактивности. Наличие концепции «Running», способной асинхронно выполнять действия, охватывающие время, и формирование кода как независимых деталей LEGO, которые можно добавлять к другим агентам без необходимости когда-либо снова прикасаться к ним, сделали BT бесспорным мозгом масштабных симуляций открытого мира. Однако платой за эту гибкость является отсутствие состояния (statelessness), что вынуждает системных дизайнеров создавать внешние мосты памяти вроде Blackboard и реализовывать тяжелые событийно-ориентированные (event-driven) дизайны для обеспечения оптимизации производительности.

В конечном счете успешный дизайн современной автономной системы зависит от того, на каком уровне абстракции архитектор предпочитает управлять проектом. Практическая индустриальная практика доказывает неоспоримый факт: иерархические гибридные архитектуры, в которых цели автономных систем определяются и реактивные решения о выборе действия принимаются с помощью деревьев поведения, а физическая координация выбранного действия, шаги анимации и переходы режимов управляются конечными автоматами, представляют собой самую изящную и сложную точку, достигнутую современным программным обеспечением. Механизмы принятия решений будущего продолжат становиться ареной эволюции систем нового поколения, где границы будут еще больше размываться, а архитектуры сольют FSM и BT в единое целое (как в примере с Unreal Engine State Trees).

*Примечание: Изображения были сгенерированы с помощью Google Gemini.

BehaviorTreeFSMStateTreeGameDesign
Инструмент глубокого поиска
Google Gemini
Google Gemini
Инструмент перевода
Google Gemini
Google Gemini

Поделиться
Архитектуры принятия решений в игровой искусственной инженерии: Деревья поведения (BT) и Конечные автоматы (FSM) | GameDev Base