2009-08-24 789 views
5

您可以阅读this question,在那里我会询问机器应用程序的最佳体系结构以获得一些小故事,但对于帮助解决这个问题并非完全必要。有限状态机应该具有“嵌套”有限状态机吗?

我对Finite State Machine的理解(特别是对于实现)有点年轻,可能缺乏一点,但我将这个应用作为一个实现,并且我有一个需要有一个地方嵌套FSM。基本上这台机器有几个高级状态(Cold [刚刚启动],Homing In,安装,准备运行,运行,报告,重置),但是当机器运行时,需要有一些FSM实施(加载镜头,定位边缘,测量楔形,测量圆度并完成[可能还有更多内容])。

我的问题是这样的:我应该建立一个状态可以有一个子状态列表并且系统可以输入这些子状态并且这些子状态可以返回到父状态的“嵌套状态”的能力吗?还是应该在运行状态中放置一个FSM实现,​​并将它们保存为两个不同的FSM?或者你认为我在做什么或想到什么愚蠢的事情,应该重新考虑一下吗?

想法,建议,批评和建议都是受欢迎的。

+0

嵌套状态很好,IMO。你确定你的意思是归巢而不是珩磨? – Beth 2009-08-24 20:01:04

+0

是的,归巢。就像找到家的位置。 – 2009-08-24 20:18:07

回答

6

嵌套状态机是UML中的标准概念,所以这不一定是愚蠢的。 More details here

3

相反。有可能嵌套FSM是件好事。

我们不应该嵌套FSM来进行嵌套,但有时FSM变得相当大。拥有这么大的绘图会破坏FSM模型的目的,因为它不能让你对内部工作有很好的看法。它变成了一个巨大的图表,其中有很多细节。

我想你可以将它与类进行比较。如果你把所有东西都放在一个类中(更糟糕的是,把所有东西都变成静态的),上课的目的和优点就会消失。

FSM也是如此。

举一个例子,我的一个大学生对使用FSM的狗的行为有相当“现实”的模型。他有一个巨大的模型,通过嵌套FSM,我能够在短短几分钟内了解模型。

所以这绝对是一件好事,如果使用得当的话。

3

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

在实际的分层FSM中,事件首先被发布到当前的嵌套状态。如果该状态不处理它们,它们将被张贴到父母状态,依此类推。这允许将“重构”从嵌套状态到父状态的常见状态转换。

0

我通过枚举表示状态来解决这个问题。例如 兔子有一个生殖状态。

ProcreationState有一个枚举

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

在状态更新方法,我只是检查什么说明其在与acordingly行动。 我想这限制了这个系统的整体能力。我没有那么有经验,所以即时通讯尝试了。任何关于这种方法的反馈都是有好处的。