Дерево поведения — это математическая модель выполнения плана , используемая в информатике , робототехнике , системах управления и видеоиграх . Они описывают переключения между конечным набором задач в модульной форме. Их сила заключается в их способности создавать очень сложные задачи, состоящие из простых задач, не беспокоясь о том, как простые задачи реализуются. Деревья поведения имеют некоторое сходство с иерархическими конечными автоматами с ключевым отличием, что основным строительным блоком поведения является задача, а не состояние. Его простота для человеческого понимания делает деревья поведения менее подверженными ошибкам и очень популярными в сообществе разработчиков игр. Было показано, что деревья поведения обобщают несколько других архитектур управления. [1] [2]
Первоначально структура управления на основе поведения была предложена Родни Бруксом в его статье под названием «Надежная многоуровневая система управления для мобильного робота». В первоначальном предложении список поведений мог работать как альтернатива друг другу, позже подход был расширен и обобщен в древовидной организации поведений с широким применением в игровой индустрии [ требуется ссылка ] в качестве мощного инструмента для моделирования поведения неигровых персонажей (NPC). [3] [4] [5] [6] Они широко использовались в известных видеоиграх, таких как Halo , Bioshock и Spore . В недавних работах деревья поведения предлагаются в качестве многоцелевой структуры управления для БПЛА , сложных роботов, роботизированной манипуляции и многороботных систем. [7] [8] [9] [10] [11] [12] Деревья поведения теперь достигли той зрелости, что их можно рассматривать в учебниках по игровому ИИ, [13] [14], а также в общих игровых средах, таких как Unity (игровой движок) и Unreal Engine (см. ссылки ниже).
Деревья поведения стали популярными благодаря своей парадигме разработки: возможность создания сложного поведения путем программирования только действий NPC, а затем проектирования древовидной структуры (обычно с помощью перетаскивания ), конечные узлы которой являются действиями, а внутренние узлы определяют принятие решений NPC. Деревья поведения визуально интуитивно понятны и просты в проектировании, тестировании и отладке, а также обеспечивают большую модульность, масштабируемость и возможность повторного использования, чем другие методы создания поведения.
На протяжении многих лет различные реализации деревьев поведения продолжали совершенствоваться как по эффективности, так и по возможностям для удовлетворения потребностей отрасли, пока они не превратились в деревья поведения, управляемые событиями . [15] [5] Деревья поведения, управляемые событиями, решили некоторые проблемы масштабируемости классических деревьев поведения, изменив то, как дерево внутренне обрабатывает свое выполнение, и введя новый тип узла, который может реагировать на события и прерывать выполнение узлов. В настоящее время концепция дерева поведения, управляемого событиями, является стандартом и используется в большинстве реализаций, хотя для простоты их по-прежнему называют «деревьями поведения».
Дерево поведения графически представлено как направленное дерево , в котором узлы классифицируются как корневые, узлы потока управления или узлы выполнения (задачи). Для каждой пары связанных узлов исходящий узел называется родительским, а входящий узел называется дочерним. Корень не имеет родителей и ровно одного дочернего узла, узлы потока управления имеют одного родителя и по крайней мере одного дочернего узла, а узлы выполнения имеют одного родителя и ни одного дочернего узла. Графически дочерние узлы узла потока управления располагаются под ним, упорядоченные слева направо. [16]
Выполнение дерева поведения начинается с корня, который с определенной частотой посылает такты своему потомку. Такт — это разрешающий сигнал, который разрешает выполнение потомка. Когда выполнение узла в дереве поведения разрешено, он возвращает родителю статус running , если его выполнение еще не завершено, success , если он достиг своей цели, или failure в противном случае.
Узел потока управления используется для управления подзадачами, из которых он состоит. Узел потока управления может быть либо узлом выбора (резервным), либо узлом последовательности. Они запускают каждую из своих подзадач по очереди. Когда подзадача завершена и возвращает свой статус (успех или неудача), узел потока управления решает, выполнять ли следующую подзадачу или нет.
Узлы отката используются для поиска и выполнения первого дочернего узла, который не дает сбой. Узел отката немедленно вернется с кодом статуса успеха или выполнения, когда один из его дочерних узлов вернет успех или выполнение (см. рисунок I и псевдокод ниже). Дочерние узлы отмечены в порядке важности слева направо.
В псевдокоде алгоритм резервной композиции выглядит следующим образом:
1 для i от 1 до n сделать2 childstatus ← Отметить(ребенок(i))3 если childstatus = работает4 обратный ход5 иначе, если childstatus = успех6 возвращение успеха7 конец 8 возврат неудача
Узлы последовательности используются для поиска и выполнения первого дочернего элемента, который еще не был успешно выполнен. Узел последовательности немедленно вернется с кодом состояния «неудача» или «выполнение», когда один из его дочерних элементов вернет «неудача» или «выполнение» (см. рисунок II и псевдокод ниже). Дочерние элементы отмечены по порядку слева направо.
В псевдокоде алгоритм построения последовательности выглядит следующим образом:
1 для i от 1 до n сделать2 childstatus ← Отметить(ребенок(i))3 если childstatus = работает4 обратный ход5 иначе, если childstatus = неудача6 отказ возврата7 конец 8 возвращение успеха
Чтобы применить инструменты теории управления к анализу деревьев поведения, их можно определить как трехкортежные. [17]
где — индекс дерева, — векторное поле, представляющее правую часть обыкновенного разностного уравнения, — временной шаг, а — статус возврата, который может быть равен Running , Success или Failure .
Примечание : Задача представляет собой вырожденное дерево поведения, не имеющее родителя и потомка.
Выполнение дерева поведения описывается следующими стандартными обыкновенными разностными уравнениями:
где представляют собой дискретное время, а — пространство состояний системы, моделируемое деревом поведения.
Два дерева поведения можно объединить в более сложное дерево поведения с помощью оператора последовательности.
Затем возвращаемый статус и связанное с ним векторное поле определяются (для [ необходимо определение ] ) следующим образом:
{{cite book}}
: |work=
проигнорировано ( помощь )