行为树(Behavior trees)

行为树

行为树(Behavior Tree,BT)是一种构建在自主智能体(例如机器人或者电脑游戏中的虚拟实体)中不同任务(假设某个活动以某种方式分解为可以重用的子活动,这些子活动称为任务,有时也称为动作或者控制模式)中间切换的方法,是创建具有“模块化(modular)和反应性(reactive)复杂系统的一种有效的方式”。BT是一个有向的根树,根节点就是root节点,作为行为树的入口,节点类型为Root,每个行为树有且只有一个Root类型节点;内部节点称为控制流节点,叶节点称为执行节点,所有的叶子节点的类型一定是Action,同时Action类型的节点一定不能作为非叶子节点来使用。
非叶子节点也称为组合节点Composition,可以有一个或多个子节点,root节点一定只有一个子节点,没有父节点,其他的节点都有一个父节点和子节点。
行为树由多种不同类型的节点组成,这些节点都会返回三种状态中的一种作为节点的运行结果。三种状态分别是:

成功 - Success
失败 - Failure
运行中 - Running

执行方式: BT从生成给定频率的时钟信号的根节点开始执行,这些信号(Tick)允许执行一个节点,并传递选中节点的一个或者多个子节点。当切仅当节点接收时钟信号时才会执行该节点,并将结果返回给父节点。

控制流节点(组合节点)

序列(sequence)

标志:—>(单箭头)
功能:将时钟信号从左侧开始发送到其子节点,直到找到返回“失败”或者“执行”的子节点,然后将其返还到父节点当中,当且仅当所有的子节点返回成功时,该节点才返回“成功”,当有一个节点返回“执行”或者“失败”时,序列节点不会把时钟信号路由到下一个子节点。
逻辑:与
行为树(Behavior trees)_第1张图片

示例:
走向门、进门、关门等一系列连续动作。整个过程可以描述成这样:次序节点 ->Walk to Door (Success) ->次序节点(Running) ->Open Door (Success) ->次序节点(Running) ->Walk through Door (Success) ->次序节点(Running) ->Close Door (Success) ->次序节点(Running) -> 向次序节点的父节点返回 Success。
伪代码:

Function Tick()
  for i <—— 1 to N do
    childStatus <——child(i).Tick()
    if childStatus = Running then
      return Running
    else if childStatus = Failure then
      return Failure
  return Success

回退(fallback):选择器节点,优先选择器节点

标志:问号?
功能:将时钟信号从左开始发送到子节点,直到找到返回成功或者执行的子节点,然后将成工或者执行返回到父节点,当且仅当所有的子节点返回失败时才返回失败
逻辑:或
伪代码:

Function Tick()
  for i <—— 1 to N do
    childStatus <——child(i).Tick()
    if childStatus = Running then
      return Running
    else if childStatus = Success then
      return Success
  return Failure

并行(parallel)

标志:双箭头方框
功能:将始终发送到所有的子节点,如果M个子节点返回成功,则返回成功,如果N-M+1个子节点返回失败,则返回失败,否则返回执行,N为子节点的数量,M<=N为用户自定义的阈值

装饰器

功能:只能带有一个子节点的控制流节点,该节点根据用户定义的规则操纵其子节点的返回状态,并根据预定义的规则有选择的触发子节点。例如:反转装饰器:反转子节点的成功或者失败状态,最多尝试N次的装饰器:只允许其子节点失败N次,并总是返回失败而不执行子节点。
符号:菱形◆
类型:

  • 逆变节点
  • 成功节点
  • 重复节点

带内存的控制流节点

引入内存节点是为了让设计者避免不必要的重新执行某些节点,带内存的控制流节点始终能够记住子节点是否返回了成功或者失败,从而避免子节点的重新执行,直到整个序列节点或者回退节点以成功或者失败结束,当父节点返回成功或者失败时,内存将被清除。

执行节点

叶节点是最低层的节点,它们不会拥有子节点。叶节点是最强大的节点类型,它们是真正让你行为树做具体事情的节点。通过与组合节点和装饰器节点的配合,再加上你自己对叶子节点功能的定义,你可以实现非常复杂的、智能的 AI 行为逻辑。拿代码作为类比的话,组合节点和修饰节点就好比那些改变代码 Flow( 工作流程 ) 的 If 判断和 While 循环等等,而叶节点就是那些真正起作用的被调用的方法,去让角色做具体的事情。

动作(action)

功能:接收到时钟消息时,执行命令,动作执行完成返回成功,动作执行失败,返回失败,动作正在运行,返回执行。
符号:方框
伪代码:

Function Tick()
  ExecuteCommand()
  if action-succeeded then
    return Success
  else if action-filed then 
    return Failure 
  else
    return Running

注意:动作执行频率可能比BT本身频率更高。

条件(condition)

功能:接收到时钟时,检查一个命题(条件),返还成功或者失败,永远不会返回执行状态。
符号:椭圆
伪代码:

Function Tick()
  if condition-ture then
    return Success
  else 
    ruturn Failure

参考文献:

1.https://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php
2.Michele Colledanchise.elt,behavior tree in robotics and AI:an introduction[M].

你可能感兴趣的:(C++,行为树)