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

排队问题描述

蒙特卡罗——排队模拟python代码实现_第1张图片

数学知识:指数分布

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

指数分布的定义

指数分布是连续概率分布,常用于描述某些事件发生的时间间隔。其概率密度函数(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 分钟

你可能感兴趣的:(python,开发语言,蒙特卡罗)