トラヒック計算で混雑解消 part2 | 数学アラカルト [実践] | 逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓の実践ウェブ rpn hacks!

逆ポーランド電卓rpnの実践ウェブ   
rpn hacks! アールピーエヌ・ハックスサイトマップ

rpn | 実戦 | 数学アラカルト | 数学に関する話題をrpnで探求!数字と遊んでみよう。

HOME > 実践 > 数学アラカルト > トラヒック計算で混雑解消 part2

hatena twitter facebook rss ソーシャルブックマーク

トラヒック計算で混雑解消 part2

前のページに戻るLinkIcon

 電話は即時式サービスの代表格ですが、リクエスト(要求)してもリソース(資源)がすぐに用意できないとき、しばらく待ってもらうサービスの方が圧倒的に多いことに気が付きます。これらを待時式のサービスと言います。

  ○  ○       ○  ○   リクエスト   リソース1 --+
  |  |  ...  |  |   --------->   リソース2   |
  人  人       人  人   <--------        :       | n個のリソース
  |                 |    サービス    リソースn --+
  +--- 待ち行列 ----+


銀行の窓口やATM、スーパーのレジ、インターネットのパケット通信、郵便や宅配のシステム…ほとんどが待時式サービスです。即時式と違って、サービスの提供を少し待ってもらうことで、有限のリソースを効率的に利用できるわけです。

待時式はアーランC式

 すぐに要求が通らなくても、サービス開始まで待つタイプのアーラン式は以下のとおりです。

               n
              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あるときの待ち確率は以下のように計算します。

  >rpn 1 2 -c erlang'
  0.333333


0.3なのでトラヒックの3割は待つことになりますね。当然、リソースが多くなれば待ち確率は減るはずです。リソースの数を3にしてみます。

  >rpn 1 3 -c erlang'
  0.0909091


9%の待ち確率です。確かに減っていますね。アーラン数を一定の10にしてリソース数を11から20まで変化させたときの待ち確率をグラフ化してみましょう。まずはそれぞれの待ち確率を確認します。

  >rpn 10 @n @n 1 + #n -r 10 -b 11 #n | rpn -c erlang'
  0.682118
  0.307645
  0.132339
  0.0584553
  0.0263246
  0.0119024
  0.00533754
  0.00235384
  0.00101494
  0.000426269


一度、tmpファイルに計算結果を保存してからグラフ化していきます。

  >rpn 10 @n @n 1 + #n -r 10 -b 11 #n | rpn -c erlang' >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%のサービス提供ができますね。

  >rpn 10 @n @n 1 + #n -r 10 -b 11 #n | rpn -c erlang | npd
  0.163232
  0.0636842
  0.030989    <--- 13リソースで呼損率5%以下
  0.0159296
  0.00822622
  0.0041782
  0.0020657
  0.000988752
  0.00045691
  0.000203573


どれだけ待てばいいの?

 さて、すぐにサービスを受けられない確率(待ち行列に並ぶ確率)は計算できました。でも永遠に行列に並ぶ人はいません。あまりに長い待ち時間はクレームが発生しそうです。それに物理的なスペースにも限りがあるので、並ぶ人数にも注意が必要です。

では、平均待ち時間はどれくらいになるのでしょうか。その答えはリトルの公式が教えてくれます。

       h・c
  w = -----
       n-a


hは平均保留時間、cはアーランC式の待ち確率、nはリソースの数、aはアーランです。意外に簡単な数式です。さっそく保留時間が180秒、待ち確率が0.5、リソースが2で、アーランが1の場合の平均待ち時間を計算してみましょう。以下のrpn式になります。

  >rpn 180 0.5 * 2 1 - /
  90


平均90秒待つことが分かります。

何人並ぶことになるの?

 次に気になるのは平均の待ち行列数です。数式は次のとおりです。

       a・c
  l = -----
       n-a


cはアーランC式の待ち確率、nはリソースの数、aはアーランです。上記の平均待ち時間と同じ条件で計算してみます。平均で0.5(人)が待つ(待っている)ことになりますね。

  >rpn 1 0.5 * 2 1 - /
  0.5


一定時間待つ割合は?

 最後に一定時間以上待つ確率です。待つ時間をtとすると以下の数式になります。

      -(n-a)*t
      --------
         h
  p = c・e


cはアーランC式の待ち確率、nはリソースの数、aはアーラン、hは保留時間、tが一定時間です。ちょっと複雑な数式ですが、tを300秒(5分)にして計算してみると約9%が5分以上待つことになりそうです。

  >rpn 0.5 2 1 - m 300 * 180 / e *
  0.0944378


このようにして、すぐにサービスを受けられる確率と待ちになってしまう確率を計算して、そのあとにサービスの質をどの程度まで許容するか(待ち時間や待ち行列数)を考えることになります。

現実的な例(必要なATMの台数)

 一人あたりのATMの操作時間の平均が180秒として、平均して1時間に30人の来客があるとします。ATMの操作を待つことになったとしても待ち時間が5分以内の人が70%以上としたい場合、何台のATMを準備すればいいのでしょうか。また、そのときの平均待ち時間と平均行列数も知りたいとします。

まず呼量であるアーラン数を求めます。保留時間が180秒で30人分なので掛け合わせたものを3600秒で割ればOKです。

  >rpn 180 30 * 3600 /
  1.5


1.5アーランですね。次にアーランC式を使って、1.5アーランの時にATM数が2台の場合の待ち確率を求めます(アーラン数<リソース数)。すぐにATMを操作できる人は3割程度ですね。

  >rpn 1.5 2 -c erlang'
  0.642857


次に平均待ち時間と平均待ち行列数、指定時間以上の待ち確率を計算するのですが、毎回数式を打っていると大変なのでレジスタを使って一行プログラミングにします。

 【平均待ち時間のrpnプログラム(erl_w.rpn)】
  ===(この行の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"にしておきましょう。そして、レジスタに格納される順番に注意して、それぞれの値を設定します。

  >rpn 1.5 2 0.642857 180 <erl_w.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台にした場合はどうなるでしょうか。どの程度向上するでしょうか。

  >rpn 1.5 3 -c erlang'
  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アーランでした。

  >rpn 180 30 * 3600 /
  1.5


そこで、以下のように1時間に受け付ける来客を19人に制限すれば、1アーラン未満にはなります。

  >rpn 180 19 * 3600 /
  0.95


ただ、来客数を故意に絞り込むのは、民間企業で考えられない対応です。そこで、ATMのユーザインタフェースを改善して、一人あたりに掛かる時間を110秒に短縮することにします。

  >rpn 110 30 * 3600 /
  0.916667


一応、1アーラン未満を達成できるようです。では、待ち確率、平均待ち時間、待ち行列数、指定時間以上の待ち確率を計算してみましょう。

  >rpn 0.92 1 -c erlang'
  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台導入するほうが無難なようですね。

実践数学アラカルトに戻るLinkIcon

警告rpnプログラムを実行するには、rpn試用版かrpn標準版が必要です(バージョンの違いはこちら)。

情報pasteは講座サポートで公開されています。rownumはカンタン分析パッケージに同梱されています。xypとnpdはrpnの姉妹ソフトウェアです。詳しくはプロダクトを参照ください。

数学アラカルト

数字と遊んでみよう

※実践コーナーのTOP

紹介 rpnの利用シーンはこちら…

講座初めての人のrpn基礎もどうぞ
講座しっかり学べるrpn入門もどうぞ
講座すぐに使えるdos入門もどうぞ

実践他の分野への挑戦は実践TOP

応用rpnアプリケーションは応用TOP

part2

数字と遊んでみよう

※実践コーナーのTOP

講座初めての人のrpn基礎もどうぞ
講座しっかり学べるrpn入門もどうぞ
講座すぐに使えるdos入門もどうぞ

実践他の分野への挑戦は実践TOP

応用rpnアプリケーションは応用TOP

書籍紹介

記事に関連した書籍

本ウェブサイトで扱った話題に関連した書物で、スタッフが実際に読了したものを紹介。

書籍数学の書籍
数の世界は思ったよりもエキサイティング

書籍投資の書籍
失敗しない投資には広範囲で実践的な知識が必要

警告バックスラッシュはエンマークに読み替えて下さい(IE)。
バックスラッシュとエンマーク

警告文字で作られた図表や式が崩れることがあります。ブラウザによっては固定幅フォントをMSゴシックにするときれいに表示されます。それでも崩れる場合は図表や式をメモ帳にコピー後、閲覧下さい。

警告rpn試用版と標準版(2kリビジョン)はダブルクォートで囲って下さい。

rpn 1 2 + ⇒ rpn "1 2 +"
rpn 1 -c foo ⇒ rpn "1" -c "foo"

ダブルクォートは省略できることが多いのですが、慣れない間は囲んだほうが無難です。なお、本ウェブサイトの記事ではrpn標準版(98リビジョン)を使用しているため囲っていません。詳しくは技術サポートの「rpn TIPS参照ください。

注意rpnの障害情報はこちら

警告rpn試用版の場合、複雑なプログラムや処理時間のかかるプログラムの一部には動作しないものがあるかもしれません。あくまで無料提供であることを勘案・了承ください。rpn標準版は、すべてのプログラムが動作します。