设计复杂 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 就很容易处理了。