1. 简介

在本文中,我们将学习状态机(State Machines)的基础知识及其在实际开发中的应用。

通过本文,你将掌握有限状态机的核心概念,了解其表示方式,并能将其用于建模实际系统的行为。

2. 状态机概述

有限状态机(Finite-State Machine, FSM)是自动机理论中的基础概念之一。它最初被设计用于描述一个系统的行为,这个行为依赖于一组有限的离散参数

我们通常在以下情况下使用 FSM:

  • 系统的行为定义清晰
  • 参数的数量有限且可控

FSM 的每一个参数配置称为一个“状态”:

$$ S = {p_1, p_2, p_3, ..., p_n} $$

由于每个参数 $ p_i $ 的取值是有限的,因此整个系统可能的状态数也是有限的。例如,如果每个参数是二进制的(0 或 1),则总共有 $ 2^n $ 个不同的状态。

比如当 $ n = 2 $ 时:

$$ \text{Total States} = 2^2 = 4 $$

1-1

3. 状态转移规则

我们可以用 $ S_{k,t} $ 表示状态机在时间 $ t $ 时的状态。随着时间推移,我们会发现状态的变化往往具有某种规律性。

例如,一个状态可能永远不变:

$$ S_{k,t+1} = S_{k,t} \quad \forall t \in \mathbb{N} $$

1-1

但更常见的是,状态会在某些规则下发生转换:

2-2

如上图所示,该状态机在两个状态之间交替变化。

如果我们能完整理解这些转换规律,就可以将其建模为一组规则,用来决定状态的更新方式。因此,状态机不仅包括状态参数,还包括状态转换规则

4. 状态机的表示方式

有限状态机可以根据是否与外部环境交互分为两类:

4.1 孤立系统(Moore Machine)

如果系统是孤立的,那么状态转换仅依赖于当前状态。例如:

$$ \begin{cases} S_1 \rightarrow S_2 \ S_2 \rightarrow S_1 \end{cases} $$

3-1

这种状态机称为 Moore 机,它不需要感知外部输入。

4.2 非孤立系统(Mealy Machine)

如果系统与外部环境交互,则状态转换由当前状态和输入共同决定。这种状态机称为 Mealy 机,典型例子是温控器(thermostat)。

温控器根据外部传感器读取的温度来改变自身状态:

4

5. 实际应用场景

我们日常使用的很多系统本质上都是状态机,只是我们不常这么称呼它们:

硬件设备:如个人电脑、智能手机、手持计算器
软件系统:如动画控制、游戏角色状态切换
文本处理:如正则表达式引擎内部使用状态机进行字符串匹配

5.1 游戏动画控制

游戏中的角色通常有多个动作状态(站立、行走、奔跑),这些状态之间的切换可以用 Mealy 机建模:

enum State {
    STANDING, WALKING, RUNNING
}

class GameCharacter {
    private State currentState;

    public void update(Input input) {
        switch (currentState) {
            case STANDING:
                if (input.isKeyPressed("LEFT") || input.isKeyPressed("RIGHT")) {
                    currentState = State.WALKING;
                }
                break;
            case WALKING:
                if (input.isKeyPressed("SHIFT")) {
                    currentState = State.RUNNING;
                }
                break;
            case RUNNING:
                if (!input.isKeyPressed("SHIFT")) {
                    currentState = State.WALKING;
                }
                break;
        }
    }
}

5.2 正则表达式引擎

正则表达式在编译阶段会被转换为有限状态机。它包含:

  • 一个字符集(alphabet)
  • 一组状态(包括初始状态)
  • 一组接受状态(accepting states)

例如,正则表达式 a*b 对应的状态机如下:

regex fsm

6. 总结

本文我们学习了有限状态机的基本组成、表示方式及其应用场景。状态机是一种非常实用的建模工具,广泛应用于:

  • 硬件设计
  • 游戏开发
  • 编译器与正则处理
  • 工作流引擎(如 Spring State Machine)

掌握状态机的概念与实现方式,有助于我们在设计系统逻辑时更加清晰、高效。


原始标题:State Machines: Components, Representations, Applications