SimPy 包:资源类型

Python 中的离散事件模拟

Dr Diogo Costa

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

可用的资源类型

  • SimPy 提供三类资源:

  • resource

  • container
  • store
Python 中的离散事件模拟

可用的资源类型

simpy.Resource()

  • 在进程间共享资源
  • 例:餐厅的餐桌

simpy.Container()

  • 在进程间共享同质物料的资源
  • 数量可为离散(如苹果)或连续(如水)
  • 例:水库

simpy.Store()

  • 存放可能无限量的对象
  • 例:超市
Python 中的离散事件模拟

方法:simpy.Resource()

创建资源

resource_1 = simpy.Resource(env, capacity=8)
  • 适用于容量有限的资源(如 capacity=8
  • 用于限制并发访问资源的进程数
  • 进程需请求资源的使用权
    • 若资源已满,请求将排队
  • 当进程释放资源时,挂起请求将被触发

请求资源

# 打开资源请求
with resource_1.request() as request:

# 发起资源请求 yield request
# 资源可用后 yield env.timeout(event_duration)
Python 中的离散事件模拟

资源:优先级与抢占

  • 前述资源的变体

    resource_1 = simpy.PreemptiveResource(
    env, capacity=1)
    
  • 某些进程可优先于其他进程

  • 示例:维修工

    • 优先级 1:修理故障机器
    • 优先级 2 或更低:日常维护
  • 用法类似 simpy.Resource() DNT_CURLY_TAG_7

  • 以最高优先级请求资源

    with resource_1.request(priority=1) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
  • 以较低优先级请求资源

    with resource_1.request(priority=2) as 
    request:
    
    yield request
    yield env.timeout(process_duration)
    
Python 中的离散事件模拟

方法:simpy.Container()

  • 适用于建模同质、不可区分的大宗物料的生产/消耗

  • 可为连续(如水)或离散(如苹果)

示例: 加油站的汽油储量

  • 车辆消耗储量,油罐车补充
  • 创建容器
    tank_1 = simpy.Container(
    env, tank_size, init=tank_size)
    
  • 向容器/油罐添加或移除

    yield tank_1.put(add_quantity)
    yield tank_1.get(remove_quantity)
    
  • 获取当前油罐余量

    tank_1.level
    
  • 获取油罐总容量

    tank_1.capacity
    
Python 中的离散事件模拟

方法:simpy.Store()

  • 创建存储

    store_1 = simpy.Store(
    env, capacity=2)
    
  • 类似 simpy.Container(),但可存放不同对象

  • 而非容器中较抽象的"数量"

  • 向存储添加或移除
yield store_1.put("item_1")
yield store_1.get()
  • 获取可用项目列表

    store_1.items
    
  • 获取存储容量

    store_1.capacity
    
Python 中的离散事件模拟

SimPy 资源如何辅助业务决策?

示例

  • 1 名收银员的超市
  • 店主想评估是否值得增配收银员
  • 更多收银员会降低等候时间吗?

现状:1 名收银员

  • simpy.Resource(env, capacity=1)
...
时间: 23.7 分 | 顾客 30 > 完成

模拟情景:n 名收银员

  • simpy.Resource(env, capacity=2)
...
时间: 13.2 分 | 顾客 30 > 完成
  • simpy.Resource(env, capacity=3)
...
时间: 8.6 分 | 顾客 30 > 完成
  • simpy.Resource(env, capacity=4)
...
时间: 8.6 分 | 顾客 30 > 完成
Python 中的离散事件模拟

让我们来练习!

Python 中的离散事件模拟

Preparing Video For Download...