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で学ぶ離散事象シミュレーション

イベントの中断

一部のイベントは次で中断されることがある:

  • より高優先度のイベント
  • 自主的な中断(例:EV 充電)
  • 強制的な中断(例:機械故障)

メソッド

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:

# ポンプを1基要求 yield request
# 空きが出たら給油 liters_request = 10 yield fuel_reserve.get(liters_request) # 実際の給油には時間がかかる refuel_duration = liters_request / refuel_speed
yield env.timeout(refuel_duration)
Pythonで学ぶ離散事象シミュレーション

ビット演算子でイベントを連結する

ビット演算子

  • 整数に対してビット演算を実行
  • オペランドは2つ
    • 例: a & b, a >> b, a ^ b

SimPy での利用

  • 条件イベントを生成
  • 2つのイベント間

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...