psim 言語講座 (第1回) M/M/1 シミュレーションを書いてみる

  • HOME
  • psim 言語講座 (第1回) M/M/1 シミュレーションを書いてみる

本記事は当社が発行しているシミュレーションメールマガジン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 万秒のシミュレーションを行っても、個々のシミュレーション結果は、理論値とはかなり食い違う事がお分かりになるかと思います。理論値はあくまでも期待値です。実際にシミュレーションを行うとこのようなブレを実感する事ができます。

次回、このコードを読んでいきたいと思います。