《Unity3D高级编程之进阶主程》第八章 AI(2)-用行为树构建AI

前面讲了用状态机来构建游戏中的怪物AI,由于它易于理解,容易被人类接受,扩展性和耦合性都很好,所以状态机的用途很广泛。但是状态机也有很大的缺点,就是不能处理和模仿太复杂的智能行为,比如模拟一个人类奔赴一场大型战役中,对战场中的各种繁多的突发事件做出符合人类模式的处理,这种方式状态机就无能为力,由于突发情况太多,组合起来的突发情况更多,做出反应的方式也变化多端,用人类思维逻辑去编写每个状态,状态的数量就会如指数级攀升无法应付,说的直白点就是人类大脑无法应付这么复杂的逻辑编写。

===

行为树很好的弥补了状态机的缺点,它简化了逻辑拼凑的方式,让简单头脑的人类能更容易编写和控制机器人的智能行为。这其实也是AI架构的关键点,能够让简单头脑的人类制作复杂的人工智能的行为方式,化繁为简。

化繁为简是我们的重点,人工智能的行为方式,都是由人类头脑指定的行为方式,是人类头脑所预期的,而非不可控的。制作出人类所预期的AI行为逻辑,制作的方式和过程又在人类大脑的承受范围内的,才是我们需要的。状态机的方式制作AI理论上可以实现任何AI,但复杂到一定程度人脑无法承受,其实就是无效的,或者说失败的。

行为树的优势就在这里,能够通过一些简单的人类能够应付的操作,制作出达到人类所预期的足够复杂的机器人行为方式。

下面我们来详细介绍行为树的组成。

行为树(Behavior Tree)具有如下的特性:

它有4大类型的N节点:

1,Composite Node 复合节点

复合节点可详细的分为3种:

一种是Selector Node,选择节点。当执行本类型节点时,它将从头到尾迭代执行自己的子节点,如果遇到一个子节点执行后返回True则停止迭代,本Node向自己的上层的父节点也返回True,否则所有子节点都返回False,那么本Node向自己的父节点返回False。

一种是Sequence Node,顺序节点。当执行本类型Node时,它将从头到尾依次迭代执行自己的子节点,如遇到一个Child Node 子节点执行后返回False,那停止迭代,本Node向自己的Parent Node父节点也返回False;否则所有Child Node都返回True,那本Node向自己的Parent Node返回True。

还有一种是Parallel Node,并发节点,并发执行它的所有Child Node子节点。

向Parent Node父节点返回的值和Parallel Node所采取的具体策略相关:

Parallel Selector Node: 执行完所有子节点,有一个False则返回False,全True才返回True。

Parallel Sequence Node: 执行完所有子节点,有一个True则返回True,全False才返回False。

Parallel Hybird Node: 执行完所有子节点,指定数量的Child Node返回True或False后才决定结果。

并行节点提供了并发性,由于它可以在线程或协程级别提供并发操作,所以在性能上面有能够充分利用CPU提高性能。

通常情况下,Parallel Node下会并行挂多个Action子树,或者挂多个Condition Node以提供实时性。

Parallel Node增加性能和方便性的同时,也增加实现和维护复杂度。

除此以外为了进一步提高AI的复杂度和随机性,Selector 和 Sequence可以进一步提供非线性迭代的加权随机变种。比如,Weight Random Selector,每次执行不同的起点,提供了每次执行不同的First True Child Node的可能。而Weight Random Sequence则每次执行顺序不同,提供了不同的迭代顺序的方式。这在AI术语中称为partial-order,能使AI避免总出现可预期的结果,让结果更加的随机化。

2,Decorator Node 修饰节点

Decorator Node,它的功能正如它的字面意思:它将它的Child Node执行后返回的结果值做额外修饰处理后,再返回给它的Parent Node。比如反向修饰Decorator Not:将结果反置后返回上级处理,失败修饰Decorator FailUtil:将失败修改后返回上级处理,计数修饰Decorator Counter:将结果计数后返回上级处理,时间修饰Decorator Time:将时间修改后返回上级处理。也可以作为日志处理Decorator Log,动画修饰处理Decorator Animation,甚至Decorator Nothing什么都不干。

3,Condition Node 条件节点

Condition Node相对比较简单,条件满足则返回Ture,否则返回False。

各式各样的条件节点,都继承基础条件节点并且返回Ture或False。

比较常用的条件节点例如,血量判断条件,距离判断条件,状态判断条件,时间间隔判断条件等。

4,Action Node 行动节点

Action Node,通常都是最后的叶子节点,它完成具体的一次(或一个step)的行为,视需求返回值。

Action Node可以是执行一次的,也可以视为分步执行很多次的行为。例如,向前进这个行为,可以一直被执行,直到条件不满足。

也就是说,通过扩展Action Node完全可以不需要借助外在程序或接口,自主定义角色行为。

常用的Action Node节点的例如,行走到目标地点Action,跟踪目标Action,转换角色方向Action,撤退Action,攻击Action,防御Action,释放技能Action等等。

在行为树中任何Node被执行后,必须向其上层的父节点报告执行结果:成功True或失败False。这简单的成功或失败汇报原则被很巧妙地用于控制整棵树的决策方向。

行为树能够支撑起对复杂逻辑的AI的原因就是由于使用了这些简单的节点去搭建整个AI模型。由于人脑可以很容易的写出这些简单的单个节点的逻辑,使得节点的功能性扩展变得非常容易,而拼装这些节点,就像是一个搭积木的过程,人脑能搭建多复杂的积木,就能搭建起多复杂的AI。

整棵行为树中,只有Condition Node和Action Node才能成为Leaf Node叶子节点,而也只有Leaf Node才是需要特别定制的Node。而Composite Node和Decorator Node均用于控制行为树中的决策走向。所以有些资料中也统称Condition Node和Action Node为Behavior Node行为节点,而Composite Node和Decorator Node为Decider Node决策节点。

在行为树之前,还有决策树这个被遗忘了的AI解决方案。决策树和行为树一样都是树形结构,都是由节点构成。决策的构成是由树形结构的头部开始,从上往下一路判断该往哪走,最后一定会执行到叶子节点,在决策树中只有叶子节点才决定了如何行动,而且在决定后的行动中,无法中途退出,要等到档次行为执行完毕或者被打断后才能开始下一次决策。

从理念上讲,决策树就是为了制定决策,而行为树是为了控制行为,是两个不同的理念,行为树更加注重变化,而决策树则注重选择。因此行为树可以定制比决策树更加复杂的AI逻辑,而实现的难易程度行为树并没有增加多少,所以决策树被冷落也是情理之中。

行为树比状态机更容易编写复杂的AI逻辑就是由于单一节点的易扩展性,以及整个AI树的可搭建能力都是在人脑的可及范围内。但是,再厉害的人脑也有搭建复杂度的极限,无论你对搭建行为树这项技能有多么精通,都有到一个极限的状态,也就是搭建的复杂度超出人类大脑的时候,人类就完全无法继续搭建了,或者说无法完成。例如,如果想完全模拟人类的思维判断逻辑,对不同的人,对不同的事,对不同的景色,对不同的物体,不同的路面,以及以上混合组合的不同组合,就完全超出了人类大脑搭建的极限。像这种特别复杂,完全不能由人类大脑自主搭建的方式形成的AI,就需要引入‘机器学习’这个概念了。由于情况太多,太复杂,唯有‘机器自主学习’才能适应这些复杂的情况时,‘Machine learning机器学习’,‘Deep learning深度学习’,‘Artificial Neural Network神经网络’,就成了解决这些问题的方案。

参考:

《使用行为树(Behavior Tree)实现游戏AI》by AKara 2010

感谢您的耐心阅读

Thanks for your reading

  • 版权申明

    本文为博主原创文章,未经允许不得转载:

    《Unity3D高级编程之进阶主程》第八章 AI(2)-用行为树构建AI

    Copyright attention

    Please don't reprint without authorize.

  • 微信公众号