有限状态机FSM和层次状态机HSM

前言

  就单片机而言,程序可以分为两类:带操作系统的程序和前后台程序;前后台程序从架构上又分为顺序机和状态机。

  广义地说, 任何一个程序都是一个状态机, 因为它总是要记住一些状态, 然后根据输入进行输出。 狭义上说,状态机不是指随随便便的一个程序, 而是指某一类程序, 也就是状态机编程程序。

FSM

  简单讲就是将行为分为一个一个的状态,状态与状态之间的过渡通过事件的触发来形成。比如士兵的行为有“巡逻”,“追击敌人”,“攻击敌人”,“逃跑”等行为,响应的事件就有“发现敌人”,“追到敌人”,“敌人逃跑”,“敌人死亡”,“自己血量不足”等。那么可以写成这样一个状态机:

  1.士兵 “巡逻”,如果 “发现敌人”,那么,“追击敌人”

  2.士兵 “追击敌人”, 如果 “追到敌人”, 那么,“攻击敌人”

  3.士兵 “追击敌人”, 如果 “敌人死亡”, 那么,继续 “巡逻”

  4.士兵 “攻击敌人”, 如果 “敌人死亡”, 那么,继续 “巡逻”

  5.士兵 “攻击敌人”, 如果 “血量不足”, 那么,“逃跑”

  其中,士兵就是这个FSM的执行者,红色的就是状态,蓝色的就是事件,整个状态机的行为可以总结为:当前状态=>是否满足条件1,如果是,则跳转到对应状态,否则=>是否满足条件2,如果是,则跳转到对应状态。

  由此可看出,状态机是一种“事件触发型”行为,就是只有事件的触发才会发生引起状态的变化。

HSM

  简单来说,就是FSM当状态太多的时候,不好维护,于是将状态分类,抽离出来,将同类型的状态做为一个状态机,然后再做一个大的状态机,来维护这些子状态机。

  举个决策小狗行为的例子:我们对小狗定义了有很多行为,比如跑,吃饭,睡觉,咆哮,撒娇,摇尾巴等等,如果每个行为都是一个状态,用常规状态机的话,我们就需要在这些状态间定义跳转,比如在“跑”的状态下,如果累了,那就跳转到“睡觉”状态,再如,在“撒娇”的状态下,如果感到有威胁,那就跳转到“咆哮”的状态等等,我们会考量每一个状态间的关系,定义所有的跳转链接,建立这样一个状态机。如果用层次化的状态机的话,我们就先会把这些行为“分类”,把几个小状态归并到一个状态里,然后再定义高层状态和高层状态中内部小状态的跳转链接。

  其实层次化状态机从某种程度上,就是限制了状态机的跳转,而且状态内的状态是不需要关心外部状态的跳转的,这样也做到了无关状态间的隔离,比如对于小狗来说,我们可以把小狗的状态先定义为疲劳,开心,愤怒,然后这些状态里再定义小状态,比如在开心的状态中,有撒桥,摇尾巴等小状态,这样我们在外部只需要关心三个状态的跳转(疲劳,开心,愤怒),在每个状态的内部只需要关心自己的小状态的跳转就可以了。这样就大大的降低了状态机的复杂度,另外,如果觉得两层的状态机还是状态太多的话,可以定义更多的状态层次以降低跳转链接数。

  QP就是一个面向MCU,面向并发的层次式状态机模型。有人称量子平台QP(Quantum Programming)叫作量子编程(Quantum Programming),也叫状态机编程。

 参考文献

http://www.cnblogs.com/jeason1997/p/5140201.html

时间: 2024-10-16 12:20:40

有限状态机FSM和层次状态机HSM的相关文章

cocos2d-x 游戏开发之有限状态机(FSM) (四)

cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge.net/)就是这样的工具.下载地址: http://sourceforge.net/projects/smc/files/latest/download 在bin下面的Smc.jar是用于生成状态类的命令行工具.使用如下命令: $ java -jar Smc.jar Monkey.sm 1 真实世

Atitit. 有限状态机 fsm 状态模式

Atitit. 有限状态机 fsm 状态模式 1. 有限状态机 1 2. "状态表"和"状态轮换表" 1 3. 有限状态机概念(状态(State)事件(Event)转换(Transition) 动作(Action) 2 4. 状态机的应用场景 2 4.1. ,"有限状态机"在游戏的人工智能方面是很有用处的. 2 4.2. 用状态机模式消除复杂的 if else 逻辑 2 4.3. 源码文本处理状态机 2 4.4. 正则表达式(regexp),判断

算法学习笔记(九)有限状态机 FSM 的应用

一个问题:Beautiful String 这是2014微软校招的编程题,题意大致如下: 如果一个字符串包括三组或者更多组的连续升序字母,每组长度相等,那么我们就称这个字符串是Beautiful String 符合Beautiful String举例:abc, cde, aabbcc, aaabbbccc 不符Beautiful String举例:abd,cba,aabbc,zab 输入一个只含有小写字母的字符串,如果它含有一个Beautiful的子串,就输出YES,否则输出NO 输入: 第一行

cocos2d-x 游戏开发之有限状态机(FSM) (二)

cocos2d-x 游戏开发之有限状态机(FSM)  (二) 1 状态模式 State是状态基类.它其实是一个接口,它有3个实现类,分别对应每个状态.Monkey类只需要维护State类,而具体的行为通过3个实现类完成.这就是多态.下面是完整的代码: 2 状态基类 // State.h // #ifndef STATE_H_ #define STATE_H_ class Monkey; struct State { virtual void execute(Monkey *mk) = 0; };

cocos2d-x 游戏开发之有限状态机(FSM) (一)

cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游戏开发之旅>(钟迪龙) 基本上所有的软件都是有限状态机(finite-state machine,FSM).它是一个有向图,由一组节点和一组相应的转移函数组成.通俗点讲,它是一个事件驱动系统的模型,这个模型由有限数目的状态,若干输入和状态与状态之间转换的规则组成.在某一时刻,有一个或一组状态是FSM的当

关于有限状态机FSM同步复位的问题

FSM通常情况下使用异步信号进行复位,如FSM1中的rst_n信号.当rst_n信号为低时,FSM进入空闲状态IDLE. 在某些特殊情况下有可能需要跟随某个外部信号强制切换到空闲状态,也即同步复位.下面给出了两种同步复位的写法,请各位指教. 如果有什么更好的实现方法,还望不吝赐教. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 3

cocos2d-x 游戏开发之有限状态机(FSM) (三)

cocos2d-x 游戏开发之有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态.然后Monkey类就实现了行为与状态分离.Monkey类只负责自己的行为,MonkeyFSM作为Monkey的成员,负责状态调度.MonkeyFSM调用状态模式类的方法,状态模式类调用真实对象Monkey的方法.注意本文例子代码只是为了说明问题,并不能真正用于实际当中.其中Monkey与MonkeyFSM互相保存对方的指针,存在循环引用问题. 代码

有限状态机(FSM)的Java 演示

本文从简单的样例入手,逐步演变成很复杂的程序. 在简明 状态模式(5.8)中,状态之间的变换由外界控制,或者说.多种状态是切割的.无关的.状态模式最有趣的地方正是讨论其状态的变迁. 1.引子 空调(air-condition)的遥控器有两个button(很多其它的button在后面的样例中引入),power/电源键和cool/制冷键. 空调的执行呈现3个状态.停止/Off.仅送风/FanOnly.制冷/Cool.起始状态为Off,状态变化图例如以下所看到的. 这是简化的有限状态机(Finite

有限状态机(FSM)的Java 学习FSM

本文从简单的例子入手,逐步演变成非常复杂的程序. 在简明 状态模式(5.8)中,状态之间的变换由外界控制,或者说,多种状态是分割的.无关的.状态模式最有趣的地方正是讨论其状态的变迁. 1.引子 空调(air-condition)的遥控器有两个按钮(更多的按钮在后面的例子中引入),power/电源键和cool/制冷键.空调的运行呈现3个状态,停止/Off.仅送风/FanOnly.制冷/Cool.起始状态为Off,状态变化图如下所示. 这是简化的有限状态机(Finite State Machine.