SimPyパッケージ:リソースの種類

Pythonで学ぶ離散事象シミュレーション

Dr Diogo Costa

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

利用可能なリソースの種類

  • SimPyは3種類のリソースを提供:

  • resource

  • container
  • store
Pythonで学ぶ離散事象シミュレーション

利用可能なリソースの種類

simpy.Resource()

  • プロセス間でリソースを共有
  • 例:レストランのテーブル

simpy.Container()

  • プロセス間で均質な物質を共有するリソース
  • 離散的(リンゴなど)または連続的(水など)な量
  • 例:貯水池

simpy.Store()

  • 任意の数のオブジェクトを格納
  • 例:スーパーマーケット
Pythonで学ぶ離散事象シミュレーション

メソッド:simpy.Resource()

リソースの作成

resource_1 = simpy.Resource(env, capacity=8)
  • リソース容量が限られている場合に使用(例:capacity=8)
  • リソースに同時アクセスするプロセス数を制限
  • プロセスはリソースの使用権をリクエストする必要がある
    • すべてのリソースが使用中の場合、リクエストはキューに入る
  • プロセスがリソースを解放すると、待機中のリクエストが実行される

リソースのリクエスト

# Open resource request
with resource_1.request() as request:

# Make resource request yield request
# Once resource is avaiable 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)
...
time: 23.7 min | Customer 30 > Finished

シミュレーション:レジn台

  • simpy.Resource(env, capacity=2)
...
time: 13.2 min | Customer 30 > Finished
  • simpy.Resource(env, capacity=3)
...
time: 8.6 min | Customer 30 > Finished
  • simpy.Resource(env, capacity=4)
...
time: 8.6 min | Customer 30 > Finished
Pythonで学ぶ離散事象シミュレーション

練習しましょう!

Pythonで学ぶ離散事象シミュレーション

Preparing Video For Download...