Python 中的离散事件模拟
Dr Diogo Costa
Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific
现实问题中的事件发生会受多种情形影响。
最常见包括:
这些情形可转化为 SimPy 的离散事件模型。
示例
顾客到达服装店
def customer_arrivals(env, shop)
查找特定商品
env.timeout(search_time)
if shop.available[item]:
生成器:整合代码
def customer_arrivals(env, shop):while True: yield env.timeout(search_time)# 仅在有货时购买 if shop.available[item]: env.process(shop_buyer(env, item, num_items, shop))
某些事件可能因以下原因被中断:
方法
simpy_process_1.interrupt()
示例
机器周期性故障,打断生产线。
def break_machine(env):# 不时使机器故障。 while True: # 故障间隔时间 yield env.timeout(fail_time())# 机器故障:中断进程 simpy_process_1.interrupt()
capacity=5:simpy.Resource(env, capacity=5)
示例: 加油站的燃油储备需定期补充
with gas_station.request() as request:# 申请一个加油枪 yield request# 加油枪可用后:加油 liters_request = 10 yield fuel_reserve.get(liters_request) # "实际"加油需要时间 refuel_duration = liters_request / refuel_speedyield env.timeout(refuel_duration)
按位运算符
a & b、a >> b、a ^ b在 SimPy 中
SimPy 相关按位运算符
__and__() 或 &__or__() 或 |示例: 观众在售票队列中等待轮到自己,或影片售罄
with counter.request() as my_turn:# 等到轮到或电影售罄 result = yield my_turn | counter.sold_out[movie]# 若仍有票 if my_turn in result: theater.num_moviegoers[movie] += 1 return# 若售罄 if my_turn not in result: theater.num_renegers[movie] += 1 return
Python 中的离散事件模拟