トラヒック計算で混雑解消 part2
電話は即時式サービスの代表格ですが、リクエスト(要求)してもリソース(資源)がすぐに用意できないとき、しばらく待ってもらうサービスの方が圧倒的に多いことに気が付きます。これらを待時式のサービスと言います。
| | ... | | ---------> リソース2 |
人 人 人 人 <-------- : | n個のリソース
| | サービス リソースn --+
+--- 待ち行列 ----+
銀行の窓口やATM、スーパーのレジ、インターネットのパケット通信、郵便や宅配のシステム…ほとんどが待時式サービスです。即時式と違って、サービスの提供を少し待ってもらうことで、有限のリソースを効率的に利用できるわけです。
待時式はアーランC式
すぐに要求が通らなくても、サービス開始まで待つタイプのアーラン式は以下のとおりです。
a n
---- ・ ---
n! n-a b ・ n
c = -------------------------- または c = -------------
i n n - a (1 - b)
n-1 a a n
∑ { ---- } + ---- ・ --- ※bはアーランB式の呼損率
i=0 i! n! n-a
アーランC式といいます。aはアーラン(呼量)、nはリソース数、cは即時にサービスが受けられずに待つ確率になります。0.5なら2回に1回は待ってもらうことになります(逆に言えば2回に1回はすぐにサービスを受けられる)。
この計算も面倒なのでerlang'というrpnプログラムを用意しますが、erlangプログラムと同様に先のパラメータがアーラン数で次がリソース数になります。
ただし、アーラン数よりリソース数が多いことが条件です。アーラン数がリソース数以下の場合、計算結果に意味はありません。>rpn 1 1 -c erlang'
rpn:ゼロで割りました <--+
>rpn 2 1 -c erlang' | 値に意味はない
2 <--+
アーラン数≧リソース数だとトラヒックが捌けず、良くてトラヒック平衡、悪くてトラヒックが無限に溜まることになります。
例えば呼量が1アーランのとき、リソースが2あるときの待ち確率は以下のように計算します。
0.333333
0.3なのでトラヒックの3割は待つことになりますね。当然、リソースが多くなれば待ち確率は減るはずです。リソースの数を3にしてみます。
0.0909091
9%の待ち確率です。確かに減っていますね。アーラン数を一定の10にしてリソース数を11から20まで変化させたときの待ち確率をグラフ化してみましょう。まずはそれぞれの待ち確率を確認します。
0.682118
0.307645
0.132339
0.0584553
0.0263246
0.0119024
0.00533754
0.00235384
0.00101494
0.000426269
一度、tmpファイルに計算結果を保存してからグラフ化していきます。
>rpn 11 -c rownum <tmp | xyp -x10,20 -y,1 -s1,.25 -m -n | npd
^y 1 待ち確率
|
|
0.75
| *
|
|
0.5
|
|
| *
0.25 ※10アーランの場合
|
| * x
10 * * * * * * 2* リソース数
+--11--12--13--14--15--16--17--18--19-->
グラフを見るとアーラン数+3でほとんど待ちがなくなっていることが分かりますね。
ちなみに、リクエストを拒否しても良い即時式のサービスなら、リソースが13もあれば呼損率5%のサービス提供ができますね。
0.163232
0.0636842
0.030989 <--- 13リソースで呼損率5%以下
0.0159296
0.00822622
0.0041782
0.0020657
0.000988752
0.00045691
0.000203573
どれだけ待てばいいの?
さて、すぐにサービスを受けられない確率(待ち行列に並ぶ確率)は計算できました。でも永遠に行列に並ぶ人はいません。あまりに長い待ち時間はクレームが発生しそうです。それに物理的なスペースにも限りがあるので、並ぶ人数にも注意が必要です。
では、平均待ち時間はどれくらいになるのでしょうか。その答えはリトルの公式が教えてくれます。
w = -----
n-a
hは平均保留時間、cはアーランC式の待ち確率、nはリソースの数、aはアーランです。意外に簡単な数式です。さっそく保留時間が180秒、待ち確率が0.5、リソースが2で、アーランが1の場合の平均待ち時間を計算してみましょう。以下のrpn式になります。
90
平均90秒待つことが分かります。
何人並ぶことになるの?
次に気になるのは平均の待ち行列数です。数式は次のとおりです。
l = -----
n-a
cはアーランC式の待ち確率、nはリソースの数、aはアーランです。上記の平均待ち時間と同じ条件で計算してみます。平均で0.5(人)が待つ(待っている)ことになりますね。
0.5
一定時間待つ割合は?
最後に一定時間以上待つ確率です。待つ時間をtとすると以下の数式になります。
--------
h
p = c・e
cはアーランC式の待ち確率、nはリソースの数、aはアーラン、hは保留時間、tが一定時間です。ちょっと複雑な数式ですが、tを300秒(5分)にして計算してみると約9%が5分以上待つことになりそうです。
0.0944378
このようにして、すぐにサービスを受けられる確率と待ちになってしまう確率を計算して、そのあとにサービスの質をどの程度まで許容するか(待ち時間や待ち行列数)を考えることになります。
現実的な例(必要なATMの台数)
一人あたりのATMの操作時間の平均が180秒として、平均して1時間に30人の来客があるとします。ATMの操作を待つことになったとしても待ち時間が5分以内の人が70%以上としたい場合、何台のATMを準備すればいいのでしょうか。また、そのときの平均待ち時間と平均行列数も知りたいとします。
まず呼量であるアーラン数を求めます。保留時間が180秒で30人分なので掛け合わせたものを3600秒で割ればOKです。
1.5
1.5アーランですね。次にアーランC式を使って、1.5アーランの時にATM数が2台の場合の待ち確率を求めます(アーラン数<リソース数)。すぐにATMを操作できる人は3割程度ですね。
0.642857
次に平均待ち時間と平均待ち行列数、指定時間以上の待ち確率を計算するのですが、毎回数式を打っていると大変なのでレジスタを使って一行プログラミングにします。
===(この行の1行下からコピー)===
#h #c #n #a @h @c * @n @a - /
===(この行の1行上までコピー)===
【平均待ち行列数のrpnプログラム(erl_l.rpn)】
===(この行の1行下からコピー)===
#a #c #n #a @a @c * @n @a - /
===(この行の1行上までコピー)===
【指定時間以上の待ち確率のrpnプログラム(erl_p.rpn)】
===(この行の1行下からコピー)===
#c #n #a #t #h @c @n @a - m @t * @h / e *
===(この行の1行上までコピー)===
上記のrpn式を一旦、テキストファイルに格納します。テキストファイルに付けるファイル名はそれぞれ"erl_w.rpn"、"erl_l.rpn"、"erl_p.rpn"にしておきましょう。そして、レジスタに格納される順番に注意して、それぞれの値を設定します。
231.429
>rpn 1.5 2 0.642857 1.5 <erl_l.rpn
1.92857
>rpn 180 300 1.5 2 0.642857 <erl_p.rpn
0.279385
計算してみると平均待ち時間が4分弱、平均待ち行列数が約2人、5分以上待つ確率が28%となりました。まあまあのサービス満足度ですね。
では、よりサービスを向上するために、ATMの台数を1台増やして3台にした場合はどうなるでしょうか。どの程度向上するでしょうか。
0.236842
>rpn 1.5 3 0.236842 180 <erl_w.rpn
28.421
>rpn 1.5 3 0.236842 1.5 <erl_l.rpn
0.236842
>rpn 180 300 1.5 3 0.236842 <erl_p.rpn
0.0194412
すぐにATMを操作できる人は8割近くにアップ、平均待ち時間も28秒に激減、平均待ち行列数が1人未満、5分以上待つ確率が2%となりました。
サービス品質は大幅に向上したようです。後は設備投資費用と顧客満足を天秤に掛けた経営判断でしょうが、現実には2台でもなんとかなるような気はします。
番外編:ATMが1台しかない場合
もし、ATMが1台しか用意できない場合は、呼量を1アーラン未満にするしかありません。上の例では保留時間が180秒で1時間に30人の来客とすると1.5アーランでした。
1.5
そこで、以下のように1時間に受け付ける来客を19人に制限すれば、1アーラン未満にはなります。
0.95
ただ、来客数を故意に絞り込むのは、民間企業で考えられない対応です。そこで、ATMのユーザインタフェースを改善して、一人あたりに掛かる時間を110秒に短縮することにします。
0.916667
一応、1アーラン未満を達成できるようです。では、待ち確率、平均待ち時間、待ち行列数、指定時間以上の待ち確率を計算してみましょう。
0.92
>rpn 0.92 1 0.92 110 <erl_w.rpn
1265
>rpn 0.92 1 0.92 0.92 <erl_l.rpn
10.58
>rpn 110 300 0.92 1 0.92 <erl_p.rpn
0.739661
10回来店して1回はすぐにATMが使えますが、9回は行列に並ぶことなります。その待ち行列は平均して10人です。平均待ち時間が21分もあって、5分以上待つ確率が70%を超えてしまう…。
とても現実的な値ではありませんね。ユーザインターフェースを改善しても、これ以上の保留時間短縮は無理でしょうから、やはり2台導入するほうが無難なようですね。
rpnプログラムを実行するには、rpn試用版かrpn標準版が必要です(バージョンの違いはこちら)。
pasteは講座サポートで公開されています。rownumはカンタン分析パッケージに同梱されています。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。