【課題】
銀行にATM(現金自動預払機)が1台設置されている。このATMが使用されているときには,新たに来た客はATMが空くまで列を作って待たなくてはならない。この待ち時間はどのくらいになるのか,また待ち時間を少なくするためにはどのような改善策があるのだろうか。
ただし,前の客が到着してから次の客が到着するまでの到着間隔と,客がATMに対面し操作を始め操作を終了しATMから離れるまでの使用時間は,過去のデータから下の表のようになっていることが分かっている。
ただし,前の客が到着してから次の客が到着するまでの到着間隔と,客がATMに対面し操作を始め操作を終了しATMから離れるまでの使用時間は,過去のデータから下の表のようになっていることが分かっている。
| 到着間隔(分) | 人数 |
| 1 | 11 |
| 2 | 17 |
| 3 | 13 |
| 4 | 9 |
| 使用時間(分) | 人数 |
| 1 | 7 |
| 2 | 16 |
| 3 | 27 |
【考察】
プログラムは,到着間隔及び使用時間を求める関数部分と
待ち行列を処理する Main Routine の2部構成でコーディングする。
待ち行列を処理する Main Routine の2部構成でコーディングする。
【プログラム①】到着間隔及び使用時間を求める関数
算出のアルゴリズム
① 過去のデータから,各階級(時間 : 分)の累積確率を算出しておく。
② 0~1 未満の乱数を発生させる。
③ 乱数の値が累積確率の値を超えない最大の階級(時間 : 分)を求める。
② 0~1 未満の乱数を発生させる。
③ 乱数の値が累積確率の値を超えない最大の階級(時間 : 分)を求める。
例)乱数 0.12 ⇒ 1分,乱数 0.16 ⇒ 2分,乱数 0.45 ⇒ 2分,乱数 0.50 ⇒ 3分
変数一覧
※「使用時間」の場合の例
jikan
Dosu
kaikyu
kaikyusu
Kakuritsu
Ruiseki
Dosu
kaikyu
kaikyusu
Kakuritsu
Ruiseki
:時間を求める関数
:各時間の人数(配列変数の引数)
:時間・階級の値
:時間を表す階級の個数
:各時間の人数割合(配列変数)
:各時間の人数累積割合(配列変数)
:各時間の人数(配列変数の引数)
:時間・階級の値
:時間を表す階級の個数
:各時間の人数割合(配列変数)
:各時間の人数累積割合(配列変数)
戻り値は「分」
[7,16,27]
1,2,3 のいずれか
3
[0.14,0.32,0.54]
[0.14,0.46,1]
[7,16,27]
1,2,3 のいずれか
3
[0.14,0.32,0.54]
[0.14,0.46,1]
関数の説明
乱数() ・・・ 0 以上 1 未満のランダムな小数を返す。
例えば,x = 乱数() のとき x に 0.57309 など無作為な小数が代入される。
例えば,x = 乱数() のとき x に 0.57309 など無作為な小数が代入される。
要素数(配列変数) ・・・ 配列変数の要素の個数を返す。
例えば,Data = [2,4,6] のとき 要素数(Data) の値は 3 である。
例えば,Data = [2,4,6] のとき 要素数(Data) の値は 3 である。
プログラムについて
05~07行
08,09行
10~12行
13~18行
08,09行
10~12行
13~18行
:配列変数 各時間の人数 Dosu の合計を求める。
:配列変数 各時間の人数割合(確率)Kakuritsu を求める。
:配列変数 各時間の人数累積割合(累積確率)Ruiseki を求める。
:乱数を発生させ,それが人数累積割合を超えない最大の使用時間
を求め,関数の戻り値とする。
:配列変数 各時間の人数割合(確率)Kakuritsu を求める。
:配列変数 各時間の人数累積割合(累積確率)Ruiseki を求める。
:乱数を発生させ,それが人数累積割合を超えない最大の使用時間
を求め,関数の戻り値とする。
【DNCL】時間を求める関数部分 ※配列の添え字は1より始まるものとする。
01
02
03
04
14
15
16
17
18
02
03
04
05
06
07
08
09
10
11
12
1306
07
08
09
10
11
12
14
15
16
17
18
関数 jikan(Dosu):
│ kaikyusu = 要素数(Dosu)
│ Kakuritsu の全ての値を0にする│ kaikyusu = 要素数(Dosu)
│ Ruiseki の全ての値を0にする
│ sum = 0
│ i を 1 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│ ⎿ sum = sum + Dosu[i]
│ i を 1 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│ ⎿ Kakuritsu[i] = Dosu[i] / sum
│ Ruiseki[1] = Kakuritsu[1]
│ i を 2 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│ ⎿ Ruiseki[i]=Ruiseki[i-1]+Kakuritsu[i]
│ r = 乱数()│ i を 1 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│ ⎿ sum = sum + Dosu[i]
│ i を 1 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│ ⎿ Kakuritsu[i] = Dosu[i] / sum
│ Ruiseki[1] = Kakuritsu[1]
│ i を 2 から kaikyusu まで 1 ずつ増やしながら繰り返す:
│ ⎿ Ruiseki[i]=Ruiseki[i-1]+Kakuritsu[i]
│ kaikyu = 1
│ True の間繰り返す:
│ │ もし r < Ruiseki[kaikyu] ならば:
│ │ ⎿ kaikyu を返す
⎿ ⎿ kaikyu = kaikyu + 1