- HOME
- psim言語講座(第1回)離散イベントシミュレーション(待ち行列 M/M/1モデル)を書いてみる
2020年10月29日 18:02
本記事は当社が発行しているシミュレーションメールマガジンVol.1の記事です。
シミュレーションメールマガジンの詳細・購読申込はこちら
のサポートページから
- psim言語講座(第1回)M/M/1シミュレーションを書いてみる
- psim言語講座(第2回)M/M/1シミュレーションを読んでみる
- psim言語講座(第3回)M/M/1 シミュレーションを拡張してみる
- psim言語講座(第4回)生産ラインシミュレーションを書いてみる
- psim言語講座(第5回)psimとexcelを連携してみる
- psim言語講座(第6回)psimとexcelを連携してみる(グラフ編)
- psim言語講座(第7回)連続型シミュレーションを書いてみる
- psim言語講座(第8回)エージェントシミュレーションを書いてみる
- psim言語講座(第9回)エージェントシミュレーションを拡張してみる
- psim言語講座(第10回)チュートリアル編(1)
- psim言語講座(第11回)チュートリアル編(2)
はじめに
この講座では、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万秒のシミュレーションを行っても、個々のシミュレーション結果は、理論値とはかなり食い違う事がお分かりになるかと思います。理論値はあくまでも期待値です。実際にシミュレーションを行うとこのようなブレを実感する事ができます。
次回、このコードを読んでいきたいと思います。