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=5simpy.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_speedyield env.timeout(refuel_duration)
ビット演算子
a & b, a >> b, a ^ bSimPy での利用
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で学ぶ離散事象シミュレーション