设计复杂 FSM 的方法是什么?
What is an approach for designing complex FSMs?
在工作中,我们使用 FSM。最近,我不得不为一个我认为"a little too complex for a simple FSM"的问题设计一个FSM。为什么?因为该问题有大约 6 个不同的数据维度,并且此数据的许多排列会显着影响解决方案的行为。如果全部是布尔数据,我的大脑认为“6 个数据属性意味着该数据的 2^6 +1 个排列”。此外,在任何给定时间可能发生大约 8 个输入。
这个问题让我意识到我的 FSM 创建技能止于我的业余项目中使用的简单问题。在工作中,我们不得不使用 FSM。这意味着,我不能只说 "this problem is outside of the scope of FSMs. I'll use something else." 事实上,我们现有的 FSM 平台确实为我们的解决方案提供了强大的功能。
问题:当问题足够复杂时,设计 FSM 的方法是什么?我对此进行了一些研究,发现了一些论文,老实说,这些论文对我帮助不大。我希望对此有一些最佳实践,而我所要求的只是一个。请和谢谢。
我想您可能遇到了常见的 "state-transition explosion",这是传统 "flat" FSM 的已知问题。传统的 FSM "explode",因为它们会在许多状态下重复相同的反应。 FSM 缺乏任何机制来捕捉国家间行为的共性。众所周知的解决方案是使用 Hierarchical State Machines (a.k.a. Harel statecharts or UML state machines)。 HSM 支持 状态嵌套 的概念,其中子状态从周围的超状态继承行为。如果使用得当,状态嵌套会消除重复并抵消 "explosion" 问题。大多数重要问题用 FSM 都不太容易处理,但用 HSM 就很容易处理了。
在工作中,我们使用 FSM。最近,我不得不为一个我认为"a little too complex for a simple FSM"的问题设计一个FSM。为什么?因为该问题有大约 6 个不同的数据维度,并且此数据的许多排列会显着影响解决方案的行为。如果全部是布尔数据,我的大脑认为“6 个数据属性意味着该数据的 2^6 +1 个排列”。此外,在任何给定时间可能发生大约 8 个输入。
这个问题让我意识到我的 FSM 创建技能止于我的业余项目中使用的简单问题。在工作中,我们不得不使用 FSM。这意味着,我不能只说 "this problem is outside of the scope of FSMs. I'll use something else." 事实上,我们现有的 FSM 平台确实为我们的解决方案提供了强大的功能。
问题:当问题足够复杂时,设计 FSM 的方法是什么?我对此进行了一些研究,发现了一些论文,老实说,这些论文对我帮助不大。我希望对此有一些最佳实践,而我所要求的只是一个。请和谢谢。
我想您可能遇到了常见的 "state-transition explosion",这是传统 "flat" FSM 的已知问题。传统的 FSM "explode",因为它们会在许多状态下重复相同的反应。 FSM 缺乏任何机制来捕捉国家间行为的共性。众所周知的解决方案是使用 Hierarchical State Machines (a.k.a. Harel statecharts or UML state machines)。 HSM 支持 状态嵌套 的概念,其中子状态从周围的超状态继承行为。如果使用得当,状态嵌套会消除重复并抵消 "explosion" 问题。大多数重要问题用 FSM 都不太容易处理,但用 HSM 就很容易处理了。