SimPy パッケージ入門

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

Dr Diogo Costa

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

SimPy とは

SimPy パッケージのロゴ: Python 用の離散事象シミュレーション

  • 標準 Python ベースのプロセス駆動型の離散事象シミュレーションフレームワーク

  • プロセスやイベントを定義するためジェネレーター関数を使用(Toolbox 受講前提で解説)

  • スケーラブル:

    • モデルは複数のジェネレーターを含められる
    • 各ジェネレーターは複数のプロセスを含められる
    • プロセスは直列または並列で実行可能
Pythonで学ぶ離散事象シミュレーション

通常関数 vs. ジェネレーター関数

通常の関数

def mygenerator():
    return 10
  • return は値を返し、関数の実行を終了

関数の実行:

10

ジェネレーター関数

def mygenerator():
    yield 20
    yield 12
  • yield は値を返し、内部状態を保持したまま実行を一時停止

ジェネレーターの実行:

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

主要な SimPy メソッドまとめ

1) SimPy 環境を作成

env = simpy.Environment()

2) ジェネレーター関数を環境に追加

env.process()

3) モデルを実行

env.run()

4) シミュレーションで時間を進める

env.timeout()

5) 現在のシミュレーション時刻を取得

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

信号機: SimPy モデルの構築

1) SimPy パッケージをインポート

import simpy

2) プロセスを含むジェネレーター関数を作成

def traffic_light(env, name, timestep):
     while True:
        yield env.timeout(timestep)
        print(f"Time {env.now:02d} sec | Traffic light at {name} | Red light!")
        yield env.timeout(timestep)
        print(f"Time {env.now:02d} sec | Traffic light at {name} | Yellow Light!")
        yield env.timeout(timestep)
        print(f"Time {env.now:02d} sec | Traffic light at {name} | Green Light!")
Pythonで学ぶ離散事象シミュレーション

信号機: SimPy モデルの構築

3) SimPy の環境を作成

env = simpy.Environment()

4) 生成器を SimPy 環境に追加

env.process(traffic_light(env, "Leslie St.", 15))
env.process(traffic_light(env, "Arlington Av.", 30))

5) モデルを実行

env.run(until=90)
Pythonで学ぶ離散事象シミュレーション

信号機: 出力

コンソール出力:

Time 15 sec  |  Traffic light at Leslie St.     |  Red light!
Time 30 sec  |  Traffic light at Arlington Av.  |  Red light!
Time 30 sec  |  Traffic light at Leslie St.     |  Yellow Light!
Time 45 sec  |  Traffic light at Leslie St.     |  Green Light!
Time 60 sec  |  Traffic light at Arlington Av.  |  Yellow Light!
Time 60 sec  |  Traffic light at Leslie St.     |  Red light!
Time 75 sec  |  Traffic light at Leslie St.     |  Yellow Light!
Pythonで学ぶ離散事象シミュレーション

Ayo berlatih!

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

Preparing Video For Download...