Finite automata 什么是有限状态自动机?程序员为什么要知道它们?

Finite automata 什么是有限状态自动机?程序员为什么要知道它们?,finite-automata,Finite Automata,呃,问题是怎么说的。这是我一直听说的事情,但我还没有时间去调查 (更新)我可以查一下定义。。。但为什么不(正如@erikson所指出的)深入了解你的真实经历和轶事呢。社区维基将帮助人们投票选出最有见解的答案。到目前为止读得很有趣,谢谢 是的!你可以查一下 简而言之,这是一种可以用来表示具有具体状态的系统的技术(与量子状态/概率分布相反) 引述: 有限状态机(FSM)或有限状态机 状态自动机(复数:自动机)或 简单地说,状态机就是 由有限数组成的行为 状态之间的转换 国家、政策和行动。有限状态

呃,问题是怎么说的。这是我一直听说的事情,但我还没有时间去调查



(更新)我可以查一下定义。。。但为什么不(正如@erikson所指出的)深入了解你的真实经历和轶事呢。社区维基将帮助人们投票选出最有见解的答案。到目前为止读得很有趣,谢谢

是的!你可以查一下


简而言之,这是一种可以用来表示具有具体状态的系统的技术(与量子状态/概率分布相反)

引述:

有限状态机(FSM)或有限状态机 状态自动机(复数:自动机)或 简单地说,状态机就是 由有限数组成的行为 状态之间的转换 国家、政策和行动。有限状态 机器是机器的抽象模型 具有基本内部结构的机器 记忆

那么,这对你意味着什么?简单地说,它是表示您所关心的系统从开始状态到结束状态的路径的有效方法。使用正则表达式作为一个相当容易理解的示例,让我们看看AB+C模式(假设那个加号是上标)。我希望这种模式能够接受诸如“ABC”、“ABBC”、“ABBC”等字符串。在开始时,C的结尾是B的中间数(大于或等于1)。 如果你想一想,用一幅图片来思考这个问题几乎更容易。用文本假装它(我的括号是一个回环弧),你可以看到a(在左边)是开始状态,C(在右边)是结束状态

      _
     ( ) 
A --> B --> C
从FSAs开始,您可以继续您的计算复杂性之旅,前往地球


但是,您也可以使用状态机来表示真实的行为和系统。在我的世界里,我们使用它们来模拟实际工作人员的特定工作流,这些人员使用的组件极不容忍状态顺序中的错误。例如,“A最好在C之前出现,否则会有一个非常严重的问题。现在就不可能了。”

每个程序员都应该知道它们,因为它们是解决某些类型问题的优秀工具,通常的“迭代思考”方法会产生令人讨厌的复杂代码

一个典型的例子是游戏AI,NPC有不同的状态,根据玩家所在的位置而变化,比如:

  • NPC_状态_空闲
  • NPC_状态_警戒(100米以下玩家)
  • NPC状态(玩家攻击NPC)
  • NPC_州_逃离(健康状况不佳)
FSM可以很容易地描述转换,并帮助对FSM所描述的系统执行复杂的推理。

您可以查找它,但究竟是什么。直观地说,有限状态自动机是具有有限数量状态和规则的事物的抽象,通过这些规则,可以从一个状态切换到另一个状态。一种状态是可以做出正确或错误陈述的东西,而规则是一种从一种状态改变到另一种状态的方式。比如说,你可以有两种状态:“我在家”和“我在工作”以及两条规则,“上班”和“回家”

事实证明,你可以从数学的角度来观察这样的机器,发现它们可以做和不能做的事情。正则表达式基本上是一种描述有限状态机的方法,其中状态是一组不同的字符串,规则根据下一个读取的字符从一个状态移动到另一个状态。你可以证明这一点。但您也可以证明,没有任何有限状态机可以判断表达式中的括号是否匹配(通过for FSAs)

您应该了解FSA的原因是,它们可以用于解决许多问题:字符串匹配、系统控制、业务流程描述、数字电路设计。它们天生也很漂亮


形式上,FSA是代数结构F=〈∑,S,s0,F,δ〉 其中,∑是输入字母表,S是一组状态,s0∈ S是一个特定的开始状态,F⊆ S是一组接受态,δ:S×∑→ S是状态转换函数。

其他网站(如Wikipedia)更好地回答它,因为已经有了相当广泛的答案

为什么您应该了解它们:因为您可能已经实现了它们

任何时候,当您的代码具有有限数量的可能状态(即“有限状态”部分)并在某个输入/事件发生后切换到另一个状态(即“机器”部分)时,您已经编写了有限状态机


这是一个非常常用的工具,了解这方面的理论基础,能够对此进行推理,并知道如何将两个FSM组合成一个执行相同工作的FSM,这将是一个很大的帮助。

无论何时在完成操作之前必须释放线程,都需要状态机

由于web服务通常不是全状态的,所以在web服务中通常看不到这一点——您需要重新排列URL,使每个URL对应于代码中的单个路径

我想另一种思考方式可能是,每个web服务器都是一个FSM,状态信息保存在URL中

在处理输入时,您经常会看到它。你必须在输入完成之前释放你的线程,所以你设置了一个标记“input in progress”或者类似的东西。完成后,将标志设置为“等待输入”。那面旗子是你的状态监视器

通常情况下,FSM是作为一个开关语句来实现的,该语句在变量上进行开关操作。每种情况都是不同的状态。在案例结束时,可以将状态设置为新值。你几乎肯定在什么地方见过

FSM的好处在于,您可以将状态作为数据的一部分,而不是代码的一部分。