蒙特卡罗——排队模拟python代码实现

排队问题描述

在这里插入图片描述

数学知识:指数分布

指数分布随机变量生成的数学原理

指数分布的定义

指数分布是连续概率分布,常用于描述某些事件发生的时间间隔。其概率密度函数(PDF)为:

f ( x ; λ ) = λ e − λ x f(x; \lambda) = \lambda e^{-\lambda x} f(x;λ)=λeλx

其中, λ \lambda λ 是速率参数, λ > 0 \lambda > 0 λ>0,并且 x ≥ 0 x \geq 0 x0

生成指数分布随机变量的原理

要生成满足 λ \lambda λ 参数的指数分布随机变量,可以利用均匀分布随机变量的性质。

逆变换采样法

逆变换采样法是生成随机变量的一种常用方法,尤其适用于具有已知累积分布函数(CDF)的分布。

累积分布函数 (CDF)

指数分布的累积分布函数为:

F ( x ; λ ) = 1 − e − λ x , x ≥ 0 F(x; \lambda) = 1 - e^{-\lambda x}, \quad x \geq 0 F(x;λ)=1eλx,x0

逆函数

我们需要求解该 CDF 的逆函数。设 U U U 是一个在区间 [ 0 , 1 ] [0, 1] [0,1] 上的均匀分布随机变量,那么:

U = F ( X ; λ ) U = F(X; \lambda) U=F(X;λ)

即:

U = 1 − e − λ X U = 1 - e^{-\lambda X} U=1eλX

解得:

e − λ X = 1 − U e^{-\lambda X} = 1 - U eλX=1U

两边取对数:

− λ X = ln ⁡ ( 1 − U ) -\lambda X = \ln(1 - U) λX=ln(1U)

因此:

X = − 1 λ ln ⁡ ( 1 − U ) X = -\frac{1}{\lambda} \ln(1 - U) X=λ1ln(1U)

由于 U U U 是均匀分布的,所以 1 − U 1 - U 1U 也是均匀分布的。为了简化计算,通常直接用 U U U 替代 1 - U(因为它们的分布性质相同),则有:

X = − 1 λ ln ⁡ ( U ) X = -\frac{1}{\lambda} \ln(U) X=λ1ln(U)

np.random.exponential

NumPy 提供了一个方便的函数 np.random.exponential 来生成指数分布随机变量。这个函数可以直接生成所需的随机变量,而不需要手动进行逆变换采样。

用法:

python
np.random.exponential(scale=1.0, size=None)
scale: 指数分布的尺度参数,即 1 λ \frac{1}{\lambda} λ1
size: 输出样本的形状。如果没有提供,则返回一个标量。

python蒙特卡罗模拟

import numpy as np
#%%
#定义常量
hour_work=8 #一天工作时长
lamb=0.1 #指数分布系数
mu=10    #正态分布的均值
s2=4     #正态分布的方差
#%%


# 模拟一天的函数
def run_a_day(lamb=0.1, mu=10, s2=4, hour_work=8):
    # 初始化
    a = np.zeros(480)  # 客户到达时间序列
    b = np.zeros(480)  # 客户开始服务时间序列
    e = np.zeros(480)  # 客户结束服务时间序列
    num_clients = 0    # 一天接待客户数
    average_wait_time = 0  # 客户平均等待时间

    # 开始模拟一天
    i = 0  # 实时接待人数
    while True:
        # 生成用户到达时间
        t_a = a[i] + np.random.exponential(scale=1/lamb)
        # 在工作时长内到达,进行接待,否则结束该天工作
        if t_a < hour_work * 60:
            i += 1
            a[i] = t_a
        else:
            break

        # 计算开始服务时间: 上一客户结束服务时间和该客户到达时间之间的最大值
        b[i] = max(a[i], e[i-1])

        # 生成服务时长,计算结束服务时间
        t_s = np.random.normal(loc=mu, scale=np.sqrt(s2))
        # 服务时长小于一分钟,当做1分钟
        if t_s < 1:
            t_s = 1
        e[i] = b[i] + t_s

    # 统计接待客户数和平均等待时长
    num_clients = i
    if num_clients > 0:
        average_wait_time = (b[1:num_clients+1] - a[1:num_clients+1]).mean()

    print(f'一个工作日接待客户 {num_clients} 人,客户平均等待时间为 {average_wait_time:.2f} 分钟')

    return num_clients, average_wait_time

# 模拟100天的函数
def run_hundred_days():
    num_clients_ = []
    average_wait_time_ = []
    for i in range(100):
        num_clients, average_wait_time = run_a_day()
        num_clients_.append(num_clients)
        average_wait_time_.append(average_wait_time)

    NC = np.array(num_clients_).mean()
    AWT = np.array(average_wait_time_).mean()

    print(f'100个工作日内平均接待客户 {NC:.2f} 人,客户平均等待时间为 {AWT:.2f} 分钟')



# 运行模拟100天的函数
run_hundred_days()

一个工作日接待客户 48 人,客户平均等待时间为 22.89 分钟
一个工作日接待客户 52 人,客户平均等待时间为 27.31 分钟
一个工作日接待客户 45 人,客户平均等待时间为 12.85 分钟
一个工作日接待客户 55 人,客户平均等待时间为 47.07 分钟
一个工作日接待客户 41 人,客户平均等待时间为 8.86 分钟
一个工作日接待客户 53 人,客户平均等待时间为 24.32 分钟
一个工作日接待客户 47 人,客户平均等待时间为 14.67 分钟
一个工作日接待客户 45 人,客户平均等待时间为 20.73 分钟
一个工作日接待客户 50 人,客户平均等待时间为 59.36 分钟
一个工作日接待客户 51 人,客户平均等待时间为 43.65 分钟
一个工作日接待客户 52 人,客户平均等待时间为 47.51 分钟
一个工作日接待客户 53 人,客户平均等待时间为 42.94 分钟
一个工作日接待客户 41 人,客户平均等待时间为 9.28 分钟
一个工作日接待客户 44 人,客户平均等待时间为 15.03 分钟
一个工作日接待客户 57 人,客户平均等待时间为 45.49 分钟
一个工作日接待客户 48 人,客户平均等待时间为 28.47 分钟
一个工作日接待客户 48 人,客户平均等待时间为 42.58 分钟
一个工作日接待客户 37 人,客户平均等待时间为 13.84 分钟
一个工作日接待客户 59 人,客户平均等待时间为 78.03 分钟
一个工作日接待客户 41 人,客户平均等待时间为 26.85 分钟
一个工作日接待客户 38 人,客户平均等待时间为 10.47 分钟
一个工作日接待客户 51 人,客户平均等待时间为 17.28 分钟
一个工作日接待客户 69 人,客户平均等待时间为 102.54 分钟
一个工作日接待客户 51 人,客户平均等待时间为 33.48 分钟
一个工作日接待客户 57 人,客户平均等待时间为 101.95 分钟
一个工作日接待客户 48 人,客户平均等待时间为 31.05 分钟
一个工作日接待客户 63 人,客户平均等待时间为 82.93 分钟
一个工作日接待客户 45 人,客户平均等待时间为 28.38 分钟
一个工作日接待客户 45 人,客户平均等待时间为 24.48 分钟
一个工作日接待客户 49 人,客户平均等待时间为 29.36 分钟
一个工作日接待客户 50 人,客户平均等待时间为 42.13 分钟
一个工作日接待客户 57 人,客户平均等待时间为 46.76 分钟
一个工作日接待客户 43 人,客户平均等待时间为 6.68 分钟
一个工作日接待客户 43 人,客户平均等待时间为 12.79 分钟
一个工作日接待客户 44 人,客户平均等待时间为 10.33 分钟
一个工作日接待客户 51 人,客户平均等待时间为 55.42 分钟
一个工作日接待客户 60 人,客户平均等待时间为 53.03 分钟
一个工作日接待客户 48 人,客户平均等待时间为 37.39 分钟
一个工作日接待客户 40 人,客户平均等待时间为 10.48 分钟
一个工作日接待客户 43 人,客户平均等待时间为 13.24 分钟
一个工作日接待客户 48 人,客户平均等待时间为 49.59 分钟
一个工作日接待客户 50 人,客户平均等待时间为 35.26 分钟
一个工作日接待客户 46 人,客户平均等待时间为 35.34 分钟
一个工作日接待客户 41 人,客户平均等待时间为 14.04 分钟
一个工作日接待客户 53 人,客户平均等待时间为 38.50 分钟
一个工作日接待客户 44 人,客户平均等待时间为 14.96 分钟
一个工作日接待客户 37 人,客户平均等待时间为 8.79 分钟
一个工作日接待客户 40 人,客户平均等待时间为 15.23 分钟
一个工作日接待客户 40 人,客户平均等待时间为 10.83 分钟
一个工作日接待客户 54 人,客户平均等待时间为 41.61 分钟
一个工作日接待客户 49 人,客户平均等待时间为 23.37 分钟
一个工作日接待客户 52 人,客户平均等待时间为 29.20 分钟
一个工作日接待客户 47 人,客户平均等待时间为 22.93 分钟
一个工作日接待客户 42 人,客户平均等待时间为 13.27 分钟
一个工作日接待客户 44 人,客户平均等待时间为 22.53 分钟
一个工作日接待客户 40 人,客户平均等待时间为 10.37 分钟
一个工作日接待客户 40 人,客户平均等待时间为 9.19 分钟
一个工作日接待客户 45 人,客户平均等待时间为 11.74 分钟
一个工作日接待客户 48 人,客户平均等待时间为 28.49 分钟
一个工作日接待客户 41 人,客户平均等待时间为 13.48 分钟
一个工作日接待客户 41 人,客户平均等待时间为 35.80 分钟
一个工作日接待客户 38 人,客户平均等待时间为 14.44 分钟
一个工作日接待客户 46 人,客户平均等待时间为 29.39 分钟
一个工作日接待客户 47 人,客户平均等待时间为 20.27 分钟
一个工作日接待客户 46 人,客户平均等待时间为 41.61 分钟
一个工作日接待客户 56 人,客户平均等待时间为 33.58 分钟
一个工作日接待客户 46 人,客户平均等待时间为 56.74 分钟
一个工作日接待客户 42 人,客户平均等待时间为 13.71 分钟
一个工作日接待客户 47 人,客户平均等待时间为 16.84 分钟
一个工作日接待客户 36 人,客户平均等待时间为 8.98 分钟
一个工作日接待客户 47 人,客户平均等待时间为 30.27 分钟
一个工作日接待客户 39 人,客户平均等待时间为 10.07 分钟
一个工作日接待客户 35 人,客户平均等待时间为 11.50 分钟
一个工作日接待客户 47 人,客户平均等待时间为 16.75 分钟
一个工作日接待客户 47 人,客户平均等待时间为 10.28 分钟
一个工作日接待客户 43 人,客户平均等待时间为 10.77 分钟
一个工作日接待客户 49 人,客户平均等待时间为 26.98 分钟
一个工作日接待客户 50 人,客户平均等待时间为 28.99 分钟
一个工作日接待客户 46 人,客户平均等待时间为 35.07 分钟
一个工作日接待客户 55 人,客户平均等待时间为 70.12 分钟
一个工作日接待客户 41 人,客户平均等待时间为 16.05 分钟
一个工作日接待客户 44 人,客户平均等待时间为 13.71 分钟
一个工作日接待客户 52 人,客户平均等待时间为 45.87 分钟
一个工作日接待客户 58 人,客户平均等待时间为 52.14 分钟
一个工作日接待客户 58 人,客户平均等待时间为 79.51 分钟
一个工作日接待客户 38 人,客户平均等待时间为 11.69 分钟
一个工作日接待客户 47 人,客户平均等待时间为 57.33 分钟
一个工作日接待客户 47 人,客户平均等待时间为 36.69 分钟
一个工作日接待客户 52 人,客户平均等待时间为 51.05 分钟
一个工作日接待客户 48 人,客户平均等待时间为 36.73 分钟
一个工作日接待客户 60 人,客户平均等待时间为 88.82 分钟
一个工作日接待客户 57 人,客户平均等待时间为 49.44 分钟
一个工作日接待客户 34 人,客户平均等待时间为 15.49 分钟
一个工作日接待客户 43 人,客户平均等待时间为 19.66 分钟
一个工作日接待客户 54 人,客户平均等待时间为 58.44 分钟
一个工作日接待客户 47 人,客户平均等待时间为 41.21 分钟
一个工作日接待客户 44 人,客户平均等待时间为 22.37 分钟
一个工作日接待客户 51 人,客户平均等待时间为 48.60 分钟
一个工作日接待客户 50 人,客户平均等待时间为 43.82 分钟
一个工作日接待客户 36 人,客户平均等待时间为 6.78 分钟
100个工作日内平均接待客户 47.27 人,客户平均等待时间为 31.48 分钟
### 衡阳师范学院计算机仿真课程与研究资源 #### 课程设置 衡阳师范学院开设有《计算机仿真》课程,该课程旨在培养学生掌握计算机仿真的基本理论和技术方法。学生通过本课程的学习能够理解并应用离散事件系统仿真、连续系统仿真以及混合系统的建模与分析技术[^1]。 #### 教学内容 教学过程中会涉及到多种仿真工具的应用实践,如MATLAB/Simulink, Arena等软件平台的操作训练;同时也会深入探讨随机数生成器的设计原理及其在排队论中的运用实例等内容[^2]。 #### 实验室建设情况 为了支持上述课程的教学活动,学校建立了专门用于开展此类实验项目的实验室环境——计算中心下设有多媒体教室和高性能服务器集群可供师生们共同使用,在这里可以完成从简单到复杂的各类项目开发工作[^3]。 #### 科研成果展示 近年来,围绕着“智能制造”这一主题方向,该校教师带领研究生团队完成了多项省部级科研课题的研究任务,并发表了多篇高水平学术论文。这些研究成果不仅促进了学科发展水平提升,也为地方经济建设和产业升级提供了强有力的技术支撑和服务保障措施[^4]。 ```python # Python代码示例:简单的蒙特卡洛模拟实现圆周率估算 import random def estimate_pi(n): num_point_circle = 0 num_point_total = 0 for _ in range(n): x = random.uniform(0, 1) y = random.uniform(0, 1) distance = x**2 + y**2 if distance <= 1: num_point_circle += 1 num_point_total += 1 pi_estimation = 4 * (num_point_circle / num_point_total) return pi_estimation print(f'Estimated Pi value after {10000} iterations is:', estimate_pi(10000)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值