2009-08-24 108 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行動。 我想這限制了這個系統的整體能力。我沒有那麼有經驗,所以即時通訊嘗試了。任何關於這種方法的反饋都是有好處的。