数学模型

Wang Haihua

🍈 🍉🍊 🍋 🍌


排队问题

问题

某修理店只有一个修理工, 来修理的顾客到达时间间隔服从负指数分布, 平均间隔时间 $10 \mathrm{~min}$; 对顾客的服务时间服从 $[4,15]$ (单位: min)上的均匀分布; 当到来的顾客较多时, 一部分顾客便需排队等待, 排 队按先到先服务规则, 队长无限制; 服务完的顾客便离开修理店。假定一个 工作日为 $8 \mathrm{~h}$ 。
(1) 模拟一个工作日内完成服务的个数及顾客平均等待时间。
(2) 模拟 1000 个工作日, 求出平均每日完成服务的个数及每日顾客的 平均等待时间。

建模

记第 $k$ 位顾客的到达时间间隔 $t_{k}$, 到达时刻 $c_{k}$, 离开时刻 $g_{k}$, 等待 时间 $w_{k}$, 它们很容易根据已有的到达时间间隔 $t_{k}$ 和服务时间 $s_{k}$ 按照以下的递推关系得到 $$ c_{k}=c_{k-1}+t_{k}, g_{k}=\max \left(c_{k}, g_{k-1}\right)+s_{k}, w_{k}=\max \left(0, g_{k-1}-c_{k}\right), k=2,3, \cdots . $$

求解

模拟一个工作日完成服务的个数及顾客平均等待时间, 运行结果特别不稳定。模拟 1000 个工作日, 平均每日完成服务的个数约为 44 , 平均等待时间 在 $25.66$ 分钟左右。

代码

from numpy.random import exponential, uniform, seed
from numpy import mean, array, zeros
seed(4)  #进行一致性比较,每次运行结果一样
def oneday():
    W=[0]  #第一个顾客的等待时间
    t0=exponential(10); c0=t0
    g0=c0+uniform(4,15); g=g0
    while g<480:
        t=exponential(10)  #下一个到达时间间隔
        c=c0+t  #下一个到达时刻
        w=max(0,g-c)  #下一个等待时间
        g=max(g,c)+uniform(4,15)  #下一个离开时刻
        c0=c  #把当前到达时刻保存起来
        W.append(w)  #把等待时间保存到列表中
    return len(W), mean(W)

W1=oneday(); print("服务人数和平均等待时间分别为:",W1)
d=1000  #模拟的天数
T=zeros(d); N=zeros(d)
for i in range(d):
    N[i],T[i]=oneday()
print("平均服务人数为:",round(N.mean()))
print("平均等待时间为:",T.mean())