行为树

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

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

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

控制流节点(组合节点)

序列(sequence)

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

示例:
走向门、进门、关门等一系列连续动作。整个过程可以描述成这样:次序节点 ->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 dochildStatus <——child(i).Tick()if childStatus = Running thenreturn Runningelse if childStatus = Failure thenreturn Failurereturn Success

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

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

Function Tick()for i <—— 1 to N dochildStatus <——child(i).Tick()if childStatus = Running thenreturn Runningelse if childStatus = Success thenreturn Successreturn Failure

并行(parallel)

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

装饰器

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

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

带内存的控制流节点

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

执行节点

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

动作(action)

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

Function Tick()ExecuteCommand()if action-succeeded thenreturn Successelse if action-filed then return Failure elsereturn Running

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

条件(condition)

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

Function Tick()if condition-ture thenreturn Successelse 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].

行为树(Behavior trees)相关推荐

  1. 使用行为树(Behavior Tree)实现网游奖励掉落系统

    原地址:http://blog.csdn.net/akara/article/details/6165421 [原创]使用行为树(Behavior Tree)实现网游奖励掉落系统 by AKara 2 ...

  2. 使用行为树(Behavior Tree)实现游戏AI

    注意:本文版权归Csdn AKara所有,此处纯粹转载,如有再转,请严格按如下方式显示标明原创作者及出处,以示尊重!! 关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上 ...

  3. 行为树 Behavior Tree 原理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接: https://blog.csdn.net/LIQIANGEASTSUN/arti ...

  4. 行为树 Behavior Tree 原理 一

    行为树 Behavior Tree 原理 一 行为树 结构图如下,一棵倒置的树 行为树采用节点描述行为逻辑,主要节点类型有: 组合节点:选择节点.顺序节点.随机选择节点.随机顺序节点.随机权重节点.并 ...

  5. 梅克尔树Merkle trees

    世人皆知区块链,却不知梅克尔树呀 最近,研究中本聪大神的论文,他提到了梅克尔树让我很好奇, 打算研究一下,谁知道网上各种乱天飞的文章几乎都定义成: 梅克尔树(Merkle trees)是区块链的基本组 ...

  6. java merkle树,梅克尔树Merkle trees

    世人皆知区块链,却不知梅克尔树呀 最近,研究中本聪大神的论文,他提到了梅克尔树让我很好奇, 打算研究一下,谁知道网上各种乱天飞的文章几乎都定义成:梅克尔树(Merkle trees)是区块链的基本组成 ...

  7. k-d树(Kd trees)

    前言 在学习了平衡二叉查找树.红黑树等等之后,今天我们再来学习一个新的数据结构--kd树,kd树是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的搜索,下面就让我们来详细看看这种算法. k ...

  8. Behavior Trees

    https://en.wikipedia.org/wiki/Behavior_Trees_(artificial_intelligence,_robotics_and_control) http:// ...

  9. ai端到端_如何使用行为树构建端到端的对话式AI系统

    ai端到端 by Lior Messinger 由Lior Messinger 如何使用行为树构建端到端的对话式AI系统 (How to Build an End-to-End Conversatio ...

  10. Unity3D Behavior Designer 行为树1 认识

    环境:Unity2017.4 语言:C# 总起: 行为树,我很早就了解到了这个插件,不过对于它究竟是什么其实概念上比较模糊,这次正好趁机我们一起来学习一下(跟渲染一样AI也是个大坑). 本次教程基于插 ...

最新文章

  1. 分享一款超棒的jQuery旋钮插件 - jQuery knob
  2. 干货丨2017年含金量最高的机器学习技能或知识有哪些?
  3. H3C——BGP联盟配置
  4. 使用cacti对mysql监控的图像解释_Linux下的监控软件cacti的安装与配置
  5. Lomox0.2.0.1_Plugin_beta
  6. Ruby学习笔记_索引贴
  7. linux如何编译wine,利用winelib编译一个可在linux下运行的程序
  8. MySQL 创建索引和索引效率验证
  9. pcb只开窗不镀锡_PCB完整加工过程
  10. ubuntu-18.04 设置开机启动脚本-亲测有效
  11. Python新式类与经典类(旧式类)的区别
  12. python编程是啥-什么是少儿Python编程?这一篇就够啦!
  13. AutoTile 自动拼接(四) 学习与实践
  14. Markdown 使用感受
  15. ISO9000和CMM
  16. 数据集的划分--训练集、验证集和测试集
  17. 光耦驱动单向可控硅_超低功耗光电耦合驱动单向可控硅电路,光电耦合器
  18. c语言编程入门题库,级程序设计基础题库(c语言)(..更新).doc
  19. 立创eda学习笔记十一:立创eda、立创商城、嘉立创的区别
  20. 【服务器数据恢复】XFS文件系统分区丢失怎么恢复数据?

热门文章

  1. python 类的执行中保部存值_VisualFoxPro的报表文件.FRX中保存的是______。
  2. vc ++ 实现检测变速齿轮,变速精灵, 变速类辅助工具
  3. 什么软件可以测试麦克风音质,怎么测试麦克风
  4. 高效 Windows 工作环境 Java 开发环境搭建
  5. CMD如何进入C:WINDOWS\SYSTEM32
  6. 常见的API接口管理工具
  7. 天涯论坛--只看楼主
  8. 约翰库缇斯的经典语录
  9. 戴尔便携式计算机 故障,如何诊断戴尔笔记本电脑的无法开机自检问题
  10. 如何在Mac OS X中使用GeekTool设置桌面任务清单