有限状态机

目录

1.概念和术语

 2.特征

3.几个重要概念

4.分层有限状态机

5.状态机的实现方式

6..有限状态机的缺点

参考:


 

有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。是一种用来进行对象行为建模的工具,其作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件

1.概念和术语

图一

状态存储关于过去的信息,就是说:它反映从系统开始到现在时刻的输入变化。转移指示状态变更,并且用必须满足确使转移发生的条件来描述它。动作是在给定时刻要进行的活动的描述。有多种类型的动作

进入动作(entry action):在进入状态时进行

退出动作:在退出状态时进行

输入动作:依赖于当前状态和输入条件进行

转移动作:在进行特定转移时进行

FSM(有限状态机)可以使用上面图1那样的状态图(或状态转移图)来表示。此外可以使用多种类型的状态转移表。下面展示最常见的表示:当前状态(B)和条件(Y)的组合指示出下一个状态(C)。完整的动作信息可以只使用脚注来增加。包括完整动作信息的FSM定义可以使用状态表。

 

有限状态机_第1张图片

 2.特征

 总的来说有三种特征:

  • 状态总数(state)是有限的。
  • 任一时刻,只处在一种状态之中。
  • 某种条件下,会从一种状态转变(transition)到另一种状态。

3.几个重要概念

  • 状态(State):表示对象的某种形态,在当前形态下可能会拥有不同的行为和属性。
  • 转移(Transition):表示状态变更,并且必须满足确使转移发生的条件来执行。
  • 动作(Action):表示在给定时刻要进行的活动。
  • 事件(Event):事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。

4.分层有限状态机

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

比如:对小狗来说,我们可以把小狗的状态先定义为疲劳,开心,愤怒,然后这些状态里再定义小状态,比如在开心的状态中,有撒桥,摇尾巴等小状态,这样我们在外部只需要关心三个状态的跳转(疲劳,开心,愤怒)。如果不用HFSM的话,就会有很多跳转链接;如果用HFSM的话,在每个状态的内部只需要关心自己的小状态的跳转就可以了,这样就大大的降低了状态机的复杂度和跳转链接数。如下图:

è¿éåå¾çæè¿°

5.状态机的实现方式

       有很多种方法来实现有限状态机,读者可能想到使用一串的if...else,或者加上枚举类型的switch来进行状态的判断。的确,这样的方法是最直观的,也是最简单的实现方法。在一个智能体的状态数量很少的情况下,使用这样的实现方法是可以的。但是,当一个智能体的状态有很多个的时候,在这样实现,代码就会显得很臃肿,就会跟上一长串的case语句或者if...else语句。但是对于开发人员来说,将是一个噩梦。因为你不得不自己来维护这么一长串的代码,而且不易于调试和阅读。

        这里推荐使用的方法是使用状态设计模式来完成整个有限状态机的实现。(关于状态设计模式,是属于设计模式的范畴,读者可自行查阅相关的资料进行了解,推荐看Head First设计模式中关于状态设计模式的章节)

       有限状态机的一般实现是将每个状态写成类,再用一个载体(也就是所谓的状态机)管理这些状态的切换。

 

6..有限状态机的缺点

  • 各个状态类之间互相依赖很严重,耦合度很高。
  • 结构不灵活,可扩展性不高,难以脚本化/可视化。

参考:

1.维基百科 

2.游戏AI之状态机

3.游戏AI之 有限状态机、分层有限状态机、行为树

你可能感兴趣的:(决策规划)