SimPyを使用した離散イベントモデリングの基本

インストール:
SimPyをインストールするには、次のコマンドを使用します—

 pip install simpy 

基本概念:

「SimPy」の主なアイデア—これはPythonのジェネレーター関数です。通常の関数とジェネレーターの違いは、通常の関数はreturnステートメントを使用するのに対し、ジェネレーターは—

関数にreturnステートメントがある場合、複数の関数呼び出しが行われた場合でも、同じ値が返されます。例:—


def func(): < / p>

return 1

return 2

いつfunc()は実行時に呼び出され、returnステートメントの最初のインスタンスで常に返されます。つまり、func()は常に1を返し、次のreturnステートメントは実行されません。

ただし、個別のイベントをシミュレートするには、特定の時間Tでのシステムの状態を見つける必要がある場合があります。これを行うには、Tの直前の間隔の状態を記憶し、このシミュレーションを実行してT中の状態に戻ります。

ここでは、ジェネレーター関数は非常に単純です。たとえば、次の関数について考えてみます。


def func():

while True

yield 1

利回り 2

これで、この関数が最初に呼び出されたときに1が「与えられ」ますが、次に呼び出されたときに2が返されます。ある意味で、この関数はそれが何であるかを記憶しています。最後の呼び出しの後に返され、次の終了ステートメントに進みます。

SimPyのイベントは、プロセスと呼ばれ、独自のジェネレーター関数によって定義されます。これらのプロセスは、環境内で行われます。 (環境がプロセスを内部に格納する大きなボックスであると想像してください。)

トラフィックライトのシミュレーションを含む簡単な例を見てみましょう&#8212;


#SimPyパッケージの基本を示すPython2.7コード
#トラフィックライトシミュレーション


#SimPyパッケージをインポート

import simpy


#ジェネレーター関数これは、トラフィックライトの動作を決定します
#timeout()関数は、次のyieldステートメントを待機させます
#this引数として時間が経過しました

def Traffic_Light(en v):


while True


print "ライトは" + strでGRNをオンにします (env.now)


#25秒間緑色に点灯 < / p>

yield env.timeout( 25


print "ライトは" + str (env.now)

< br>

#5秒間薄黄色

利回り env.timeout( 5


print "ライトが赤くなる" + str (env.now)


#赤く光る60秒

yield env.timeout( 60


#env-環境変数

env = simpy.Environment()


#Traffic_Light(env)で定義されたプロセス
#水曜日に追加
env.process(Traffic_Light(env))


#プロセスは最初の180秒以内に開始されます(180は含まれる)

e nv.run( = 180

終了:

ライトは0でGRNに変わりますライトは25でYELに変わりますライトは30で赤に変わりますライトはGRNに変わりますat90LightがYELを115LightからREDat120に変える

このコードでは、Traffic_Light(env)ジェネレーター関数が環境変数を引数として取り、次のように経過した期間の信号をシミュレートします。 env.run()への引数。 (実際、SimPyの時間には単位がありません。便宜上、時間、分、または秒に変換できます)。 env.nowは、現在の経過時間を返します。

env.timeout()関数は、引数として渡された時間がコンピューターのシミュレーションクロックで使用されることを想定しているため、このシミュレーションの基礎となります(リアルタイムではありません)、env.run()への引数として渡された時間が経過するまで、次のyieldステートメントをトリガーします。

env.run()は、環境に関連付けられたすべてのプロセスを開始します。同時に=0。