美文网首页
随笔|AI设计之状态机

随笔|AI设计之状态机

作者: bakaqian | 来源:发表于2017-01-03 00:37 被阅读352次

    有限状态机


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

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

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

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

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

    随便偷个图

    分层状态机


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

    大概是这个样子的,额:

    分层状态机

    另外,这篇文章里的分层自动机的划分方法我觉的很有趣,推荐一下: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设计之状态机

          本文链接:https://www.haomeiwen.com/subject/xidgvttx.html