状态机和行为树

    最近在思考游戏AI,看到一些文章在鼓吹状态机(fsm)已经过时,行为树才是现在和将来。目前我的水平,对这个结论无法做评判。但是从读到的文章本身,没有看到有力的证据。

    诚然,在复杂状态下,fsm的维护难度是倍增的,但行为树也面临同样问题(不要看那些半吊子文章中画的清晰的属性结构,真的复杂场景哪里有这么好看的树)。fsm的分层能缓解一部分复杂度问题,我相信行为树也是通过类似子树的方式处理,所以就是个半斤八两。

    另外,看到说行为树的判别因子有{前置条件 , 当前状态, 输入},较之fsm的{当前状态, 输入} 上下文更加完整。对于这个说法,只能说是实现的问题,和行为树/fsm一点关系都没有。

     -- 补充说一下,行为树的前置条件,在fsm中,可以表示为当前某个属性的情况(比如,血量满/太少),可以得到同样的语义:当 xxx 时,会选择yyy。

    如果把fsm和图,行为树和树(废话。。)比较一下,可以有印象:既然树是图的简化形式,行为树也像是fsm的简化版。从直观上看,fsm似乎效率还略高一点,而行为树细分了一些节点类型,概念上会更清晰一点。以上就作为本文大概的结论吧,欢迎讨论(pen)。


-----------------------------------------

python官方收集的一些FSM工程,有的很有意思

https://wiki.python.org/moin/FiniteStateMachine


转载于:https://my.oschina.net/kakablue/blog/298994

### 状态机行为树的区别 状态机行为树都是用于建模复杂逻辑的工具,但在设计理念、结构以及适用场景上有显著差异。 #### 设计理念的不同 状态机的核心在于“状态”,其设计围绕着对象可能处于的不同状态展开。每个状态都定义了一组行为,并且可以通过预设条件触发状态间的转换[^1]。相比之下,行为树则更关注于“行为”的组合执行顺序。它通过树形结构表示一系列动作及其优先级或依赖关系,能够灵活地控制复杂系统的决策过程[^2]。 #### 结构上的对比 - **状态机** 状态机由一组离散的状态组成,这些状态之间存在明确的转移路径。每次状态变化都会引发相应的行为调整。这种机制非常适合描述那些具有清晰阶段划分的过程,比如订单流程管理或者游戏角色的生命周期管理。 - **行为树** 行为树采用层次化的树状图来表达任务分解后的子目标及其实现方法。根节点代表最终目的;分支节点决定如何分配资源给多个并发操作;叶节点则是具体的行动指令。相比传统FSM, BTs能更好地应对动态环境下的实时响应需求,因为它们允许中断当前活动而转向更高优先级的新任务[^3]。 #### 执行方式的区别 在运行过程中,状态机会持续评估外部输入是否满足进入下一状态的要求,一旦符合条件即刻完成跳转并启动新状态下指定的操作序列。然而,在基于事件驱动模型构建起来的行为树里,即使某个节点已经开始运作也可能被突然终止以便让位于紧急情况处理程序——这得益于新增加的一类特殊功能节点的存在使得整个体系具备更强适应性灵活性。 ### 适用场景分析 对于需要频繁变更但又保持相对稳定模式的应用场合来说,例如自动化生产线中的工序安排或是网络协议栈里的握手确认环节等,利用状态机能有效简化开发难度同时提高维护便利度。而在面对更加开放不确定性的挑战时,诸如视频游戏中NPC智能表现塑造方面,则往往倾向于选用行为树方案因其天然支持复杂的交互逻辑并且易于扩展修改特性使之成为首选工具之一[^2][^3]。 ```python # 示例代码:简单的状态机实现 class StateMachine: def __init__(self): self.state = 'idle' def handle_event(self, event): transitions = { ('idle', 'start'): 'running', ('running', 'stop'): 'idle' } key = (self.state, event) if key in transitions: self.state = transitions[key] sm = StateMachine() print(sm.state) # 输出: idle sm.handle_event('start') print(sm.state) # 输出: running ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值