随笔|AI设计之状态机

有限状态机


最近尝试写ai,又看了下状态机,其实之前就用过ac自动机,不过是用来处理字符串,实际上ac自动机也是一个有限状态机的一种而已。有限状态机常常被称作FSM,在人工智能编程上应用还是很广泛的。

虽然其他更专业的智能体结构越来越普及,但是FSM的地位还是能够保持。因为它相对来说编程快速简单,易于调试,计算开销也少,在设计上也和人类的直觉更加贴合。

FSM实际上是很简单的一个模型,虽然在数学上对其定义可能比较复杂,但是作为程序员,只需要有一个描述性的定义,了解大概是什么东西就行了:

一个有限状态机是一个设备,或是一个设备模型,具有有限数量的状态,它可以在任何给定的时间根据输入进行操作,使得从一个状态变换到另一个状态,或者是促使一个输出或者一种行为的发生。一个有限状态机在任何瞬间只能处在一种状态。

在我看来,其实可以把有限状态机看作是一个有向图,状态是图的结点,状态变换可以看作是有向边。实际上编写ai的过程就是要把这幅图画出来,然后用代码把图构建好就可以了,听起来是不是很简单~

随笔|AI设计之状态机_第1张图片
随便偷个图

分层状态机


当状态很多的时候,有限状态机就有可能变得非常庞大,结构也会变得更加复杂,这时候就可以使用分层状态机了,把那些同一类型的状态机做为一个状态机,然后再做一个大的状态机,来维护这些子状态机。

大概是这个样子的,额:

随笔|AI设计之状态机_第2张图片
分层状态机

另外,这篇文章里的分层自动机的划分方法我觉的很有趣,推荐一下:http://www.sfw.cn/xinwen/466004.html

实现


理论的东西大概就是这样了,至于实现,我觉的有很多方式,其实并不需要拘泥于某一种方法。出了用switch case + if else的实现方法,因为太傻逼了。

比较简单的实现方法可以大概这样写:

class State {
 public:
    virtual void Execute (Robot* robot) = 0;
};

class Robot {
    State* m_nowState;
public:
    void Update() {
        m_nowState->Execute(this);  
    }
    void ChangeState(const State* newState) {
        delete m_nowState;
        m_nowState = newState;
    }
};

继承state的状态类在Execute里根据状态判断是否转换状态。
当然,你也可以通过事件驱动的方式来转移状态,或者直接遍历是否某个状态可以转换。总之,这是可以根据想要做的ai来调整的,我认为这里不需要拘于形式,用一个合适的实现方法可以让代码更容易理解。

你可能感兴趣的:(随笔|AI设计之状态机)