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