9

您可以阅读这个问题,我在其中询问有关机器应用程序的最佳架构的小背景故事,尽管这对于帮助我解决这个问题并不是完全必要的。

我对有限状态机的理解(尤其是实现)有点年轻,可能还有些欠缺,但我正在将这个应用程序作为一个应用程序来实现,而且我有一个地方需要嵌套 FSM。基本上机器有一些高级状态(冷[又名刚开始],归位,设置,准备运行,运行,报告,重置)但是当机器运行时,它需要有它自己的小 FSM 实现(加载镜头、定位边缘、测量楔形、测量圆度和完整 [可能还有更多内容])。

我的问题是:我是否应该建立具有“嵌套状态”的能力,其中状态可以具有子状态列表并且系统可以进入这些子状态并且这些子状态可以返回到父状态?或者我应该将 FSM 实现放在 Running 状态中,并将它们保持为两个不同的 FSM?还是您认为我在做或在想一些愚蠢的事情,应该重新考虑?

欢迎大家提出想法、建议、批评和建议。

4

4 回答 4

10

嵌套状态机是 UML 中的标准概念,因此这不一定是愚蠢的。更多细节在这里

于 2009-08-24T20:00:01.980 回答
4

相对的。有可能嵌套 FSM 是一件好事。

不应该仅仅为了嵌套而嵌套 FSM,但有时 FSM 会变得非常大。拥有如此大的图纸会破坏 FSM 模型的目的,因为它不能让您很好地了解内部工作。它变成了一个包含许多细节的巨大图表。

我认为您可以将其与课程进行比较。如果你把所有东西都放在一个类中(更糟糕的是,把所有东西都变成静态的),那么拥有一个类的目的和优势就会消失。

FSM 也是如此。

举个例子,我的一个大学生使用 FSM 对狗的行为进行了非常“现实”的建模。他有一个巨大的模型,并且通过嵌套的 FSM,我能够在几分钟内理解该模型。

因此,如果使用得当,这绝对是一件好事。

于 2009-08-24T20:13:46.133 回答
3

我只想补充一点,嵌套状态(在 UML FSM 中)与将单独的 FSM “放入”运行状态不同。

在真正的分层 FSM 中,事件首先发布到当前的嵌套状态。如果该状态不处理它们,它们将被发布到父状态,依此类推。这允许人们“重构”从嵌套状态到父状态的公共状态转换。

于 2011-01-20T11:38:22.003 回答
0

我通过一个代表国家状态的枚举来解决这个问题。例如兔子有一个生育状态。

ProcreationState 有一个枚举

   enum State
{
    SettinNewSearchPosition,
    SearchingForFriend, 
    MovingTowardsFriend,
    EstablishingFriendship,
    Mating
}

在状态更新方法中,我只是检查它的状态并相应地采取行动。我想这限制了这个系统的整体能力。我没有那么有经验,所以我试试这个。对此方法的任何反馈都将受到赞赏。

于 2017-04-20T14:04:11.680 回答