状态机

有限状态机

好久不见. 提交于 2020-01-27 12:13:30
一、基本概念 英语:Finite-state machine简称FSM,又称有限状态自动机,简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型 二、概念术语: 状态:存储过去的信息,就是说:它反映从系统开始到现在时刻的输入变化 转移:指示状态变更,并且用“满足确使转移发生的条件”来描述它 动作:在给定时刻要进行的活动的描述 a、进入动作:在进入状态时进行 b、退出动作:在退出状态时进行 c、输入动作:依赖于当前状态和输入条件进行 d、转移动作:在进行特定转移时进行 状态转移表 当前状态 → 条件 ↓ 状态 A 状态 B 状态 C 条件 X … … … 条件 Y … 状态C … 条件 Z … … … 三、作用 状态寄存器:记录有限状态机的内部状态 有限状态机是组合逻辑和寄存器逻辑的一种组合: 寄存器逻辑:存储有限状态机的内部状态 组合逻辑: a、次态逻辑:确定有限状态机的下一个状态 b、输出逻辑:确定有限状态机的输出 四、编程: state:状态存储关于过去的信息,它反映从系统开始到现在时刻的输入变化 action & transition 动作是在给定时刻要进行的活动描述 转换是指状态变更 guards:检测器出现的原因是为了检测是否满足从一个状态切换到另一个状态 event:对系统重要的某件事情 1、被产生(被接受,等待被处理,一般放入时间队列) 2

状态机工作流,顺序工作流和Flowchart

孤人 提交于 2020-01-27 08:02:00
目录 什么是工作流 顺序工作流 状态机工作流 Flowchart 总结 什么是工作流 工作流可以说是对业务处理过程的建模,当我们设计工作流的时候,我们首先要分析业务处理过程中要经历的步骤。然后,我们就可以利用WF创建工作流模型来模拟业务的处理过程。 工作流包含两种类型的工作流:顺序工作流和状态机工作流。 顺序工作流 提供了一系列有组织的步骤,一般情况下,步骤是逐一执行的。可能有的步骤需要等待某些事件的发生才可以继续执行,但通常情况下顺序工作流一般用于无需人工干预的操作。 使用顺序建模风格来构建的工作流非常易于理解和创作。它们可以用来模拟简单到难度适中的过程。由于程序性活动相当于编程语言中的程序性语句,你就可以使用这种类型的工作流来模拟几乎所有类型的过程。顺序工作流还很适合模拟简单的并且没有人类交互的过程(比如服务)。 状态机工作流 提供了一系列的状态。工作流从初始状态开始,到终止状态结束。两个状态之间定义行为进行过渡。通常情况下,状态机工作流对事件作出反应,事件的发生将会使状态发生改变。 Flowchart Flowchart是一种众所周知的、能够直观地表示业务过程的图表。业务分析师、架构师和开发人员经常使用Flowchart作为他们表达过程定义和逻辑流的共同语言。 WF 3.x发布以来,客户向微软反馈了许多他们所喜欢的和不喜欢的。这些来自使用WF 3.x客户的反馈中,有一个共同点

BTs in Robotics学习笔记(二)行为树是如何概括和联系早期的思想的

橙三吉。 提交于 2020-01-27 07:13:13
有限状态机 有限状态机是计算最基本的数学模型之一,由一组状态、过渡和事件组成。 有限状态机的缺点: 可维护性低:添加或删除状态需要重新评估大量的变化和FSM的内部状态。 可伸缩性低:FSMs具有许多状态和许多状态之间的转换,对于人和计算机来说都很难修改。 可重用性低:状态之间的转换可能依赖于内部变量,在多个项目中重用相同的子FSM是不现实的。 层次化状态机 层次化状态机 (HFSMs),也称为状态图。在HFSM中,一个状态可以包含一个或多个子状态,其中包含两个或多个状态的状态称为超状态。在HFSM中,广义跃迁是超态之间的转换,通过连接两个超状态来减少转换的数量,而不需要连接大量的子状态。每个超状态都有一个子状态标识为启动状态,每当发生超状态转换时就会执行。 举例说明:定点射击 (优点)层次化状态机增加了模块性(可以在子任务中分离任务),同时支持行为继承(行为继承允许子状态从超状态继承行为)。 (缺点)层次化状态机具有较低的可维护性,同时需要手动创建层次结构。 在HFSMs中,层次结构中的每一层都需要显式地添加,而在BTs中,每一个子树都可以看作是它自己的模块,具有与原子操作相同的接口。 FSM可以转换为BTs。假设FSM中有一个状态和三个转换(对应于这三个返回语句,)添加一个Tick源来收集返回转换并将执行转换回状态。 包容架构 包容体系结构的基本思想是让多个控制器并行运行

如何快速发现软件的bug

冷暖自知 提交于 2020-01-24 18:53:27
公司开发与测试工作的现状 开发基本不自测,甚至没有自测的环境,特别是涉及多个系统的对接。 提测后很多基本的功能都不能正常使用。 项目管理比较混乱,但是最终的发布日期又被项目经理定死,所以测试时间常常被压缩。 没有对于开发人员的质量方面的考核。   这就造成版本提测后测试人员需要快速展开测试,尽可能多的发现bug,众所周知一些高等级的bug发现的越早后期研发的维护成本越低,所以如何在短的时间内快速复现一些严重级别的bug至关重要。 以下从个人的测试经验和测试流程上说一下个人 的想法。 测试坚持的原则 测试前做好工作计划   俗话说不打无准备的仗,测试前做好工作计划,首先明白该版本如何开展测试,这个版本的测试重点在哪里,这个前期可以加强跟研发的沟通,弄明白测试的重点。然后根据重点规划测试工作。 尽早开展测试   版本提测后尽早展开测试工作,一方面缺陷越早的暴露后期研发的维护成本越低,另一方面根据自己的测试经验来看一个测试周期中发现bug的曲线图是一个不对称的抛物线,前期的工作效率是非常高的,这可能跟测试人员的求知欲有关,测试周期越长后期发现bug的概率越低,所以版本提测后尽快展开测试如果没有高优先级的任务不要中断测试,不然反过头来在进行测试时已找不到了当时灵敏的嗅觉了。 二八原则   软件中80%的bug存在于20%的代码中,这要求测试人员对产品的业务及内部逻辑比较了解

Godot动画系统:动画状态机-添加动画节点(AnimationNode)

余生长醉 提交于 2020-01-23 20:57:18
上文 《Godot动画系统:动画状态机-AnimationTree(AnimationNodeStateMachine模式)基本设置与界面》 介绍了 AnimationTree 的基本设置和界面,下面介绍一下如何为状态机添加动画节点和动画过渡 首先看一下 AnimationPlayer 节点,如上文所述, AnimationPlayer 节点是动画片段的容器,本文是以3D场景为例,其动画都是在 Blender等三维软件中制作的,所以当模型导入进来,Godot就已经将各个动画片段解析并存储到 AnimationPlayer 里了 在 AnimationPlayer 中我们要对需要循环的动画标记成 循环 在 AnimationTree 中添加动画节点 选择 AnimationTree 添加动画节点 常用操作 在 选择模式 下用右键添加 在 添加动画节点模式 下用作键添加 Delete 删除选定节点 双击已添加的节点可以为其改名 左键拖动可以移动节点 中键拖动可以移动画布 弹出列表中的动画就对应着模型的动画片段 一个动画片段可以有多个节点副本 根据游戏的动画设计把所需的动画节点都添加到状态机画布上,并调整它们位置和名称 来源: CSDN 作者: 开发游戏的老王 链接: https://blog.csdn.net/hello_tute/article/details/104027717

设计模式 ->状态机模式

梦想与她 提交于 2020-01-22 03:38:04
边工作边学习,最近做语音模块,老大安排了任务去做语音唤醒实现。自己啪啪啪傻不垃圾的就用最简单的粗鄙方法实现了,老大看了看之后说,可以用状态机模式做的试试,然后就在老大的带领下,学习了状态机颇有收获。 一、什么是状态模式。 官方解释:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类 自己理解:就是外界调用类A对象的某个方法时,当这个方法改变了某种状态,然后就会在这个方法里面切换到对应的状态B类中。 二、看代码理解 2.1 所有状态需要一个管理类。 wakeupEngineManager wakeupEngineManager { public: wakeupEngineManager() : mCurrentStatus(std::make_shared<IdleStatus>(this)) { } bool changeToNotWakeupStates( ){ if ( nullptr != mCurrentStatus) { mCurrentStatus -> changeToNotWakeupStates(); } } bool changeToWakeuped() { if ( nullptr != mCurrentStatus) { mCurrentStatus -> changeToWakeuped(); } } bool changeToIdle

MOSS多级审批工作流【StateMachine版】v1.1

試著忘記壹切 提交于 2020-01-22 00:15:34
去年我发布过一个 MOSS多级审批工作流,采用顺序工作流模式开发 ; 后来又做了一些改进,用ConditionedActivityGroupActivity取代了繁复的WhileActivity+IfElseActivity嵌套,但仍然是顺序工作流 。 在第二篇文章的末尾我曾写道:“审批这样的流程并不适合用顺序工作流来实现,用WF的另外一种工作流-状态机工作流会更好”,为什么这样说呢? 我们已经知道,顺序工作流的执行过程是一个连续的步骤,从开始到结束,虽然我们可以利用While这样的循环活动让工作流看起来往回去执行了几步,但是这样的后果就是一张难以理解的流程图和复杂的执行逻辑。 真实世界的工作流程是灵活的,往往不是一条线走到底的,中间可能包含这许多决策,每个决策都可能让流程走向另外一个方向。所以包含人类参与的工作流其实是一个决策推动的流程,把它抽象到工作流中,就成了“事件驱动工作流”,也就是状态机工作流(StateMachine Workflow)。 状态机工作流由一系列状态(State)组成,每个状态中又可以包含一系列事件的处理程序。状态机工作流总是停留在一个状态中,等待必要的事件被触发,然后跳转到新的状态。 那么现在再来看看这个多级审批工作流的原始流程图: 下面是用状态机实现后的流程图: 你会发现,状态机工作流的流程图和我们最初的流程图相当接近,无论是流程块还是之间的连线

浅析PCIe链路LTSSM状态机

╄→尐↘猪︶ㄣ 提交于 2020-01-18 11:30:36
版权声明:本文为CSDN博主「古猫先生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 https://blog.csdn.net/zhuzongpeng/article/details/78995340 我们知道,在PCIe链路可以正常工作之前,需要对PCIe链路进行链路训练,在这个过程中,就会用LTSSM状态机。LTSSM全称是Link Training and Status State Machine。这个状态机在哪里呢?它就在PCIe总线的物理层之中。 LTSSM状态机涵盖了11个状态,包括Detect, Polling, Configuration, Recovery, L0, L0s, L1, L2, Hot Reset, Loopback, Disable。这11个状态之间转换的逻辑,如下图, 这11个状态大致可以分为4大类: (1) PCIe链路训练相关。正常的PCIe链路训练状态转换流程依次是,Detect->Polling->Configuration->L0. L0是PCIe链路可以正常工作的电源状态。 (2) PCIe链路重新训练相关。这个状态也称为Recovery。Recovery是一个非常重要的链路状态,进入这个状态的因素也很多,比如电源状态的变化,PCIe链路速率的变化等。 (3) 电源状态相关

关于TCP的状态机

折月煮酒 提交于 2020-01-18 05:24:23
http://www.2cto.com/net/201111/112030.html 另外: 客户端与服务器端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口 状态为TIME_WAIT 是不是所有执行主动关闭的socket都会进入TIME_WAIT状态呢? 有没有什么情况使主动关闭的socket直接进入CLOSED状态呢? 主动关闭的一方在发送最后一个 ack 后 就会进入 TIME_WAIT 状态 停留2MSL(max segment lifetime)时间 这个是TCP/IP必不可少的,也就是“解决”不了的。 也就是TCP/IP设计者本来是这么设计的 主要有两个原因 1。防止上一次连接中的包,迷路后重新出现,影响新连接 (经过2MSL,上一次连接中所有的重复包都会消失) 2。可靠的关闭TCP连接 在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发 fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以 主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。 TIME_WAIT 并不会占用很大资源的,除非受到攻击。 还有,如果一方 send 或 recv 超时,就会直接进入 CLOSED 状态 来源: https://www.cnblogs.com/shalk/archive/2012/10