蒙特卡罗——排队模拟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 分钟
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值