收藏 分享(赏)

有限状态机.ppt

上传人:HR专家 文档编号:6522914 上传时间:2019-04-15 格式:PPT 页数:28 大小:418KB
下载 相关 举报
有限状态机.ppt_第1页
第1页 / 共28页
有限状态机.ppt_第2页
第2页 / 共28页
有限状态机.ppt_第3页
第3页 / 共28页
有限状态机.ppt_第4页
第4页 / 共28页
有限状态机.ppt_第5页
第5页 / 共28页
点击查看更多>>
资源描述

1、第五讲 有限状态机,2019/4/15,通信软件设计,第2页,1. 有限状态机的基本概念 2. 有限状态机编程方法,主要内容,2019/4/15,通信软件设计,第3页,状态机的引入,状态机理论最初的发展在数字电路设计领域。 在数字电路方面,根据输出是否与输入信号有关,状态机可以划分为Mealy型和Moore型状态机。 Moore型状态机的输出只和当前状态有关,和输入无关。 Mealy型状态机的输入是由当前状态和输入共同决定。 而在软件设计领域,状态机的理论俨然已经自成一体,它经常用来描述一些复杂的算法,表明一些算法的内部的结构和流程,更多的关注于程序对象的执行顺序。,2019/4/15,通信软

2、件设计,第4页,静态顺序结构动态结构,2019/4/15,通信软件设计,第5页,有限状态机,有限自动机(Finite Automata Machine)是计算机科学的重要基石,它在软件开发领域内通常被称作有限状态机(Finite State Machine),是一种应用非常广泛的软件设计模式。 有限状态机的作用主要是描述对象在它的生命周期内所经历的状态序列,以及如何响应来自外界的各种事件。 在现实中,有许多事情可以用有限个状态来表达,如: 红绿灯、电话机等等。 其实,在资讯领域中,很多事情都是由有限的状态所组成,再由于不同的输入而衍生出各个状态。,2019/4/15,通信软件设计,第6页,有限

3、状态机,有限状态机FSM思想广泛应用于硬件控制电路设计,也是软件上常用的一种处理方法(软件上称为FMM-有限消息机)。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件,变连续处理为离散数字处理,符合计算机的工作特点。 同时,因为有限状态机具有有限个状态,所以可以在实际的工程上实现。但这并不意味着其只能进行有限次的处理,相反,有限状态机是闭环系统,有限无穷,可以用有限的状态,处理无穷的事务。,2019/4/15,通信软件设计,第7页,有限状态机例1,红绿灯红绿灯运作的原理相当简单,从一开始绿灯,经过一段时间后,将变为黄灯, 再隔一会儿,就会变成红灯,如此不断反覆。 其FSM如下。,2

4、019/4/15,通信软件设计,第8页,有限状态机例2,自动贩售机假设有简单的一自动贩卖机贩售两类商品,一类售价20元,另一类售价50元。 如果该贩卖机只能辨识10元及50元硬币。 一开始机器处于Hello的状态,当投入10元时,机器会进入余额不足的状态,直到投入的金额大于20元为止。 如果一次投入50元,则可以选择所有的产品,否则就只能选择20元的产品。 完成选择后,将会卖出商品并且找回剩余的零钱,随后,机器又将返回初始的状态。 其FSM如下。,2019/4/15,通信软件设计,第9页,基本概念,在描述有限状态机时,常会碰到的几个基本概念: 状态(State) 指的是对象在其生命周期中的一种

5、状况,处于某个特定状态中的对象必然会满足某些条件、执行某些动作或者是等待某些事件。 事件(Event) 指的是在时间和空间上占有一定位置,并且对状态机来讲是有意义的那些事情。事件通常会引起状态的变迁,促使状态机从一种状态切换到另一种状态。 转换(Transition) 指的是两个状态之间的一种关系,表明对象将在第一个状态中执行一定的动作,并将在某个事件发生同时某个特定条件满足时进入第二个状态。 动作(Action) 指的是状态机中可以执行的那些原子操作,所谓原子操作指的是它们在运行的过程中不能被其他消息所中断,必须一直执行下去。,2019/4/15,通信软件设计,第10页,有限状态机模型,通信

6、协议建模 基本出发点:认为通信协议主要是由响应多个“事件”的相对简单的处理过程组成。 状态转移图优点:简单明了,比较精确。 缺点:对许多复杂的协议,事件数和状态数会剧增,处理困难。,2019/4/15,通信软件设计,第11页,为什么使用有限状态机,在面向对象的软件系统中,一个对象无论多么简单或者多么复杂,都必然会经历一个从开始创建到最终消亡的完整过程,这通常被称为对象的生命周期。 对象在其生命期内是不可能完全孤立的,它必须通过发送消息来影响其它对象,或者通过接受消息来改变自身。,2019/4/15,通信软件设计,第12页,为什么使用有限状态机,在银行客户管理系统中,客户类(Customer)的

7、实例在需要的时候,可能会调用帐户(Account)类中定义的getBalance()方法。在这种简单的情况下,类Customer并不需要一个有限状态机来描述自己的行为,主要原因在于它当前的行为并不依赖于过去的某个状态。 并不是所有情况都会如此简单,事实上许多实用的软件系统都必须维护一两个非常关键的对象,它们通常具有非常复杂的状态转换关系,而且需要对来自外部的各种事件进行响应。 例如,在VoIP电话系统(找状态图)中,电话类(Telephone)的实例必须能够响应来自对方的随机呼叫,来自用户的按键事件,以及来自网络的信令等。在处理这些消息时,类Telephone所要采取的行为完全依赖于它当前所处

8、的状态,此时使用状态机将是一个不错的选择。,2019/4/15,通信软件设计,第13页,为什么使用有限状态机,游戏引擎是有限状态机最为成功的应用领域之一,由于设计良好的状态机能够被用来取代部分的人工智能算法,因此游戏中的每个角色或者器件都有可能内嵌一个状态机。 考虑RPG( Role-playing Game)游戏中城门这样一个简单的对象,它具有打开(Opened)、关闭(Closed)、上锁(Locked)、解锁(Unlocked)四种状态。当玩家到达一个处于状态Locked的门时,如果此时他已经找到了用来开门的钥匙,那么他就可以利用它将门的当前状态转变为Unlocked,进一步还可以通过旋

9、转门上的把手将其状态转变为Opened,从而成功进入城内。,2019/4/15,通信软件设计,第14页,控制城门的状态机,2019/4/15,通信软件设计,第15页,1. 有限状态机的基本概念 2. 有限状态机编程方法,主要内容,2019/4/15,通信软件设计,第16页,确定的有限状态机,一个DFA M是一个五元组,记作 M = (S, , f, S0, Z),其中 1) S = 状态i,S是一个有限集,其中的每一个元素称为一个状态 2) = 输入字符i,是一个有穷字母表,它的每一个元素称为一个输入字符 3) f : S S,f 是转换函数,表示某状态接受某个输入字符所到达的状态,如:f(p

10、,a) = q,p,qS,a 4) S0 S, S0是S中的元素,是唯一的一个初态 5) ZS,且 Z ,Z是S的一个子集,是一个终态集,或叫结束集,2019/4/15,通信软件设计,第17页,确定的有限状态机,左侧的状态图,在数学上称作DFA,其形式化定义为:,M=(S, , f, S0, Z),其中,S = 0 , 1 , 2 , 3 = a , b , c , d S0 = 0 Z = 3,f:,2019/4/15,通信软件设计,第18页,手工编写状态机,与其他常用的设计模式有所不同,程序员想要在自己的软件系统中加入状态机时,必须再额外编写一部分用于逻辑控制的代码,如果系统足够复杂的话,

11、这部分代码实现和维护起来还是相当困难的。 在实现有限状态机时,使用switch语句是最简单也是最直接的一种方式,其基本思路是为状态机中的每一种状态都设置一个case分支,专门用于对该状态进行控制。 学习doorFSM工程,如何编程实现有限状态机。,2019/4/15,通信软件设计,第19页,手工编写状态机,在很长一段时期内,使用switch语句一直是实现有限状态机的唯一方法,甚至像编译器这样复杂的软件系统,大部分也都直接采用这种实现方式。但之后随着状态机应用的逐渐深入,构造出来的状态机越来越复杂,这种方法也开始面临各种严峻的考验。如果状态机中的状态非常多,或者状态之间的转换关系异常复杂,那么简

12、单地使用switch语句构造出来的状态机将是不可维护的。,2019/4/15,通信软件设计,第20页,doorFSM程序实例,(1)新建一个Win32 Console Application的简单应用程序,并利用ClassWiard建立doorFSM类,用doorFSM实现状态机。 (2)编写doorFSM.h头文件 (3)编写doorFSM.cpp源程序添加状态、事件、转化函数等 (4)添加测试程序Test.cpp,2019/4/15,通信软件设计,第21页,DoorFSM类,class DoorFSM public:enum Event Lock, Unlock, Open, Close;

13、 / Events protected:void enterOpened(); void enterLocked(); void enterUnlocked(); void enterClosed(); public:enum States Closed, Unlocked, Locked, Opened; / statesStates doorState; public:DoorFSM() doorState = Opened; / Constructorvirtual DoorFSM() / DestructorStates currentState() return doorState;

14、 / Get current FSM state, returns current FSM statevoid processEvent( Event e ); / perform eventstatic const char* eventName( Event e ); / Get symbolic name of an eventstatic const char* stateName( States s );/ Get symbolic name of a state ;,2019/4/15,通信软件设计,第22页,doorFSM.cpp实现文件,void DoorFSM:process

15、Event( Event e ) States yOld = doorState;bool pass = false;switch( yOld ) /transitions case Closed:if( e = Open ) /outcome actionsdoorState = Opened;pass = true;else if( e = Lock ) /outcome actionsdoorState = Locked;pass = true;break;,case Unlocked:if( e = Lock )/outcome actionsdoorState = Locked;pa

16、ss = true;else if( e = Open ) /outcome actionsdoorState = Opened;pass = true;break;case Locked:if( e = Unlock ) /outcome actionsdoorState = Unlocked;pass = true;break;,2019/4/15,通信软件设计,第23页,自动生成状态机,为实用的软件系统编写状态机并不是一件十分轻松的事情,特别是当状态机本身比较复杂的时候尤其如此。人们开始尝试开发一些工具来自动生成有限状态机的框架代码,而在Linux下就有一个挺不错的选择FSME(Fini

17、te State Machine Editor)。 FSME是一个基于Qt的有限状态机工具,它能够让用户通过图形化的方式来对程序中所需要的状态机进行建模,并且还能够自动生成用C+或者Python实现的状态机框架代码。,2019/4/15,通信软件设计,第24页,可视化的FSME,2019/4/15,通信软件设计,第25页,状态机建模,首先运行fsme命令来启动状态机编辑器,然后单击工具栏上“ “New“按钮来创建一个新的状态机。FSME中用于构建状态机的基本元素一共有五种:事件(Event)、输入(Input)、输出(Output)、状态(State)和转换(Transition),在界面左边

18、的树形列表中可以找到其中的四种。,2019/4/15,通信软件设计,第26页,小结,在面向对象的软件系统中,有些对象具有非常复杂的生命周期模型,使用有限状态机是描述这类对象最好的方法。 作为一种软件设计模式,有限状态机的概念虽然不算复杂,实现起来也并不困难,但它的问题是当状态机的模型复杂到一定的程度之后,会带来实现和维护上的困难。 FSME是一个可视化的有限状态机建模工具,而且支持状态机框架代码的自动生成,借助它可以更加轻松地构建基于有限状态机的应用系统。,2019/4/15,通信软件设计,第27页,练习:,2019/4/15,通信软件设计,第28页,实验要求,上机内容 编写一个成绩转换函数,要求:1) 用户输入分数,程序自动转化成相应的等级。2) 分数90,等级为优90分数80,等级为良80分数70,等级为中70分数60,等级为及格60分数,等级为不及格 思考题 举例说明有限状态机在生活中的应用,并画出其状态图。,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报