良许Linux教程网 干货合集 什么是状态机?一篇文章就够了

什么是状态机?一篇文章就够了

image-20240504205340861
image-20240504205340861

 

问渠哪得清如许?为有源头活水来。—— 南宋·朱熹

1 简介

状态机[1]通常指的是有限状态机(英文:finite-state machine,简称:FSM)或是有限状态自动机(英文:finite-state automaton,简称:FSA),它是一个定义了有限数量的状态以及在这些状态之间转换和活动的数学模型。有限状态机属于自动机和计算理论中研究的自动机类型之一。如所展示的图表,有限状态机被归类为自动机理论的一个部分,通过自动机领域的层次结构图可以观察到,层次越高,概念越为复杂。

image-20240504205344225
image-20240504205344225

状态机中有几个术语:state(状态)transition(转移)action(动作)transition condition(转移条件)

  • state(状态) :将一个系统离散化,可以得到很多种状态,当然这些状态是有限的。例如:门禁闸机可以划分为开启状态、关闭状态;电扇可以划分为关、一档、二档、三档等状态。
  • transition(转移) :一个状态接收一个输入执行了某些动作到达了另外一个状态的过程就是一个transition(转移)。定义transition(转移)就是在定义状态机的转移流程。
  • transition condition(转移条件) :也叫做Event(事件),在某一状态下,只有达到了transition condition(转移条件),才会按照状态机的转移流程转移到下一状态,并执行相应的动作。
  • action(动作)**:在状态机的运转过程中会有很多种动作。如:**进入动作(entry action)[在进入状态时进行]、退出动作(exit action)[在退出状态时进行]、转移动作[在进行特定转移时进行]。

如下图,就定义了一个只有openedclosed两种状态的状态机。当系统处于opened状态,在收到输入“关闭事件”,达到了状态机转移条件,系统就转移到了closed状态,并执行相应的动作,此例有一个进入动作(entry action)**,进入**closed状态,会执行close door动作。

image-20240504205352090
image-20240504205352090

有限状态机在很多不同领域被广泛应用,包括电子工程、语言学、计算机科学、哲学、生物学、数学和逻辑学。在计算机科学中,有限状态机被广泛用于建模硬件电路系统设计软件工程编译器网络协议、和计算与语言的研究。

image-20240504205355033
image-20240504205355033

在现代社会中,可以在日常的很多装置中看到状态机这种行为。例如,门禁闸机,只有被闸机接受的刷卡行为,闸机才会将关闭状态变为开启状态;自动售卖机,只有投入合适的硬币,售卖机才会吐出相应的产品;密码箱,只有输入正确的密码序列,密码箱才会变为开启状态。

2 分类

有限状态机可以被分为不同的类型,主要可以被分为:**acceptors(接收器)*、*transducers(转换器) 两大类。

2.1 acceptors(接收器)

acceptors(接收器) 是指产生一个二值的输出,指示接收的输入是否能被接受。acceptors(接收器)的每一种状态都是接受或不接受的。如果一组所有的输入都被接受并且当前的状态是接受状态,那么这一组输入就是可接受的。有限状态机的acceptors(接收器)这一类在正则引擎的实现中用得非常多。

如下图是一种acceptors(接收器) 类型有限状态机,用来识别所输入的字符串是否为nice,其总共被划分为了七种状态,其中只有第七种状态Success被认为是可接受状态。如果所输入的字串不是nice,则会被转移到第六种状态Error

image-20240504205357732
image-20240504205357732

如下给出acceptors(接收器) 的数学形式化定义,acceptors(接收器) 型有限状态机是一个五元组,其中:

  • 是输入字符集合(有限的非空符号集合);
  • 是有限非空状态集合;
  • 是初始状态,属于中的元素;
  • 是状态转移函数::;
  • 是最终状态集合,是的子集。

2.2 transducers(转换器)

transducers(转换器) 是根据当前的状态和(或)给定的输入产生输出,输出的同时可能也伴随着状态的转移(不是必须)。在一些事件驱动型应用和计算语言学(computational linguistics)领域应用普遍。transducers(转换器) 型有限状态机可以分为两种子类型,**moore machine (摩尔型有限状态机)*和*mealy machine (米利型有限状态机) ,其中:

  • 若输出只和状态有关而与输入无关,则称为moore状态机
  • 输出不仅和状态有关而且和输入有关系,则称为mealy状态机

2.2.1 moore状态机:

如下所示的状态机为moore状态机,其有、、、四个状态,,,三个输入,、、三个输出。可以看出其四个状态、、、对应的输出分别为、、、,就是说输出已经和状态绑定好,不管输入为哪一个,均不影响输出。其中为初始状态,假设输入为,可以看出输出为;假设输入为,则输出为,可以看出,虽然输出只和状态有关而与输入无关,但改变输入的序列顺序,输出序列也会改变。

image-20240504205400735
image-20240504205400735

2.2.2 mealy状态机:

mealy状态机与输出只依赖于机器当前状态的moore状态机不同,它的输出与当前状态和输入都有关。但是对于每个mealy状态机都有一个等价的moore机。如下所示为一个简单的mealy状态机,它有一个输入和一个输出。在每一个有向边上,标注出了输入(红色)和输出(蓝色)。这个状态机的初始状态为,当输入为0,输出0,状态变为,接着输入0,输出0,状态还是为,在此状态下一直输入0,输出会一直是0,当输入为1时,输出才为1,状态变为,在此状态再接着输入1,输出一直还是0,直到遇到输入为0,输出才变为1。此状态机其实实现了一个边缘触发检测器,每次输入从1到0或是从1到0发生跳变时,输出为1否则输出为0。如下所示时序图,当输入为0111001110时,输出为0100101001

image-20240504205403598
image-20240504205403598
image-20240504205406086
image-20240504205406086

如下给出transducers(转换器) 的数学形式化定义,transducers(转换器) 型有限状态机是一个六元组,其中:

  • 是输入字符集合(有限的非空符号集合);
  • 是输出字符集合(有限的非空符号集合);
  • 是有限非空状态集合;
  • 是初始状态,属于中的元素;
  • 是状态转移函数::;
  • 是输出函数。

如果输出函数依赖于状态和输入(),则定义的是mealy状态机;如果输出函数仅仅依赖于状态(),那么定义的是moore状态机。如果,有限状态机没有输出函数这一项,那么可以称作transition system(转移系统) 。很多应用程序用到的有限状态机并没有输出序列,仅仅用到了状态机的转移过程和动作,其实可以称为转移系统。

3 应用

以日常生活中最常见的电风扇为例,来讨论状态机的应用问题。如下图所示,电风扇有4个按钮,分别是关、弱档、中档和强档,关按钮负责关闭电风扇,也就是停止电风扇的转动;而弱档、中档和强档都可以让电风扇开启,其各档所对应的风扇转动的速度不一样。

image-20240504205409410
image-20240504205409410

可以将按下四个按钮所对应的效果定义四种状态,分别为关机弱风中风强风,另外,外加一个故障状态,总共五种状态。如下为电风扇的状态图转移图,其可能的输入事件为 [按下“关”]*、*[按下“弱]*、*[按下“中”]*、*[按下“强”]*、*[出现异常]**。在状态转移的过程中,肯定有动作的执行,如从**关机弱风的过程中,肯定会执行开启电机的动作;从弱风强风的过程,肯定也会有执行加大电流的动作。整个过程中用不到状态机的输出,所以算是一个转移系统。

image-20240504205412556
image-20240504205412556

回到编程领域,GUI应用程序、Web应用程序等事件驱动型的应用程序,采用状态机的思路来完成程序设计,可以简化设计流程,使程序的可读性、可维护性都得到增加。

4 总结

有限状态机可以分为acceptors(接收器)*、*transducers(转换器) 两大类。acceptors(接收器)** 型有限状态机是一个五元组,transducers(转换器) 型有限状态机是一个六元组。transducers(转换器) 型有限状态机可以分为两种子类型,moore machine(摩尔型有限状态机)**和**mealy machine(米利型有限状态机)**。若输出只和状态有关而与输入无关,则称为**moore状态机,若输出不仅和状态有关而且和输入有关系,则称为mealy状态机

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部