1 · 功能说明与手机端直读指南
使用独立指数分布到达间隔 Exp(λ) 与指数分布服务时长 Exp(μ),对无限容量单服务台排队系统 M/M/1/∞ 进行 100,000 名顾客的蒙特卡洛事件驱动仿真,直观验证稳态平均逗留时间 W = 1/(μ-λ) 与平均等待时间 Wq = λ/[μ(μ-λ)]。
为什么提供 HTML 代码阅读器?
在手机或平板浏览器中直接点击
.py 链接通常会触发文件下载而无法直接预览。本页面将 queueing_simulation.html 渲染为带行号、语法高亮与一键复制按钮的标准 V3 网页,方便随时对照课程笔记复习代码细节;同目录下的原始 queueing_simulation.html 仍完整保留供本地 Python 直接运行。
2 · 完整源码:queueing_simulation.html
1"""事件驱动 M/M/1 仿真:使用独立 Exp(lambda) 到达间隔与 Exp(mu) 服务时长。"""
2import random
3
4def simulate_mm1(arrival_rate=2.0,service_rate=3.0,customers=100_000,seed=2026,warmup=1000):
5 if not (0 < arrival_rate < service_rate) or customers <= warmup or warmup < 0:
6 raise ValueError('须满足 0<lambda<mu、customers>warmup>=0')
7 r=random.Random(seed); arrival=free=wait_sum=sojourn_sum=0.0
8 for i in range(customers):
9 arrival+=r.expovariate(arrival_rate)
10 duration=r.expovariate(service_rate)
11 start=max(arrival,free);free=start+duration
12 if i>=warmup:
13 wait_sum+=start-arrival
14 sojourn_sum+=free-arrival
15 n=customers-warmup
16 return {'W_sim':sojourn_sum/n,'Wq_sim':wait_sum/n,
17 'W_theory':1/(service_rate-arrival_rate),
18 'Wq_theory':arrival_rate/(service_rate*(service_rate-arrival_rate))}
19
20if __name__=='__main__':print(simulate_mm1())
3 · 核心实现要点与复杂度对照
核心递推关系(Lindley 递推式)与仿真输出对照
- 到达时刻:\(A_i = A_{i-1} + T_i\),其中到达间隔 \(T_i \stackrel{ ext{i.i.d.}}{\sim} \operatorname{Exp}(\lambda)\);
- 开始服务时刻:\(S_i = \max(A_i, F_{i-1})\)(若顾客到达时服务台空闲则立即开始,否则等前一人离开 \(F_{i-1}\));
- 离开时刻:\(F_i = S_i + D_i\),其中服务时间 \(D_i \stackrel{ ext{i.i.d.}}{\sim} \operatorname{Exp}(\mu)\);
- 等待时间与逗留时间:\(W_{q,i} = S_i - A_i\),\(W_i = F_i - A_i\)。
- 默认参数(\(\lambda=2.0, \mu=3.0,
ho=2/3\))运行结果:
{'W_sim': 1.0031, 'Wq_sim': 0.6695, 'W_theory': 1.0, 'Wq_theory': 0.6667},仿真值与理论公式高度吻合!