状态机有哪些优点?

时间:2020-03-05 18:46:44  来源:igfitidea点击:

状态机最适合哪种编程问题?

我已经读过关于使用状态机实现的解析器的信息,但我想了解一下尖叫起来要作为状态机实现的问题。

解决方案

回答

状态协议(例如TCP)通常表示为状态机。但是,很少有人希望将任何东西实现为适合自己的状态机。通常,我们将使用1的损坏,即让它在处于一种状态时执行重复的操作,在过渡时记录数据,或者在保持一种状态时交换数据。

回答

工作流程(请参阅.net 3.0中的WF)

回答

它们有很多用途,解析器是一个显着的用途。我个人使用简化的状态机在应用程序中实现复杂的多步骤任务对话框。

回答

解析器示例。我最近写了一个解析器,该解析器从另一个程序获取二进制流。当前元素的含义表示下一个元素的大小/含义。可能有(少量)有限数量的元素。因此是一个状态机。

回答

它们非常适合建模会改变状态的事物,并且具有在每次转换时触发的逻辑。

例如,我将使用有限状态机来通过邮件跟踪软件包,或者在注册过程中跟踪用户的不同身份。

随着可能的状态值数量增加,转换数量激增。在这种情况下,状态机有很大帮助。

回答

我想到的是:

Robot/Machine manipulation... those robot arms in factories
  Simulation Games, (SimCity, Racing Game etc..)

通用化:当我们具有一串输入时,当它们与任何一个输入交互时,都需要了解先前的输入,换句话说,当处理任何单个输入时都需要了解先前的输入。 (也就是说,它需要具有"状态")

我所知道的并不能解决解析问题。

回答

游戏中的AI通常使用状态机来实现。
帮助创建易于构建和测试的离散逻辑。

回答

游戏中的对象通常表示为状态机。 AI字符可能是:

  • 守卫
  • 挑衅的
  • 巡逻
  • 睡着了

因此,我们可以看到这些模型可以模拟一些简单但有效的状态。当然,我们可能可以制作一个更复杂的连续系统。

另一个示例是诸如在Google Checkout上购买商品的过程。 Google会给出一些关于"财务和订单"的州,然后通知我们诸如信用卡清算或者被拒收之类的交易,并允许我们通知其已发货。

回答

复杂系统中的正则表达式匹配,解析,流控制。

正则表达式是状态机的一种简单形式,特别是有限自动机。尽管可以使用相互递归的功能来实现它们,但它们具有自然的表达方式。

如果实施得当,状态机将非常高效。

如果我们想使状态机具有可读性,则可以使用出色的状态机编译器来处理多种目标语言。

http://research.cs.queensu.ca/~thurston/ragel/

它还使我们可以避免可怕的" goto"。

回答

只是附带说明,我们可以使用正确的尾部调用来实现状态机,如我在尾部递归问题中所述。

在该示例中,游戏中的每个房间都被视为一个状态。

同样,带有VHDL(和其他逻辑综合语言)的硬件设计在各处都使用状态机来描述硬件。

回答

一个免费的状态机电子书是一个很好的资源。我自己的快速解答如下。

当逻辑必须包含有关上次运行时发生的情况的信息时,它必须包含状态。

因此,状态机仅仅是记住(或者作用于)信息的任何代码,这些信息只能通过了解以前发生的事情来获取。

例如,我有一个程序必须使用的蜂窝调制解调器。它必须按顺序执行以下步骤:

  • 重置调制解调器
  • 启动与调制解调器的通信
  • 等待信号强度指示与塔之间的连接良好
  • ...

现在,我可以阻塞主程序,只需按顺序执行所有这些步骤,等待每个步骤运行,但是我想给用户反馈并同时执行其他操作。因此,我将其实现为功能内部的状态机,并每秒运行此功能100次。

enum states{reset,initsend, initresponse, waitonsignal,dial,ppp,...}
modemfunction()
{
  static currentstate

  switch(currentstate)
  {
  case reset:
    Do reset
    if reset was successful, nextstate=init else nextstate = reset
    break
  case initsend
    send "ATD"
    nextstate = initresponse 
    break
  ...
  }
currentstate=nextstate
}

更复杂的状态机实现协议。例如,我使用的ECU诊断协议只能发送8个字节的数据包,但有时我需要发送更大的数据包。 ECU速度很慢,因此我需要等待响应。理想情况下,当我发送一条消息时,我使用一个函数,然后我不在乎会发生什么,但是我的程序必须在某个地方监视该行并发送并响应这些消息,将它们分解成较小的部分并将接收到的消息重新组合为最后的信息。

回答

如果我们需要一个简单的随机过程,则可以使用马尔可夫链,可以将其表示为状态机(考虑到当前状态,在下一步中,链将以一定概率处于状态X)。

回答

任何工作流程应用程序,尤其是异步活动。我们在工作流中有一个处于特定状态的项目,并且状态机知道如何通过将项目置于不同的状态来对外部事件做出反应,此时将发生其他活动。

回答

最简单的答案可能是它们实际上适合任何问题。不要忘记,计算机本身也是状态机。

无论如何,状态机通常用于存在某些输入流且在给定时刻需要完成的活动取决于该点上在该流中看到的最后元素的问题。

输入流的示例:一些文本文件(用于解析的情况),用于正则表达式的字符串,事件(例如游戏AI的"玩家进入房间"等)。

活动示例:准备读取一个数字(在计算器的解析器中输入中出现另一个数字后跟一个" +"之后),转身(在玩家接近然后打喷嚏之后),执行跳踢(在玩家之后向左,向左,向右,向上,向上按)。

回答

状态的概念对于应用程序"记住"系统的当前上下文并在收到新信息时做出正确反应非常有用。任何非平凡的应用程序都通过变量和条件将这种概念嵌入到代码中。

因此,如果应用程序由于所处的上下文而在每次收到新信息时必须做出不同的反应,则可以使用状态机对系统进行建模。一个示例是如何解释计算器上的键,这取决于我们当时正在处理的内容。

相反,如果计算不依赖于上下文而是仅依赖于输入(例如,一个函数将两个数相加),则我们将不需要状态机(或者更好的说,我们将拥有状态为零的状态机)

有些人使用状态机来设计整个应用程序,因为他们捕获了项目中要牢记的基本内容,然后使用一些过程或者自动编码器使它们可执行。以这种方式进行编程需要一些范例机会,但我发现它非常有效。