基於有窮狀態機思想的電梯系統

CodeDancing發表於2020-12-18

介紹

這次設計的電梯系統是一次軟體工程的小組作業(這門課沒安排實驗,佛),我在這次小組作業中負責的是後端設計和演算法設計的部分,多虧了想出來了(不然只能CV了,其實我是這個系統的產品經理
專案上傳到了GitHub中,歡迎follow。

設計

設計思想

電梯系統要求採用有窮狀態轉換機的思想,在我看來就是:”電梯A的狀態 + 按下任意電梯按鈕 = 電梯A的下一狀態“,這種方程的體現。在這個表示式中,我們發現電梯的狀態改變是由不同電梯按鈕的按下狀態來影響的,簡單的說就是按鈕刺激電梯的狀態改變。那麼,我們就將電梯形象地設計為啟用按鈕的接收器,每部電梯可以接收任意數量的按鈕,並對之做出反應。
進而考慮到電梯接收啟用的按鈕,但是並不是按照先啟用先刺激電梯狀態改變的順序,所以我們設計了兩個優先佇列,分別是等待佇列和執行佇列。執行佇列中的按鈕會刺激電梯狀態改變,而等待佇列中的按鈕會按照電梯的需要加入到執行佇列中。具體的優先和排程邏輯在詳細設計中闡述。
最後考慮到多部電梯,啟用的按鈕具體分配到哪一步電梯,這裡也存在著一個分配策略。
上面的內容都來自於我的報告,我同學設計的介面可以很好的反應我們的設計思想:

簡單例項

程式設計

如下圖所示,一共設計了5個包和一個程式入口類:

簡單例項

其中,最核心的包是schedule包,有排程佇列類scheduleQueue,包含了兩個優先佇列和一些對優先佇列的處理和重新整理方法,還有一個排程執行緒類scheduling,考慮到可以設計多個電梯,所以每部電梯只需要繫結一個排程佇列並且開啟一個排程執行緒就可以正常工作了。
其他的,button是按鈕包,包含了電梯內部按鈕和電梯外部按鈕,電梯外部按鈕正表示向上,負表示向下;comparator是比較器包,優先佇列的比較器;elevator是電梯包,包含了一個核心的anElevator電梯類,用於例項化電梯物件和moveElevator類,表示電梯的移動列舉類;frame是介面包,這個由我同學設計。

除錯

程式設計的還是比較簡單的,不過設計出來的系統與人們的正常思維邏輯還是有區別,所以大部分時間都花在了Debug上,介面上的那幾個佇列的表格都是為了方便除錯而加上的(沒有這個不好除錯啊,所以兼職產品經理的我和前端室友開戰,逃!)。有兩個bug還是讓我印象深刻的:

修改執行佇列Comparator

問題例子電梯在1層不同,依次點選電梯外部5層向下和4層向下按鈕,電梯先到4層停頓然後在5層停止。正確的移動軌跡應該是先在5層停頓然後在4層停止,等待電梯內部按鈕被摁下。
解決方法修改執行佇列中的比較器,兩個電梯外部按鈕並且和但電梯當前所在層反向的時候,需要將原來的優先順序反向。如下圖所示:

簡單例項

修改重新整理執行佇列判斷時間

問題例子電梯在1層停止,依次點選7、6、5、8梯內部按鈕,電梯先到第7,然後依次是6、5層,最後停止在8層。
解決方法出現的這個問題的原因是因為當時設計的時候,僅僅支援在執行佇列執行完後,即執行佇列為空,才重新整理執行佇列,現在修改為電梯每移動一次就重新整理一次,提高重新整理的密度,保證儘量完成能順便完成的按鈕動作。

最後的話

非常歡迎大家修改和完善這個小系統吼,當然也非常期待我大家給我找出的Bug(那得看我又沒時間改Bug了)

人生此處,絕對樂觀

相關文章