iT邦幫忙

0

淺談『模擬』(Simulation) 【2】-- 視覺化

  • 分享至 

  • xImage
  •  

前言

上一篇使用幾個簡單的例子說明『模擬』的基本概念與SimPy基本用法,這一次我們仿效『大巨蛋緊急疏散模擬動畫』,實作戲院售票流程的模擬動畫。

https://ithelp.ithome.com.tw/upload/images/20221212/20001976ZbHZNp4ldT.jpg
圖一. 戲院入場流程

記錄模擬結果

首先改寫上一篇的01_03_theater.py程式,將模擬結果寫入 log,內容含4個欄位:

  1. 時間(Time Step):代表事件完成的時間,而非事件開始的時間,例如購票(purchase_ticket)是指購票完成的時間。
  2. 觀眾代碼:自動產生的序號。
  3. 事件:包含到場(arrival)、購票完成(purchase_ticket)、驗票完成且至小吃部(check_ticket_store_in)、驗票完成直接就坐(check_ticket_wo_food)、離開小吃部(store_out)。
  4. 處理時間:特定觀眾在個別事件的完成的時間。

程式邏輯與01_03_theater.py大致相同,不另作解釋,可參閱上一篇說明,執行方式如下:

python 01_04_theater_with_log.py
  1. 執行後會產生log檔案:record.log。
  2. 另外,售票口個數、驗票口個數、小吃部銷售員人數設定會記錄在config.ini檔案,以方便多個程式共用。

產生動畫

接著根據record.log產生動畫,我採用PyGame套件,程式開發並沒有想像中的簡單,花了一天一夜才搞定,執行結果如下:
https://ithelp.ithome.com.tw/upload/images/20221211/20001976n0vv71bPSh.jpg

點選這裡可以看到完整動畫,也可以直接執行程式,指令如下:

python 01_05_gui.py
  1. 執行後會看到實際的模擬動畫。
  2. 同時會每隔10時間單位,儲存一張截圖。
  3. 之後執行程式產生動畫檔案animated.gif。
python make_gif.py

偵錯與調校

由於程式邏輯複雜,而且有點凌亂,先不作說明,等未來整理出較完整的架構後,再作詳細說明,有興趣的讀者可以在文末找到原始程式碼。這裡僅針對偵錯及調校特別說明:

  1. 要調慢動畫撥放速度,可修改第26行。
play_speed = 60  # 60 frames per second
  1. 只播放一個觀眾的動畫,藉以檢查動畫是否正確,可修改01_04_theater_with_log.py 第87~96行。
    # 初始人數:1人
    for moviegoer in range(1):
        env.process(go_to_movies(env, moviegoer, theater))

    # 模擬
    # while True:
        # yield env.timeout(arrival_interval)  # 每隔0.2分鐘有一觀眾到場

        # moviegoer += 1
        # env.process(go_to_movies(env, moviegoer, theater))

重新執行01_04_theater_with_log.py,產生record.log。

  1. 也可以修改config.ini檔案的設定,調整資源(resoources),重新執行01_04_theater_with_log.py、01_05_gui.py,觀看改善效果,以目前設定而言,小吃部會是戲院的瓶頸,可增加人力,以解決瓶頸。

小結

  1. 視覺化可讓使用者身歷其境,有較深的感受,能從動畫中觀察出瓶頸,從而進行what-if分析,改善系統效能,如果只是呈現一些冰冷的統計數字,是很難讓客戶買單的,雖然需要花費很多心力,應該還是值得的。
  2. 目前的動畫非常粗糙,程式架構也缺乏通用性,未來希望能結合3D動畫軟體,呈現更好的使用者體驗(UX)。

之後將繼續探討Simpy更多的功能及應用,也希望有機會能實作專案,以印證所學,本篇的程式碼放在GitHub,讀者可自行下載。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言