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


介紹

這次設計的電梯系統是一次軟件工程的小組作業(這門課沒安排實驗,佛),我在這次小組作業中負責的是后端設計和算法設計的部分,多虧了想出來了(不然只能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了)

人生此處,絕對樂觀


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM