前言
由于最近报的一个社团面试需要了解行为树,并写作一个读书报告。因此我也花费许多时间了解了一些相关知识,但它的内容实在太多了,只整理了一些基础的内容复,供新手了解,如有错误还请指出。
一、行为树是什么?
行为树(BT)与状态机(FSM),分层状态机(HFSM)三种技术在机器人以及游戏设计中常被提及。状态机主要包括1:状态2:事件3:监护条件4:动作5:转移等几个重要条件。类似于一个条件一个条件的转移和判断有点像“if…else” 语句,因此当条件多时就不够灵活,而行为树行为树(BT)是一种构建自主代理(例如机器人或计算机游戏中的虚拟实体)中的不同任务之间的切换的方式,是一个包含逻辑节点和行为节点的树结构,每次需要找出一个行为的时候,会从树的根节点出发,遍历各个节点,找出第一个和当前数据相符合的行为。行为树通过有序的逻辑分层在一定程度上解决了状态机的灵活性等问题,同时行为树是创建模块化和反应性复杂系统的一种非常有效的方式。
二、行为树结构
1.直观结构展示
这个来自百度
自制的比较丑
2.
行为树顾名思义,是一种树形结构,有根节点,组合节点和叶节点。行为树本质上是一种决策树,其真正的行为发生在叶节点上,一般称为行为节点(Action Node)(行为节点用来完成具体的操作),叶节点上还有条件节点(条件节点可以理解为一个if判断语句,当条件的测试结果为true时向父节点传递success,结果为false时向父节点传递failure)。其余节点可以统称为组合节点(Control Node),也即那些非根和叶节点。组合节点其实就是“组合控制”其子节点,子节点可以是叶节点,也可以是组合节点,所谓“执行控制节点”,就是执行其定义的控制逻辑。
1:常用的组合节点主要有
1选择节点(Selector):选择其子节点的某一个执行(只执行“一”个子节点)
2序列节点(Sequence):将其所有子节点依次执行,也就是说当前一个返回“完成”状态后,再运行下一个子节点
3并行节点(Parallel):不同于选择和顺序节点依次执行每个节点,并行节点是“同时”执行所有的节点。
4修饰节点(Decorator):修饰节点只包含一个子节点,用来以某种方式来改变这个子节点的行为。
2:选择节点可以继续分类:
1:带权值的选择节点(Weighted Selector)这种选择节点,预先为每一个分支标注一个“权值”(Weight Value),然后当我们选择的时候,采用随机选择的方式来选,随机时会参考权值,并且保证已经被测试过的节点的不会再被测试,直到有一个节点的前提被满足,或者测试完所有的节点。带权值的选择节点对于子节点前提由于随机的存在,所以子节点的前提可以任意,而不会发生“永远无法执行”的情况,我们通常会把所有子节点的前提设为相同,以更好的表现出权值带来的概率上的效果。当所有子节点的权值一样时,这种选择节点就成为了随机选择节点(Random Selector)
2:不带优先级的选择节点(Non-priority Selector)该选择节点的选择顺序是从上一个执行过的子节点开始选择,如果前提满足,则继续执行此节点,如果条件不满足,则从此节点开始,依次判断每一个子节点的前提,当找到一个满足条件的子节点后,则执行该节点。这种方式,是基于一种称之为“持续性”的假设寻找方式不存在哪个节点优先判断的问题,所以对于前提的设置的要求,就是要保证“互斥”(Exclusion),互不相同。
3:带优先级的选择节点(Priority Selector)该选择节点每次都是自左向右依次选择,当发现找到一个可执行的子节点后就停止搜索后续子节点。这样的选择方式,就存在一个优先级的问题,也就是说最左边的节点优先级最高,因为它是被最先判断的。对于这种选择节点来说,它的子节点的前提设定,必须是“从小到大”的方式(前面的不包含后面的),否则后续节点都会发生“永远不会执行”的情况。
3:节点的状态返回:
主要有成功(Success),失败(Failed),运行中(Running)。
1对于选择节点:按照某种规律对子节点迭代,有一个返回TRUE则该选择节点整体停止迭代.
2对于序列节点:按顺序对子节点进行迭代,当所有子节点返回TRUE时,该节点返回TRUE,有一个节点返回FALSE则停止迭代,该节点返回FALSE。
3 对于并行节点:
返回与其采用的状态有关:
Parallel Selector Node: 一False则返回False,全True才返回True。
Parallel Sequence Node: 一True则返回True,全False才返回False。
Parallel Hybird Node: 指定数量的Child Node返回True或False后才决定结 果。
三:主要优点
行为树主要有以下几个优点:
1:内部分层:因此可以进行复杂的行为组合,树本身可以作为子树存在,子树可重用和可组合可以作为更大更复杂树的节点包含在内,局部进行一种重复或复合组合。
2:直观性:行为树可以方便地把复杂的AI知识条目组织得非常直观。编译器中的行为树可以树形结构体现在屏幕上,整体的逻辑以及分层意义明显直观易于理解。
3:扩展性:可以设计制作和特定项目有关的组合结点和修饰节点。
4:静态性:整棵树的规划无需在运行时动态调整,为很多优化和预编辑都带来方便。
总结
本文只是自己经过多篇文章的综合以后写的,主要参考了“AI分享站”和CSDN中“Travis_X”的博客中行为树笔记以及“rain_love_snow”的“FSM(状态机)、HFSM(分层状态机)、BT(行为树)的区别”该篇博客。如有错误还请指出,感谢各位。