Python 中的离散事件模拟
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific

基于标准 Python 的离散事件仿真框架(以进程为基础)
使用生成器函数定义进程和事件(在工具箱先修课中介绍)
可扩展性:
普通函数
def mygenerator():
return 10
return 返回一个值并终止函数执行执行函数:
10
生成器函数
def mygenerator():
yield 20
yield 12
yield 返回一个值并暂停执行,同时保留内部状态执行生成器:
20
12
1) 创建 SimPy 环境
env = simpy.Environment()
2) 将生成器函数加入 SimPy 环境
env.process()
3) 运行模型
env.run()
4) 在仿真中让时间流逝
env.timeout()
5) 获取当前仿真时间
env.now
1) 导入 SimPy 包
import simpy
2) 创建包含进程的生成器函数
def traffic_light(env, name, timestep):
while True:
yield env.timeout(timestep)
print(f"Time {env.now:02d} sec | Traffic light at {name} | Red light!")
yield env.timeout(timestep)
print(f"Time {env.now:02d} sec | Traffic light at {name} | Yellow Light!")
yield env.timeout(timestep)
print(f"Time {env.now:02d} sec | Traffic light at {name} | Green Light!")
3) 创建 SimPy 仿真环境
env = simpy.Environment()
4) 将生成器加入 SimPy 环境
env.process(traffic_light(env, "Leslie St.", 15))
env.process(traffic_light(env, "Arlington Av.", 30))
5) 运行模型
env.run(until=90)
控制台输出:
Time 15 sec | Traffic light at Leslie St. | Red light!
Time 30 sec | Traffic light at Arlington Av. | Red light!
Time 30 sec | Traffic light at Leslie St. | Yellow Light!
Time 45 sec | Traffic light at Leslie St. | Green Light!
Time 60 sec | Traffic light at Arlington Av. | Yellow Light!
Time 60 sec | Traffic light at Leslie St. | Red light!
Time 75 sec | Traffic light at Leslie St. | Yellow Light!
Python 中的离散事件模拟