お知らせ

ただいま、シンタックスハイライターの設定を見直しております。
プログラムが見にくくなっているページがありますが、ご容赦ください。

窓口が2個の場合の待ち行列をPythonで書いてみる

モデル化とシミュレーション

こんにちは。前回に続き,待ち行列をPythonで書いてみることにします。

復習

窓口が2個になったときのシミュレーションした場合について,以前取り上げました。

ここでは,Excelでシミュレーションしていたので,Python版にしてみます。

窓口が1個についてPythonで書いたプログラムは前回を参考にしてください。

Pythonのプログラム

それではプログラムです。

import random
import math

# パラメータを設定する
lam = 4
num = 20
menu = [ ('うどん',  0.15, 40 ),
         ('そば' ,  0.1 , 30 ),
         ('ラーメン', 0.2 , 50 ),
         ('カレー',  0.25, 20 ),
         ('定食',  0.3 , 60 ) ]

# 初期値を決める
arrival_time = 0
end_time = [ 0, 0 ]
print( '客No  到着 開始 窓口 注文  調理  受取 待ち' )

# お客さんごとにシミュレーションする
for i in range( 1, num + 1, 1 ):
    # お客さんが来る時刻を決める
    r = random.random()
    interval = -60 * math.log( 1 - r ) / lam
    arrival_time += interval
    # お客さんが並ぶ窓口を決める
    counter_no = 0 if end_time[0] <= end_time[1] else 1

    # お客さんが注文するものを決める
    r = random.random()
    probability = 0
    for item in menu:
        if probability > r:
            break
        probability += item[1]

    # 時間を計算する
    start_time = arrival_time if arrival_time > end_time[counter_no] else end_time[counter_no]
    end_time[counter_no] = start_time + item[2]
    wait_time = start_time - arrival_time
    # お客さんごとに表示する
    print( 'No{:>2d} {:>4.0f} {:>4.0f}    {} {:<5} {:>2d} {:>4.0f} {:>4.0f}'
        .format( i, arrival_time, start_time, counter_no+1, item[0], item[2], end_time[counter_no], wait_time ) )

実行結果です。

客No  到着 開始 窓口 注文  調理  受取 待ち
No 1   14   14    1 カレー   20   34    0
No 2   17   17    2 定食    60   77    0
No 3   20   34    1 カレー   20   54   14
No 4   50   54    1 カレー   20   74    4
No 5   99   99    1 ラーメン  50  149    0
No 6  105  105    2 カレー   20  125    0
No 7  131  131    2 カレー   20  151    0
No 8  140  149    1 定食    60  209    9
No 9  175  175    2 定食    60  235    0
No10  183  209    1 定食    60  269   26
No11  208  235    2 ラーメン  50  285   27
No12  212  269    1 定食    60  329   57
No13  265  285    2 ラーメン  50  335   21
No14  281  329    1 カレー   20  349   48
No15  282  335    2 そば    30  365   53
No16  341  349    1 カレー   20  369    8
No17  344  365    2 定食    60  425   21
No18  359  369    1 カレー   20  389   10
No19  385  389    1 ラーメン  50  439    4
No20  408  425    2 定食    60  485   18

今回はこれでおしまいにします。それではまた。

Posted by kasugai