Algorithm 状态机适用于什么类型的问题?

Algorithm 状态机适用于什么类型的问题?,algorithm,state,Algorithm,State,状态机最适合哪种编程问题 我已经读过关于使用状态机实现解析器的内容,但想了解一些需要作为状态机实现的问题。有状态协议(如TCP)通常表示为状态机。然而,很少有人希望将任何东西实现为状态机本身。通常情况下,您会使用一个损坏,即,让它在处于一种状态时执行重复操作,在转换时记录数据,或在保持一种状态时交换数据。工作流(请参见.net 3.0中的WF)它们有许多用途,解析器是一个值得注意的用途。我个人使用简化的状态机在应用程序中实现复杂的多步骤任务对话框 一个解析器示例。我最近编写了一个解析器,它从另一

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


我已经读过关于使用状态机实现解析器的内容,但想了解一些需要作为状态机实现的问题。

有状态协议(如TCP)通常表示为状态机。然而,很少有人希望将任何东西实现为状态机本身。通常情况下,您会使用一个损坏,即,让它在处于一种状态时执行重复操作,在转换时记录数据,或在保持一种状态时交换数据。

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

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

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

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

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


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

想到的是:

  • 机器人/机器操作。。。工厂里的机器人手臂
  • 模拟游戏,(模拟城市,赛车游戏等)
泛化:当你有一个输入串,当你与其中任何一个进行交互时,需要了解以前的输入,或者换句话说,当处理任何单个输入时,需要了解以前的输入。(也就是说,它需要有“国家”)


据我所知,这并不是一个解析问题。

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

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

  • 守卫
  • 咄咄逼人
  • 巡逻
  • 熟睡的
所以你可以看到这些可能会模拟一些简单但有效的状态。当然,你可能会建立一个更复杂的连续系统


另一个例子是一个过程,比如在Google Checkout上进行购买。Google为金融和订单提供了许多状态,然后通知您信用卡清算或被拒绝等转移,并允许您通知它订单已发货。

在复杂系统中进行正则表达式匹配、解析和流控制

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

状态机如果实现得好,将非常高效

如果您想创建一个可读的状态机,那么对于许多目标语言都有一个优秀的状态机编译器


它还允许您避免可怕的“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)。

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

    最简单的答案可能是它们适用于几乎任何问题。别忘了计算机本身也是一台状态机

    不管怎样,状态机通常用于存在输入流的问题,并且在给定时刻需要完成的活动取决于在该时刻该流中看到的最后元素