Поведение дерева
Если вы только начинаете знакомиться с концепцией деревьев поведения, то рекомендую сначала обратиться к Wiki этого проекта. Там вы сможете узнать больше о деревьях поведения. Если же вы опытный специалист и просто хотите использовать код из этого проекта, то можете продолжить чтение.
Использование кода дерева поведения в этом проекте
Описание проекта
Код дерева поведения написан на Lua. Он основан на базовой грамматике Lua.
Для корпоративного проекта потребовался набор кода дерева поведения на Lua, поэтому мы взяли за основу код из игры «Голодные игры». Большинство узлов дерева поведения совпадают с узлами из «Голодных игр», но некоторые узлы были изменены из-за возможных требований.
Общее описание
Состояние дерева поведения делится на четыре типа:
* READY: состояние готовности, узел ещё не был вызван или был вызван, но после завершения был сброшен.
* RUNNING: выполняется, обычно родительский узел ожидает завершения дочернего узла перед тем, как установить своё состояние в завершённое. Однако некоторые узлы не учитывают состояние выполнения дочерних узлов.
* SUCCESS: выполнение успешно.
* FAILED: выполнение неудачно.
Большинство узлов имеют соответствующие китайские имена, хотя некоторые я не знаю, как перевести.
Дерево поведения может быть прервано. В этом случае будет вызвана функция сброса дочернего узла. При необходимости функцию сброса можно переписать для обработки прерываний.
В некоторых случаях дерево поведения также может быть приостановлено. Это дерево содержит функции приостановки (Suspend) и перезапуска (Restart). Дерево должно быть приостановлено, когда это необходимо, и этот метод будет распространять соответствующую логику на каждый узел.
Узел дерева ###BehaviourTree
Узел дерева, который в основном используется для вызова дочерних узлов, сохранения состояния и т. д. Не имеет реальной бизнес-логики.
###BehaviourNode
Родительский узел всех узлов, не имеет реальной бизнес-логики, а в основном поддерживает различные методы базового состояния.
###DecoratorNode (узел декоратора)
Не имеет реальной бизнес-логики, но обычно является родительским узлом только с одним дочерним узлом.
###ConditionNode (узел условия)
При создании этого узла передаётся метод, который может получить значение условия. Узел будет оценивать возвращаемое значение метода при выполнении и изменять своё состояние. Значение nil или false преобразуется в FAILED, в противном случае — в SUCCESS.
###ConditionWaitNode (условный ожидающий узел)
Аналогичен узлу условия, за исключением того, что он устанавливается в состояние RUNNING, если условие оценивается как FAILED.
###ActionNode (действующий узел)
Передаёт функцию при создании этого узла. Когда узел выполняется, функция вызывается, и состояние узла устанавливается в SUCCESS.
###WaitNode (ожидающий узел)
Время ожидания передаётся при создании узла. Состояние узла будет RUNNING до истечения времени ожидания. После окончания времени ожидания состояние узла изменится на SUCCESS.
Примечание: во время ожидания узел будет спать. Это делается для снижения нагрузки на производительность. Другие аналогичные функциональные узлы должны также обеспечивать соответствующий сон при написании.
###SequenceNode (последовательный узел)
Необходимо передать очередь узлов при создании этого узла. Дочерние узлы будут выполняться по очереди при выполнении этого узла. Если состояние дочернего узла — SUCCESS, то следующий узел будет выполнен; если состояние дочернего узла — RUNNING, то узел установит своё состояние как RUNNING и будет ждать других результатов; если состояние дочернего узла — FAILED, то узел установит своё состояние в FAILED и сразу вернётся. Если все узлы возвращают SUCCESS в конце, узел установит своё состояние в SUCCESS и вернётся.
###SelectorNode (выбирающий узел)
Аналогичен последовательному узлу, необходимо передать список узлов при его создании. Узлы в списке будут выполняться один за другим при выполнении этого узла. Если дочерний узел возвращает SUCCESS, узел установит своё состояние в SUCCESS и сразу вернётся; если дочерний узел находится в состоянии RUNNING, узел установит своё состояние как RUNNING и дождётся других результатов; если дочерний узел вернёт FAILED, узел выполнит следующий узел. Если ни один из узлов не вернёт SUCCESS, узел установит своё состояние в FAILED и вернётся.
###NotDecorator (инвертирующий узел)
Требуется передать дочерний узел при создании этого узла. Результаты выполнения дочернего узла, кроме RUNNING, будут инвертированы и возвращены.
###FailIfRunningDecorator
Требуется передать дочерний узел при создании этого узла. Кроме состояния RUNNING, результаты дочернего узла будут установлены как состояние этого узла; если состояние дочернего узла равно RUNNING, состояние этого узла будет установлено в FAILED. Затем возвращается.
###RunningIfFailDecorator
Требуется передать дочерний узел при создании этого узла. Все результаты дочернего узла, кроме FAILED, будут установлены как состояние этого узла; если состояние дочернего узла равно FAILED, состояние этого узла будет установлено в RUNNING. Затем возвращается.
###LoopNode (циклический узел)
Необходимо передать список узлов и максимальное количество циклов при создании этого узла. Циклический узел попытается выполнить N раз, прежде чем установит своё состояние в SUCCESS и вернёт результат. Логика выполнения аналогична логике последовательного узла, где состояние RUNNING дочернего узла блокирует выполнение следующего узла, а состояние FAILED дочернего узла прерывает выполнение.
###RandomNode (случайный узел)
Необходимо передать список узлов и необязательный список весов при создании этого узла. Без списка весов все дочерние узлы выбираются случайным образом. С учётом весов дочерние узлы будут выбираться в соответствии с установленными значениями веса, и результат выбранного узла будет установлен как состояние этого узла, затем возвращается.
Примечание: количество весов может отличаться от количества узлов в списке. Недостающие веса будут заполнены 1, а лишние веса будут усечены.
###ParallelNode (параллельный узел)
Необходимо передать список узлов при создании этого узла. Узлы в списке выполняются один за другим. Если состояние дочернего узла равно FAILED, оно установит своё собственное состояние в FAILED и немедленно вернётся; если состояние дочернего узла равно SUCCESS или RUNNING, он выполнит следующий узел. Только когда все узлы вернут SUCCESS, этот узел установит своё состояние в SUCCESS и вернётся, иначе он установит своё состояние в RUNNING.
Примечание: некоторые узлы (ConditionNode, NotDecorator) принудительно перезапускаются перед выполнением для оценки.
###ParallelNodeAny
То же, что и ParallelNode, единственное отличие состоит в том, что этот узел установит своё состояние в SUCCESS, как только любой узел вернёт SUCCESS, и вернётся.
###WhileNode
Расширяющий узел параллельного узла, требуется передать метод получения значения условия и дочерний узел при его создании. Необходимо оценить условие перед выполнением дочернего узла при выполнении. Если оценка не удалась, узел сразу установит своё состояние в FAILED и вернётся. В противном случае состояние дочернего узла будет установлено как состояние этого узла и вернётся.
###IfNode
Последовательный расширяющий узел, аналогичный узлу WhileNode, разница в том, что оценка условия эффективна только при первом входе, а последующие выполнения будут непосредственно выполнять дочерний узел.
###WeightSelectNode
Весовой узел выбора, функционально похожий на узел выбора. Повторные выполнения будут упорядочены в соответствии с весом. Большие веса выполняются первыми. Веса могут быть заданы как числовые значения или функции. Если функция возвращает данные, они должны быть числовыми. Можно реализовать некоторую динамическую настройку порядка узлов для связанных алгоритмов искусственного интеллекта.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )