SimPy 包:管理事件调度

Python 中的离散事件模拟

Dr Diogo Costa

Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific

管理事件发生

  • 现实问题中的事件发生会受多种情形影响。

  • 最常见包括:

    • 条件事件
    • 事件中断
    • 进程等待

这些情形可转化为 SimPy 的离散事件模型。

Python 中的离散事件模拟

条件事件

  • 某些事件依赖其他事件的发生
  • 仅在条件满足时触发

示例

  • 顾客到达服装店

    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))
Python 中的离散事件模拟

事件中断

某些事件可能因以下原因被中断:

  • 发生了更高优先级的事件
  • 主动中断(如:车辆充电)
  • 被动中断(如:机器故障)

方法

simpy_process_1.interrupt()

示例

机器周期性故障,打断生产线。

def break_machine(env):

# 不时使机器故障。 while True: # 故障间隔时间 yield env.timeout(fail_time())
# 机器故障:中断进程 simpy_process_1.interrupt()
Python 中的离散事件模拟

进程等待

  • 有些进程需等待其他进程完成
  • 常因资源有限
  • 例:共享资源 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_speed
yield env.timeout(refuel_duration)
Python 中的离散事件模拟

用按位运算符合并事件

按位运算符

  • 对整数进行按位计算
  • 需要两个操作数
    • 例:a & ba >> ba ^ b

在 SimPy 中

  • 生成条件事件
  • 介于两个事件之间

SimPy 相关按位运算符

  • 等待两个进程都完成:__and__()&
  • 等待任一进程完成:__or__()|
Python 中的离散事件模拟

用按位运算符合并事件

示例: 观众在售票队列中等待轮到自己,或影片售罄

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 中的离散事件模拟

Passons à la pratique !

Python 中的离散事件模拟

Preparing Video For Download...