[Pyhton] SimPy 离散事件模拟框架详解 —— 以一个简单的汽车充电排队模拟为例

目录

  • 一、背景知识
  • 二、SimPy 讲解
    • 2.1 SimPy 概述
    • 2.2 基本概念
    • 2.3 一个汽车开开停停的例子
    • 2.4 在走走停停过程中增加充电过程(过程交互)
    • 2.5 共享资源
  • 三、后续
  • 参考链接
  • 附录二
一、背景知识人们在生产活动和社会活动中,经常遇到一类复杂的系统,这类系统中有许多事件时而出现,时而消失,时而动作 , 时而停止,而启动和停止都发生在一些离散的时刻,并带有一定的随机性 。例如,港口中船舶的停靠码头、生产线上机床的启停、电话的接通和断开、计算机系统中某项作业的进行和退出 , 凡此种种,都带有上述特点,这类系统叫做离散事件动态系统(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 是一个离散事件仿真库 。活动组件(如车辆、客户或消息)的行为是用流程建模的 。所有进程都存在于一个环境中 。它们通过事件与环境和彼此交互 。2)流程由简单的 Python generator 描述 。你可以将他们称为过程函数或过程方法,取决于它是函数还是类的方法 。在其整个生命周期内,他们产生事件等待被触发 。3)当一个过程产生一个事件时,该进程就会被挂起 。当事件发生时(我们说事件被触发),SimPy 恢复该过程 。多个进程可以等待同一个事件 。SimPy 以它们产生该事件的相同顺序恢复它们 。4)一个最重要的事件类型就是 Timeout 类事件 。它允许在进程给定的时间内休眠(或保持其他状态) 。

推荐阅读