- HOME
- psim 言語講座 (第1回) M/M/1 シミュレーションを書いてみる
2020年10月29日 18:02
本記事は当社が発行しているシミュレーションメールマガジンVol1.の記事です。
シミュレーションメールマガジンの詳細・購読申込は こちら
はじめに
この講座では、S4 のシミュレーションエンジンの基盤となっている psim 言語を使ったシミュレーション方法について、紹介していきます。S4 では基本的には GUI でシミュレーションを組む事ができますが、psim 言語を知っていると、より細かなカスタマイズが可能ですし、スクリプト化すれば様々な分析も可能になります。
- S4 の psim 言語の概要が知りたい
- psim 言語を使いこなせるようになりたい
- シミュレーションをスクリプト化して自分で分析してみたい
とお考えの方は、是非お読み下さい。
psim 言語
psim 言語とは S4 Simulation System に搭載される、離散イベントシミュレーションを記述するための言語です。Python 言語上のライブラリとして提供されます。離散イベントシミュレーションとは、イベントを起因として状態が変化するようなシステムのシミュレーションの事です。なお、シミュレーションには、短い時間ステップごとに全ての対象物の状態を観測して、状態を変化させる連続型のシミュレーションもあります。psim 言語は双方をサポートしていますが、ここでは、離散イベントシミュレーションに着目します。
M/M/1 モデル
離散イベントシミュレーションの代表例としては、銀行の窓口を想像してみて下さい。銀行の窓口には、ランダムにお客様が到着します。窓口は同時に一人しかサービスを行えないので、窓口には行列が発生します。窓口でのサービス時間はお客様ごとに異る時間を要します。この時、行列はどのぐらいの長さになり、お客様は概ねどのぐらい待つのかを見積る事はサービス提供者にとって、非常に重要です。離散イベントシミュレーションは、このようなシステムのシミュレーションを行います。
このような待ち行列モデルは、理論的にも分析されていて、前述のモデルは M/M/1 モデルと呼ばれています。
理論的な説明はここでは省きますが、到着率(単位時間あたりに到着する人数)をλ(ラムダ)とし、サービス率(単位時間あたりにサービスを行える人数)をμ(ミュー)とすると、
- ρ = λ / μ ... (平均利用率)
- Q = ρ / (1 - ρ) ... (平均待ち行列)
- W = Q / μ ... (平均待ち時間)
になります。
例えば、お客様は平均 60 秒ぐらいで到着するなら、到着率(λ) は 1 / 60 になります。サービス時間は平均で 50 秒ぐらいなら、サービス率(μ)は 1 / 50 になります。この値を代入すると、平均待ち時間(W) は 250 秒になると予想できます。 では、実際にこのような結果になるかを psim を用いて検証してみようと思います。
スクリプト例
M/M/1 を psim 言語を使って書いた例が、こちらからダウンロードできます。
S4 Simulation System がインストールされている PC 上の適当なフォルダに上記 zip ファイルを展開下さい。 zip 内には、
- mm1.py
- mm1.bat
があります。mm1.py が M/M/1 モデルを psim を使って実装したコード例です。mm1.bat をそれを実行するための bat ファイルです。mm1.bat をダブルクリックして実行すると、平均到着時間 60 秒、平均サービス時間 50 秒で、10 万秒(> 27時間) のシミュレーションを行います。実行すると、例えば、以下のような結果が表示されます。
- 平均待ち時間: 253.955 (理論値: 250.000)
- 平均システム内客数: 4.970 (理論値: 5.000)
理論値と書かれているものは、M/M/1 モデルでの予想値です。
何度か実行してみると、10 万秒のシミュレーションを行っても、個々のシミュレーション結果は、理論値とはかなり食い違う事がお分かりになるかと思います。理論値はあくまでも期待値です。実際にシミュレーションを行うとこのようなブレを実感する事ができます。
次回、このコードを読んでいきたいと思います。