状态机是一种在各行各业中应用非常广泛的概念。
它通过 “状态 + 事件 → 状态 + 动作” 的方式,清晰地描述了一个系统如何随着外部输入而发生状态转移,并在不同状态下执行特定的动作。
状态机模型结构明晰、逻辑严谨,使人能够一目了然地理解系统的整体流程和运行逻辑
状态机就像一张地图,让人在陌生的领域或流程 中拥有方位感
它告诉你 “我现在哪”、“能往哪走”、“走了之后会怎样”,不至于懵逼无措 和 盲目行动
状态机虽然无法穷尽一切,但它为我们在复杂现实中,提供了一把“结构化认知”的钥匙。
定义
有限状态机 FSM 定义为九元组:
FSM = <S, I , E,G, T, A,O, s₀, sf>,
也可简化,但至少是个四元组
FSM = <S,E,T,A>
| 符号 | 名称 | 内容 |
|---|---|---|
| S | 状态集 (States) | S = {s₁, s₂, ..., sₙ},是系统所有可能状态的集合。 可细分为: • 瞬时状态(PS):短暂存在的过渡状态(如脉冲信号) • 长期状态(TS):稳定存在的持续状态(如电平信号) 状态通常通过指示灯、屏幕、声音等方式被感知 |
| I | 输入集 (Inputs) | I = {i₁, i₂, ..., iₘ},系统接收的原始输入机制集合。 如:传感器信号、按钮操作、反馈电平、系统内部中断等。 |
| E | 事件集 (Events) | E = {E₁, E₂, ..., Eₘ},表示触发状态转移的语义事件集合。 通常由输入+状态等组合抽象而来的策略或 多个事件的组合,是状态转移的原因。 在本文中,事件被视为一种策略封装单元 事件是一个时刻,它描述的是某一瞬间的行为或变化 |
| G | 条件集 Guard | G = {g₁, g₂, ..., gt},是一个逻辑判断, 是由输入,状态,事件, 其他条件 组成的一个布尔表达式 用于描述在某个事件发生后,是否允许从当前状态转移到下一状态 |
| T | 转移集 (Transitions) | 无条件转移:T: S × E ↦ S × A ,是一个四元组 (s, e, s′, a) 或 有条件转移:T: S × E ×G ↦ S × A;,是一个五元组 (s, e, g, s′,a) 表示系统在状态 s 遇到事件 e 后,满足条件g, 转移到状态 s′,并执行动作 a。 转移集合 T = {T₁, T₂, ..., Tₖ} , 每个 Ti = (当前状态, 事件, 条件, 下一状态, 动作) ,通常表示系统的行为逻辑或决策规则 |
| A | 动作集 (Actions) | A = {A₁, A₂, ..., Aₚ},系统在状态转移时或状态维持期间所执行的动作策略集合。 例如:启动电机、开启电磁阀、启动蜂鸣器、关闭继电器等。 |
| O | 输出集 (Outputs) | O = {O₁, O₂, ..., Oₚ},系统实现动作的输出机制。 如:设置 GPIO 电平、发串口命令、输出 PWM 波形等。 |
| s₀ | 初始状态 (Start State) | s₀ ∈ S,是 FSM 开始执行时所处的初始状态。 |
| sf | 终止状态 (Final State) | sf ∈ S,是 FSM 执行结束时达到的终止状态。 |
常见误区
P1: 输入,事件,条件,状态, 动作, 输出 的划分 不是固定的,它们是建模角度的产物,可根据需要互换
P2: 状态机中,动作不是状态变化的原因,而是状态转移的结果。
若要“动作”改变状态,它必须先被转化为 “事件”参与状态判断。
P3: 时间是一种特殊的输入,常通过晶振和定时器 变成 超时、定时触发、周期节拍
等事件,用来推动状态变化。
P4: 输入输出是机制,事件动作是策略。
实际建模时,无需过度区分输入与事件、动作与输出,或 省略条件
合理的抽象能简化状态机设计,提高可读性。
- 输入输出 是状态机的底层机制,通常由外部环境或系统信号(如按钮、传感器电平等)构成;
- 事件 是状态转移或维持的条件,通常是“输入+状态”的语义封装,也可以是多个事件的组合;
- 动作 是状态转移或维持中,根据策略做出的具体操作,而动作需要通过输出机制来实现。
P5: 现实是复杂混沌的,状态机只是我们对系统行为进行建模的一种简化方式。
这种简化有助于理解和控制,但永远无法穷尽全部的真实行为。
状态机不是现实本身,而是我们用来认识、分析和设计现实的一种理性视角。
步骤
- 明确有哪些状态(S)
- 列出事件集 (E) ,条件集(G)
- 描述状态之间的转移(T)
- 给每个转移或状态配动作(A)
例子
人生状态机
| 符号 | 名称 | 内容 |
|---|---|---|
| S | 状态集 | {新生、童年、青少年、青年、中年、老年、终点} |
| E | 事件集 | {成长、人生大事(升学、就业、结婚)、衰老、意外事件} |
| T | 转移集 | (新生,成长,童年,学习) (中年,衰老,老年,退休) (任意状态,意外事件,终点,意外死亡) (老年,衰老,终点,正常死亡) |
| A | 动作集 | {学习、玩耍、奋斗、承担、陪伴、回忆、退休、死亡} |
| s₀ | 初始状态 | 新生 |
| sf | 终止状态 | 终点 |
洗衣机状态机
| 符号 | 含义 | 内容 | 说明 |
|---|---|---|---|
| S | 状态集 | {待机、加水、洗涤、排水、脱水、完成} | |
| I | 输入集 | - 水位传感器电平 - 定时器计数值达到设定值 - 按钮按下信号 | 来自环境或硬件的原始输入信号, 通常是低电平/高电平、边沿、计数到等。 原始机制,不含语义, 按钮这个机制可封装成双击,长按等 事件策略 |
| E | 事件集 | {启动、加水完成、洗涤完成、排水完成、脱水完成、取消} | 对输入和状态的语义抽象。例如: “按钮按下 3 秒”→ 长按事件 “水位 > 阈值”+“正在加水”→加水完成 |
| G | 条件集 | 水位传感器电平 >= 设定水位 电源稳定 | 洗衣机状态机的大多状态转移是无需条件的 事件发生后就直接转换状态了 |
| T | 转移集 | (待机,启动,加水,进水) (加水,加水完成,洗涤,搅拌) (洗涤,洗涤完成,排水,出水) (排水,排水完成,脱水,高速旋转) (脱水,脱水完成,完成 ,蜂鸣提示) (任意状态, 取消, 待机, 停止所有动作) | |
| A | 动作集 | {进水、搅拌、出水、高速旋转、蜂鸣提示、停止所有动作} | 抽象层面的策略意图, 系统要干什么, 不管具体怎么干 |
| O | 输出集 | - GPIO 控制电磁阀开关打开进水阀或出水阀 - 控制电机正反转信号 - 启动蜂鸣器 2 秒 - 关闭继电器 | 实现动作的机制 作用于硬件。是信号级别的控制 |
| s₀ | 初始状态 | 待机 | |
| sf | 终止状态 | 完成 |
刑事案件状态机
| 元素 | 含义 | 内容 |
|---|---|---|
| S | 状态集 | {案件未立、立案侦查、检察审查、提起公诉、法院审理、一审裁定、 上诉审理、终审裁定、案件结案} |
| E | 事件集 | {报警或举报、证据满足立案标准、检察移送、法院受理、 上诉申请、判决生效、撤诉、和解、裁定撤销} |
| T | 转移集 | 状态+输入 → 下一状态, 产生动作(详见下表) |
| A | 动作集 | {接警处理、立案、调查取证、批捕、移送起诉、提起公诉、开庭审理、 判决、上诉、执行、结案归档} |
| s₀ | 初始状态 | 案件未立 |
| sf | 终止状态 | 案件结案(终审判决或撤案、和解) |
状态转移表(T)
| 当前状态 S | 事件E | 下一状态 S′ | 动作 A |
|---|---|---|---|
| 案件未立 | 报警 / 举报 | 立案侦查 | 接警、初查 |
| 立案侦查 | 满足立案条件 | 立案侦查 | 正式立案、侦查取证 |
| 立案侦查 | 移送检察机关 | 检察审查 | 检察机关审查起诉 |
| 检察审查 | 批准逮捕 | 提起公诉 | 起诉书移交法院 |
| 提起公诉 | 法院受理 | 法院审理 | 排期开庭、审理准备 |
| 法院审理 | 判决 | 一审裁定 | 作出判决 |
| 一审裁定 | 被告不上诉 | 案件结案 | 判决生效,归档 |
| 一审裁定 | 提出上诉 | 上诉审理 | 二审法院复查 |
| 上诉审理 | 作出终审判决 | 终审裁定 | 判决定案 |
| 终审裁定 | 判决生效 | 案件结案 | 归档执行 |
| 任意状态 | 撤诉 / 裁定撤销 /和解 | 案件结案 | 结案、归档 |