编程修炼之行为树与状态机

文章目录

涉猎行为树与状态机的初衷是对screep游戏的探索,突然有这个名词映入眼帘。

游戏领域ai控制策略,对游戏NPC的行为控制一般有2种,一种是状态机,一种是行为树。
行为树是一个包含逻辑节点和行为节点的树结构,每次需要找出一个行为的时候,会从树的根节点出发,遍历各个节点,找出第一个和当前数据相符合的行为。
状态(State),指的是对象的某种形态,在当前形态下可能会拥有不同的行为和属性。状态机(State Machine),指控制对象状态的管理器。对象的状态不会无端端改变,它需要在某种条件下才会变换

状态机

先聊聊状态机,比如宫文学老师在编译原理实战课里对于此法解析的实例。字符串识别成token的过程就是一个典型的状态机。
在这里插入图片描述
https://time.geekbang.org/column/article/118378

  1. 初始状态:刚开始启动词法分析的时候,程序所处的状态。
  2. 标识符状态:在初始状态时,当第一个字符是字母的时候,迁移到状态 2。当后续字符是字母和数字时,保留在状态 2。如果不是,就离开状态 2,写下该 Token,回到初始状态。
  3. 大于操作符(GT):在初始状态时,当第一个字符是 > 时,进入这个状态。它是比较操作符的一种情况。
  4. 大于等于操作符(GE):如果状态 3 的下一个字符是 =,就进入状态 4,变成 >=。它也是比较操作符的一种情况。
  5. 数字字面量:在初始状态时,下一个字符是数字,进入这个状态。如果后续仍是数字,就保持在状态 5。

状态机的核心是对状态流转过程的确定与回溯。包括一个始态,触发事件,状态转移方程,形成的终态。按照要素分为4个要素,即:现态、条件、动作、次态。
(1)现态:是指当前所处状态;
(2)条件:又称为“事件”。当条件被满足时,将会触发一个动作,或者执行一次状态的迁移。
(3)动作:条件满足后执行的动作。动作不是必须的,当条件满足后,也可以不执行任何动作,直接迁移到新状态。
(4)次态:条件满足后要迁移往的新状态。“次态”是相对于“现态”而言的,“次态”一旦被激活,就转变成新的“现态”了。

状态机的概念在电商领域有很好的例子。比如购买商品,或者物流。
用户将商品加入购物车待付款,已付款未配送,配送中,收到货,订单完成。而发生其他的改变如取消订单,未付款超时,退货退款等,状态恢复。这一类的场景就是一个状态不断变化的场景,在编码时需要落地到状态图,以便于对整个流程进行过程梳理。

参考:
https://zhuanlan.zhihu.com/p/47434856
https://www.cnblogs.com/lisongzzx/p/13641206.html

行为树

再来看看,行为树。上面状态机的例子适合状态较少的情况,可以设想一下,如果随着业务不断扩展,状态越来越多,而且某一个状态回溯的时候可能不单单是回到初始态,而有更多的选择性,这种情况使用状态机就有些捉襟见肘了。
在这里插入图片描述

行为树主要由以下四种节点抽象而成组合节点、装饰节点、条件节点、行为节点。

①组合节点(Composites)

主要包含:Sequence顺序条件,Selector选择条件,Parallel平行条件以及他们之间相互组合的条件。
②修饰节点(Decorator)

连接树叶的树枝,就是各种类型的修饰节点,这些节点决定了 AI 如何从树的顶端根据不同的情况,来沿着不同的路径来到最终的叶子这一过程。
如让子节点循环操作(LOOP)或者让子task一直运行直到其返回某个运行状态值(Util),或者将task的返回值取反(NOT)等等
③条件节点(Conditinals)

用于判断某条件是否成立。目前看来,是Behavior Designer为了贯彻职责单一的原则,将判断专门作为一个节点独立处理,比如判断某目标是否在视野内,其实在攻击的Action里面也可以写,但是这样Action就不单一了,不利于视野判断处理的复用。一般条件节点出现在Sequence控制节点中,其后紧跟条件成立后的Action节点。
④行为节点(Action)

行为节点是真正做事的节点,行为节点在树的最末端,都是叶子节点,就是这些 AI 实际上去做事情的命令;

行为树有一个很大的特点是可以通过节点对行为进行分组,形成更有效的管理与粒度的划分。

在这里插入图片描述

参考:
http://www.aisharing.com/archives/90

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值