[Pyhton] SimPy 離散事件模擬框架詳解 —— 以一個簡單的汽車充電排隊模擬為例

目錄

  • 一、背景知識
  • 二、SimPy 講解
    • 2.1 SimPy 概述
    • 2.2 基本概念
    • 2.3 一個汽車開開停停的例子
    • 2.4 在走走停停過程中增加充電過程(過程交互)
    • 2.5 共享資源
  • 三、后續
  • 參考鏈接
  • 附錄二
一、背景知識人們在生產活動和社會活動中,經常遇到一類復雜的系統,這類系統中有許多事件時而出現,時而消失,時而動作 , 時而停止,而啟動和停止都發生在一些離散的時刻,并帶有一定的隨機性 。例如,港口中船舶的??看a頭、生產線上機床的啟停、電話的接通和斷開、計算機系統中某項作業的進行和退出 , 凡此種種,都帶有上述特點,這類系統叫做離散事件動態系統(DEDS) 。隨著生產和科技的日益發展,以及人類社會交往的日趨頻繁,這類系統的數量和種類也越來越多 。
設計此類系統時,往往需要仿真來評估算法或方案的性能,常見的軟件有:
商業軟件:
名字簡介圖示AnyLogic通用多方法建模工具 。結合了基于代理、系統動力學和離散事件建模 。Arena一種離散事件模擬程序 , 也允許對連續過程進行建模 。Care pathway simulator專門為服務行業(如醫療保?。┥杓頻睦肷⑹錄D獬絳?。Enterprise Dynamics一個模擬軟件平臺,用于模擬和分析幾乎任何制造、材料處理和物流挑戰 。ExtendSim通用仿真軟件包DELMIA3DEXPERIENCE 平臺的一部分FlexSim拖拖拉拉做離散事件模擬 , 3DGoldSim將動態離散事件模擬嵌入到 Monte Carlo 框架GPSS離散事件模擬語言 。供應商可以提供不同的實現Micro Saint Sharp通用離散事件建模工具,使用拖放界面和C#編程語言MS4 Modeling Environment基于離散事件和混合模型的通用DEVS方法的軟件環境Plant Simulation能夠模擬和優化生產系統和流程的軟件ProModel AutoCAD Edition在數字孿生Autodesk工具集(AutoCAD和Inventor)中快速構建空間精確的布局和過程仿真模型 。Simcad Pro實時變化 , 零代碼有界面,支持 VRSimEvents向MATLAB / Simulink環境添加離散事件仿真 。SIMUL8基于對象的仿真軟件VisualSim基于時序、功耗和功能的電子、嵌入式軟件和半導體的基于模型的系統架構探索WITNESS可在桌面和云端使用 VR 進行離散事件模擬開源軟件:
名字語言類型License簡介JaamSimJavaAppApasche 2.0JaamSim是一款自由開源的離散事件模擬軟件,包括拖放式用戶界面、交互式3D圖形、輸入和輸出處理以及模型開發工具和編輯器 。CPN ToolsBETAAppGPLv2用于分析所有類型應用中的物流/排隊模型的工具 。DESMO-JJavaLibApasche 2.0Java離散事件模擬框架,支持混合事件/過程模型,并提供2D和3D動畫 。FacsimileScalaLibLGPLv3離散事件模擬/仿真庫 。PowerDEVSC++AppAFL, GPLv2基于DEVS形式的混合系統建模和仿真集成工具 。Ptolemy IIJavaLibBSD支持面向角色設計實驗的軟件框架 。SIM.JSJavaScriptLibLGPLJS是一個完全用JavaScript編寫的通用離散事件模擬庫 。在瀏覽器中運行,支持基于GUI的建模工具 。SimPyPythonLibMITSimPy是基于標準Python的基于過程的離散事件模擬框架 。SimulaSimulaLanguage一種專門為模擬而設計的編程語言 。SystemCC++LibApache 2.0提供事件驅動模擬內核 。注:軟件示意圖見《附錄二》
二、SimPy 講解2.1 SimPy 概述1)SimPy 是 python 的離散事件模擬框架 。2)SimPy 中的流程由 Python 生成器函數定義 。例如,可以用于為客戶、車輛或代理等活動組件建模 。SimPy 還提供各種類型的共享資源來模擬容量有限的擁塞點(如服務器、結賬柜臺和隧道) 。3)模擬可以要多快有多快、實時、或者手動步進三種方式進行 。3)盡管理論上 SimPy 可以用于連續模擬,但它沒有任何功能來幫助您實現這一點 。另一方面,SimPy 對于具有固定步長的模擬來說是過火的 , 在這種情況下,您的流程不會相互交互或共享資源 。
模擬兩個時鐘在不同時間間隔滴答作響的簡短示例如下:
>>> import simpy>>>>>> def clock(env, name, tick):...while True:...print(name, env.now)...yield env.timeout(tick)...>>> env = simpy.Environment()>>> env.process(clock(env, 'fast', 0.5))<Process(clock) object at 0x...>>>> env.process(clock(env, 'slow', 1))<Process(clock) object at 0x...>>>> env.run(until=2)fast 0slow 0fast 0.5slow 1fast 1.0fast 1.52.2 基本概念1)SimPy 是一個離散事件仿真庫 ?;顒咏M件(如車輛、客戶或消息)的行為是用流程建模的 。所有進程都存在于一個環境中 。它們通過事件與環境和彼此交互 。2)流程由簡單的 Python generator 描述 。你可以將他們稱為過程函數或過程方法,取決于它是函數還是類的方法 。在其整個生命周期內,他們產生事件等待被觸發 。3)當一個過程產生一個事件時,該進程就會被掛起 。當事件發生時(我們說事件被觸發),SimPy 恢復該過程 。多個進程可以等待同一個事件 。SimPy 以它們產生該事件的相同順序恢復它們 。4)一個最重要的事件類型就是 Timeout 類事件 。它允許在進程給定的時間內休眠(或保持其他狀態) 。

推薦閱讀