AI行为树的工作原理
很久没写博客了,最近在项目刚部署到测试服,需要进行压测,老大相当专业的用了行为树来组织压测机器人的代码,这段时间陆陆续续在网上看了不少关于行为树的文章,其中有一篇我觉得写得非常到位,它原文是英文,链接将在下面给出,在这之前看了很多国内的文章都是写的糊里糊涂,后来看过这篇文章后,总算是对行为树的概念入了门。在这里我会把它的大致意思给翻译出来(注:由于原文有不少啰嗦的地方,所以没有逐句的翻译),以它的行为结构为标准,并会在译文中穿插一些自己的理解来谈谈我眼中的行为树,如果有什么不对的地方,欢迎大家指点。
一、介绍
尽管网上已经有大量关于行为树的教程,但是在开发游戏中的 AI 时还是遇到了不少关于行为树的问题。很多教程不关注于代码的实现,而是给出一些非常笼统的节点图,就像这样:
这些节点看起来非常的抽象,这对于我了解行为树的运作机制没有什么帮助,因为这样完全建立不起一个完整行为树的概念。自然也就更不知道如何在代码中进行行为树的实现。
行为树的概念见名知意,它是一棵具有层级结构的树,主要用来控制 AI 的决策,树的末端(注:叶子节点)就是 AI 实际要去做的事情。连接树枝的是各种类型的节点(注:这些节点将在后面讲解),这些节点决定了如何一个 AI 如何从根节点走到某一个叶子节点,并执行相应的命令操作。
二、树的遍历
行为树的一个特点就是它会一层一层的对节点依次进行检查,而每一层都要花费一个 Tick 的时间,所以一棵树要花费很多 Tick 的时间才能完成遍历,这和一般代码的实现有很大的区别。这是一个很没有效率的方式,尤其是当树变得很深的时候。我认为行为树的实现最好要在一次 Tick 里面完成整个行为树的逻辑判断,也就是说最好能在一次 Tick 时间里完成整棵树的遍历。
三、工作流
行为树由多种不同类型的节点组成,这些节点都会返回三种状态中的一种作为节点的运行结果。三种状态分别是:
- 成功 - Success
- 失败 - Failure
- 运行中 - Running
前两个,正如它们的名字一样,是用来向它们的父节点通知运行的成功或失败。第三种是指还在运行中,结果还未确定,会在下一个 Tick 的时候再去检查这个节点的运行结果。这个功能非常重要,它可以让一个节点持续运行一段时间来维持某些行为。比如一个 Walk 节点会在计算寻路和让角色保持行走的过程中持续返回 Running 来让 AI 保持这一状态。如果寻路因为某些原因失败,或是除了某些状况让行走的行为不得不中止,那么这个节点会返回 Failure 来告诉它的父节点;如果这个角色走到了指定的目的地,那么节点返回 Success 来表示这个行走的指令已经成功完成。这些状态可以用来决定行为树的走向,确保 AI 可以按照我们预期的方式来以某些顺序去执行行为树里的行为。
上面是节点的 3 种状态。说完了节点的 3 种状态,下面来说一说行为树中节点的类型。行为树节点类型分为下面 3 种:
- 组合节点 - Composite
- 修饰节点 - Decorator
- 叶子结点 - Leaf
这些节点类型可以说是行为树最精华的内容,下面将分别对这 3 种类型的节点做说明。
1、组合节点
我们先来看看行为树中最常见的组合节点。组合节点通常可以拥有一个或更多的子节点。这些子节点会按照一定的次序或是随机地执行,并会根据执行的结果向父节点返回 Success 、Failure,或是在未执行完毕时返回 Running 这样的结果值。
- 次序节点
- 选择节点
- 并行节点
(1)次序节点
(2)选择节点
(3)并行节点
我们每个节点都会有一个运行状态,来表示当前行为是否结束。对于组合节点来说,它的运行状态就是其子节点的运行状态,选择节点和次序节点比较好处理,因为对于这两种控制节点来说,每时刻,只会有一个子节点在运行,只要返回在运行的这个子节点的状态即可。但对于并行节点来说,它同时刻会有多个子节点运行。
2、修饰节点
- 逆变节点
- 成功节点
- 重复节点
(1)逆变节点
Inverter(逆变节点)可以将子节点的结果倒转,比如子节点返回了 Failure,则这个修饰节点会向上返回 Success,就像上面的例子里所说的一样。
(2)成功节点
成功节点不管它的子节点向其返回的结果为何,它总是向它的父节点返回 Success 的结果。这个往往用在当你知道一个子节点一定会返回 Failure 的结果,而它的父节点是次序节点,会因为子节点的 Failure 而终止,那么你可以强行让这个子节点返回 Success,来避免这一情况的发生。我们并不需要一个专门的失败节点,因为一个逆变节点加上成功节点就可以达到这一效果。
(3)重复节点
重复节点会在它的子节点返回结果后反复继续执行它。重复节点常常被用在一棵树的最顶部来确保树的持续运行。另外重复节点也可以被设定重复执行的次数。
3、叶子节点
AI行为树的工作原理的更多相关文章
- How Javascript works (Javascript工作原理) (十四) 解析,语法抽象树及最小化解析时间的 5 条小技巧
个人总结:读完这篇文章需要15分钟,文章介绍了抽象语法树与js引擎解析这些语法树的过程,提到了懒解析——即转换为AST的过程中不直接进入函数体解析,当这个函数体需要执行的时候才进行相应转换.(因为有的 ...
- 浏览器内部工作原理--作者:Tali Garsiel
本篇内容为转载,主要用于个人学习使用,作者:Tali Garsiel 一.介绍 浏览器可以被认为是使用最广泛的软件,本文将介绍浏览器的工作原理,我们将看到,从你在地址栏输入google.com到你看到 ...
- Java中GC的工作原理
转文: 一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个 ...
- AJAX工作原理及其优缺点
1.什么是AJAX?AJAX全称为"Asynchronous JavaScript and XML"(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.它 ...
- Struts2(二):工作原理
struts可查看源码:https://github.com/apache/struts 在学习struts2之前,我先看了一些比较早版本对struts2的工作原理相关的介绍,顺便抄写过来,用来帮助自 ...
- java gc的工作原理、如何优化GC的性能、如何和GC进行有效的交互
java gc的工作原理.如何优化GC的性能.如何和GC进行有效的交互 一个优秀的Java 程序员必须了解GC 的工作原理.如何优化GC的性能.如何和GC进行有效的交互,因为有一些应用程序对性能要求较 ...
- 【转】Linux Page Cache的工作原理
1 .前言 自从诞生以来,Linux 就被不断完善和普及,目前它已经成为主流通用操作系统之一,使用得非常广泛,它与Windows.UNIX 一起占据了操作系统领域几乎所有的市场份额.特别是在高性能计算 ...
- AJAX的工作原理及其优缺点
1.什么是AJAX?AJAX全称为“Asynchronous JavaScript and XML”(异步JavaScript和XML),是一种创建交互式网页应用的网页开发技术.它使用:使用XHTML ...
- DDNS 的工作原理及其在 Linux 上的实现--转
http://www.ibm.com/developerworks/cn/linux/1305_wanghz_ddns/index.html DDNS (Dynamic DNS) 扩展了 DNS 将客 ...
随机推荐
- Formview单文档或对话框项目接受不到按键消息的解决办法
当对话框或formview界面上有控件时,由于焦点在控件上,因此wm_char,wm_keydown等按键消息会被控件捕获,而导致对话框或formview无法接受该类按键消息.这时候通常的解决方法是在 ...
- 用 AJAX 读取xml 节点属性值
<html> <head> <title>AjaxTest</title> <script> var xmlHttp; function c ...
- [Unity3D]Unity3D游戏开发Lua随着游戏的债券(在)
---------------------------------------------------------------------------------------------------- ...
- Codeforces #264 (Div. 2) D. Gargari and Permutations
Gargari got bored to play with the bishops and now, after solving the problem about them, he is tryi ...
- 【转载】使用Docker Hub官方gcc:latest镜像编译C/C++程序以及缩小镜像的方法
摘要:使用Docker Hub官方gcc:latest镜像(1.2GB)编译C/C++程序,以及缩小镜像的方法. 方法1: 在gcc容器里编译C/C++程序 将C/C++代码运行在gcc容器内的最简单 ...
- Go 语言如果按这样改进,能不能火过 Java?
据 InfoWorld 消息,为改进 Go 语言的开发工具,Go 可能会获得自己的语言服务器,类似于 Microsoft 和 Red Hat 的语言服务器协议. 消息是从 Go 语言开发者的讨论组中流 ...
- Html5 学习系列(四)文件操作API
原文:Html5 学习系列(四)文件操作API 引言 在之前我们操作本地文件都是使用flash.silverlight或者第三方的activeX插件等技术,由于使用了这些技术后就很难进行跨平台.或者跨 ...
- WPF Layout 系统概述——Measure
原文:WPF Layout 系统概述--Measure 前言 在WPF/Silverlight当中,如果已经存在的Element无法满足你特殊的需求,你可能想自定义Element,那么就有可能会面临重 ...
- 获取同时间段不同的时间 php
/** * 根据指定日期返回经过的年月 * @param string $sDay 开始日期 * @param string $eDay 结束日期 * @returnse multitype:stri ...
- XAML的命名空间 - CSDN博客
原文:XAML的命名空间 - CSDN博客 一个最简单的XAML例子 <Window x:Class="WpfApplication1.MainWindow" xmlns=& ...