66 lines
3.9 KiB
Markdown
66 lines
3.9 KiB
Markdown
|
---
|
|||
|
title: Finite State Machine
|
|||
|
localeTitle: 有限状态机
|
|||
|
---
|
|||
|
有限状态机(FSM)是一种软件设计模式,其中给定模型通过外部输入转换到其他行为状态。
|
|||
|
|
|||
|
## 有限状态机
|
|||
|
|
|||
|
FSM由其**状态** , **初始状态**和**转换定义** 。
|
|||
|
|
|||
|
FSM的力量来自于在不同条件下明确定义不同_行为_的能力。通常,FSM与循环行为脚本一起使用,该脚本不断地评估循环或事件中的当前情况。
|
|||
|
|
|||
|
为了帮助形成如何应用这一点的图像,将使用咖啡机作为有限状态机的示例。我们还将介绍状态图以可视化FSM并提供编码示例。
|
|||
|
|
|||
|
### 状态图
|
|||
|
|
|||
|
![咖啡机有限状态机图](https://raw.githubusercontent.com/arunma/blogimages/master/AkkaFSM/CoffeeMachineFSM.png) 该图显示了咖啡机的三种可能状态:
|
|||
|
|
|||
|
* 打开
|
|||
|
* ReadyToBuy
|
|||
|
* 已关闭的
|
|||
|
|
|||
|
这些状态之间的线显示了状态之间和哪个方向可能的转换。这些转换具有FSM何时需要在状态之间切换的条件。
|
|||
|
|
|||
|
* StartUpMachine 从PoweredOff状态到Open状态,机器必须启动。在这种情况下,这是手动完成的。
|
|||
|
|
|||
|
* 存款> =咖啡费用 FSM在一个循环或金额变化时评估存入的现金金额(在这种情况下推荐) 如果您将足够的现金存入咖啡机,FSM将从“打开”变为“ReadyToBuy”。
|
|||
|
|
|||
|
* ShutdownMachine 如果满足“不再有咖啡”的条件,机器将通过ShutDownMachine方法自动从Open到PoweredOff。
|
|||
|
|
|||
|
* DispenseCoffee 在ReadyToBuy状态下,用户可以购买咖啡,然后将其冲泡和分配。条件是BuyCoffee事件(!链接到观察者模式!)触发。 (未在图中显示)
|
|||
|
|
|||
|
* CancelCoffee 如果用户选择取消,则机器将从ReadyToBuy转到Open。
|
|||
|
|
|||
|
* ShutDownMachine 机器将进入PoweredOff状态
|
|||
|
|
|||
|
|
|||
|
### 状态
|
|||
|
|
|||
|
在每个状态中都有定义的行为,只有在对象处于该状态时才会执行。例如,在PoweredOff期间,咖啡机在打开电源之前不会冲泡咖啡,在打开状态期间它将等待,直到插入足够的现金,直到给出断电命令,或者直到咖啡用完为止。在此打开状态期间,它可以执行诸如清洁之类的例程,这在其他状态下不会发生。
|
|||
|
|
|||
|
### 初始状态
|
|||
|
|
|||
|
每个FSM都有一个初始状态,这意味着它在创建时开始的状态,并且必须在构造或实例化时定义。当然,如果满足条件,可以直接改变状态。
|
|||
|
|
|||
|
### 转变
|
|||
|
|
|||
|
每个州要么经常评估它是否应该转换到另一个州,要么根据触发事件转换到另一个州。
|
|||
|
|
|||
|
## DFA和NFA
|
|||
|
|
|||
|
有限自动机有两种类型,确定性(DFA)和非确定性(NFA)。它们都接受常规语言并且以与上述相同的方式或多或少地操作,但是存在一些差异。
|
|||
|
|
|||
|
DFA接受或拒绝一串符号,并且仅为每个输入字符串生成一个唯一计算或自动机。 _确定性_是指计算的唯一性。 如果有限状态机遵循以下规则,则称为DFA:
|
|||
|
|
|||
|
1. 其每个转换由其源状态和输入符号_唯一_确定
|
|||
|
2. 每次状态转换都需要读取输入符号。
|
|||
|
|
|||
|
NFA不需要遵守这些限制,这意味着每个DFA也是NFA。 由于它们都只识别常规语言,因此可以使用powerset构造算法将每个NFA转换为等效的DFA。
|
|||
|
|
|||
|
那么我们期望在NFA中找到哪种规则而不是DFA?
|
|||
|
|
|||
|
1. NFA可以具有_空字符串_转换(通常用epsilon表示)。意味着当处于转换规则的epsilon的某个状态时,机器可以转换到下一个状态而不读取输入符号
|
|||
|
2. 在NFA中,每对状态和转换符号可以具有多个目标状态,而不是DFA中的对的唯一目标
|
|||
|
3. 每对状态和转换符号为其可能的每个目标生成计算的“分支”,从而创建某种多线程系统。
|
|||
|
4. 如果输入字符串落在接受状态以外的任何状态,则DFA将拒绝输入字符串。在NFA中,我们只需要一个“分支”来接受接受状态以接受字符串。
|