仿真输入建模

ptd 发布于 2026-02-06 58 次阅读


引言

仿真输入建模(Simulation Input Modeling)是离散事件系统仿真(Discrete Event Simulation, DES)中至关重要的一环。其核心任务是将从现实系统中收集的原始数据,科学地转化为计算机模型可识别与处理的概率分布。仿真领域有一句著名的格言:“垃圾进,垃圾出”(Garbage In, Garbage Out)。若输入模型无法准确反映现实系统的随机性特征,那么无论仿真模型的逻辑构建多么精妙,其输出结果都将缺乏可信度。

因此,构建高质量的输入模型需满足以下统计学与工程逻辑要求:

  1. 代表性与准确性
    • 这是最基本的要求,输入模型必须能真实刻画现实系统的统计特征。
  2. 逻辑完备性
    • 输入模型必须符合物理世界的常识和业务逻辑。
  3. 独立性与平稳性
    • 在统计建模中,通常假设样本是独立同分布的,并且输入模型需要明确是否随时间变化。
  4. 包含“极端情况”的能力
    • 模型不仅需覆盖系统的平均状态,更应具备生成足量“离群值”或“极端事件”的能力,以评估系统的鲁棒性。
  5. 计算效率
    • 所选模型应便于计算机算法高效生成随机变量。

具体步骤

1.1 数据收集与预处理

在实际工程项目中,这往往是最为耗时且繁琐的阶段,需要收集系统中大量的随机变量数据(如订单到达间隔、机器加工时间、物流运输时间等)。

数据清洗(Data Cleaning):剔除异常值。例如,若某次加工时间记录为 100 小时(而常规仅需 5 分钟),需甄别这是由于记录故障导致的错误数据,还是真实发生的罕见随机波动。
独立性检验(Independence Test):验证数据间是否存在相关性。例如,通过自相关图(Autocorrelation Plot)确认当前的到达时间是否依赖于上一次的到达时间。

本文将采用一组包含 100 次机器故障维修时长的数据样本,以此为例阐述建立概率模型的完整流程。

1.2 识别分布形态

获取数据后,需通过可视化手段推测其可能从属的分布族。主流的识别方法主要有三种,涵盖了从直观判断到量化分析的各个层面。尽管现代仿真软件(如 Arena Input Analyzer, ExpertFit)已实现自动化处理,但本文将通过 Excel 实现,以深入理解其底层逻辑。

  1. 直方图分析(Histogram Analysis)
    • 如果呈现钟形:可能是正态分布。
    • 如果呈现单调递减:可能是指数分布。
    • 如果呈现非对称的峰:可能是对数正态或韦伯分布。
    • Excel 实现:点击菜单栏 插入 -> 图表 -> 统计图表 -> 直方图,观察数据特征。
  2. 描述性统计特征法(Descriptive Statistics Method)
    • 通过计算几个关键统计指标来进行数值上的定性判断。
    • 变异系数 (CV = 标准差 / 均值):
      • CV ≈ 1: 强烈暗示指数分布。
      • CV < 1 (如 0.3-0.5): 数据比较集中,暗示正态或 Gamma。
      • CV > 1: 波动极大,暗示 对数正态或韦伯(长尾)。
    • Excel 公式:
      • 均值: =AVERAGE()
      • 标准差: =STDEV.S()
      • CV: =标准差/均值
    • 偏度 (Skewness):。
      • ≈ 0: 对称 (正态)
      • > 0: 右偏 (高峰在左,长尾在右,绝大多数加工时间和到达间隔都是这种)。
      • ≈ 2: 指数分布的理论偏度是 2。
      • Excel 公式:=SKEW()
  3. 概率图法(Q-Q Plot / P-P Plot)
    • 原理: 将数据的实际百分位数 (Y轴) 与假设分布的理论百分位数 (X轴) 画散点图。
    • 判据: 如果散点图呈现为一条直线 (45度),则该假设成立。
    • Excel 实现步骤 (比较麻烦,需要计算大量的逆函数):
      1. 排序:将数据从小到大排序。
      2. 计算排名:第几个数,记为 $i$
      3. 计算百分位 :$p = (i-0.5)/n$ (折中法) 或者使用函数=PERCENTRANK.EXC(数组,x)。
      4. 计算理论值:使用反函数计算理论上这个百分位对应的值。
        • 正态:=NORM.INV(p, mean, std)
        • Gamma:=GAMMA.INV(p, alpha, beta)
      5. 画散点图:X轴=观测数据,Y轴=理论值。

通过计算统计量和观察图像特征,我们可以对分布进行初步筛查。对模拟数据进行分析后的结果和直方图如下:

分析可见,维修时间为正连续变量,直方图显示明显的“单峰”且向右拖尾,呈现典型的非对称分布特征。结合 $CV < 1$ 说明数据相对集中,因此可排除 Normal 和 Uniform 分布,重点考察 Gamma 分布与 Weibull 分布

1.3 参数估计

确定候选分布族后,需通过算法寻找一组最优参数,使理论分布生成的概率模型最贴合样本数据。常用方法如下:

矩估计法 (Method of Moments, MOM)

  • 逻辑:令理论模型的总体矩(如均值、方差)等于样本。
  • 案例(维修时长):
    • 假设为 Gamma 分布:
      • 利用样本均值 $\bar{X}$ 和样本方差 $S^2$ 直接反推 $$ \hat{\alpha} = \frac{\bar{X}^2}{S^2} $$ $$ \hat{\beta} = \frac{S^2}{\bar{X}}$$
      • $$\alpha \text{ (形状)} = 3.139, \quad \beta \text{ (尺度)} = 3.085$$
    • 假设为 Weibull 分布:
      • Weibull 的矩估计非常复杂,涉及 Gamma 函数 $\Gamma(\cdot)$,方程组如下$$ \begin{cases} \bar{X} = \lambda \, \Gamma\left(1 + \frac{1}{k}\right) \\ S^2 = \lambda^2 \left[ \Gamma\left(1 + \frac{2}{k}\right) - \Gamma^2\left(1 + \frac{1}{k}\right) \right] \end{cases}$$
      • 通常通过消去 $\lambda$,解关于 $k$ 的超越方程,解出 $k$ 后代回第一个方程求 $\lambda$ $$ \frac{S^2}{\bar{X}^2} = \frac{\Gamma\left(1 + \frac{2}{k}\right)}{\Gamma^2\left(1 + \frac{1}{k}\right)} - 1 $$
      • $$ k \text{ (形状)} = 1.837, \quad \lambda \text{ (尺度)} = 10.900$$

最大似然估计法 (Maximum Likelihood Estimation, MLE)

  • 逻辑:寻找一组参数,使得在该参数下观测到当前这组数据的联合概率(似然函数值)最大。在统计学上,MLE 通常比 MOM 具有更优的渐近性质。
  • 原理:构建似然函数 $L(\theta)$,通过求导寻找极值点。这通常涉及复杂的非线性优化,建议借助专业软件计算。
  • 案例(维修时长):
    • 建议使用 Python 中的 Scipy 库,其中的 .fit() 函数默认就是使用 MLE,代码如下:
from scipy import stats

data = [11.93, 7.88, 7.36, ...]  # 你的数据

# 1. Gamma 分布
# 返回 (Shape, Location, Scale)->通常把 loc 固定为 0 (floc=0),因为维修时间从 0 开始
mle_Shape, mle_loc, mle_Scale = stats.gamma.fit(data, floc=0)

# 2. weibull 分布
weibull_shape, weibull_loc, weibull_scale = stats.weibull_min.fit(data, floc=0)

最后结果为:

  • Gamma 分布
    • $$\alpha \text{ (形状)} = 3.304, \quad \beta \text{ (尺度)} = 2.931$$
  • weibull 分布
    • $$ k \text{ (形状)} = 1.892, \quad \lambda \text{ (尺度)} = 10.952$$

1.4 拟合优度检验

拟合优度检验在统计学上是一个严格的假设检验过程:

  • 零假设 ($H_0$):观察到的数据采样自指定的理论分布(如“这些数据服从参数为 $\lambda$ 的指数分布”)。
  • 备择假设 ($H_1$):数据不服从该分布。
  • 具体目标:计算一个统计量,判断在给定的显著性水平(通常是 0.05)下,是否有足够的证据拒绝零假设。如果 $P > 0.05$,我们的目标就达到了——即“无法拒绝该分布”,认为拟合是合格的。

在系统仿真领域,拟合优度检验的目标是量化理论分布对现实系统所简化的误差大小,并筛选之前通过数据选定的多种分布,最终降低仿真的决策风险,增强置信度。主要有以下两种方法:

图形法

最常用的有两种图:

1. 密度-直方图:

  • 做法:绘制数据的频率直方图,并叠加理论分布的概率密度函数(PDF)曲线。
  • 判据:看曲线是否贴合直方图的轮廓。
  • 通过 Python 绘制的案例图如下

2. P-P 图 / Q-Q 图:

  • 做法:绘制“理论值”与“实际值”的散点图。
  • 判据:若点集紧密围绕 45 度对角线分布,说明拟合优良;若有明显弯曲或离散,说明拟合不佳。
  • 通过 Python 绘制的案例图如下

区别:

  • Q-Q 图 (Quantile-Quantile):对尾部数据更敏感(适合检查极值)
  • P-P 图 (Probability-Probability):对中间数据更敏感(适合检查整体趋势)

统计检验法

这是生成 P-Value 的关键步骤。

1. 卡方检验 (Chi-Square Test)

  • 原理:将数据离散化为若干个“区间(Bins)”,比较每个区间内“实际观测频数”与“理论期望频数”的差异。
  • 优点:通用性强(离散/连续均可)。
  • 缺点:结果受区间划分(分桶)方式影响较大,样本量较小($<50$)时效力较低。
  • 代码结果: 两个模型都接受 (Accept),但 Gamma 的 P 值 (0.63) 依然高于 Weibull (0.11)。

2. K-S 检验 (Kolmogorov-Smirnov Test)

  • 原理:计算“经验累积分布函数(ECDF)”与“理论累积分布函数(CDF)”之间的最大垂直距离 $D$。
  • 优点:无需分桶,适用于连续分布。
  • 缺点:对尾部数据不太敏感(只看最大距离)。
  • Python 代码:ks_stat, ks_p = stats.kstest(data, dist_code, args=params)
  • 代码解释:
组件含义
stats.kstestSciPy 统计模块中的 K-S 检验函数
data观测样本数据(一维数组/列表)
dist_code理论分布的名称字符串(如 'norm', 'expon', 'weibull_min'
args=params理论分布的参数元组(如 (loc, scale)(shape, loc, scale)
ks_statK-S 统计量 $D_n$:经验 CDF 与理论 CDF 的最大垂直距离
ks_pp-value:在原假设成立时,观察到当前或更极端统计量的概率
  • 代码结果:
  • Gamma: $D = 0.0588$, P-Value = $0.8592$ (非常高,拟合极好)。
  • Weibull: $D = 0.0861$, P-Value = $0.4247$ (还不错,但不如 Gamma)

3. A-D 检验 (Anderson-Darling Test)

  • 原理:K-S 检验的加权增强版,赋予尾部数据更高的权重。
  • 优点:通常比 K-S 检验更具统计效力(Power),能更有效地识别错误的分布。
  • 缺点:计算复杂,对每种分布有特定的临界值表。

1.5 模型选择

综合图形分析与 K-S 检验结果,作出如下评估:

  1. Gamma 分布:
    • P-Value: 0.86(非常高)
    • 图形: P-P 图上的点集紧密贴合参考线,几近完美。
    • 物理意义: 维修作业通常由若干个独立的子任务顺序组成(如:故障诊断 + 拆卸 + 更换 + 测试)。根据概率论,若各子任务时间近似服从指数分布,则其总和服从 Gamma 分布。因此,Gamma 分布在此场景下具有坚实的物理背景。
  2. Weibull 分布:
    • P-Value: 0.42(及格)
    • 图形: 虽然整体贴合,但在尾部(极大值处)可能略有偏差。
    • 物理意义: Weibull 分布常用于描述由“最弱环节”决定的故障模式(即“木桶效应”),因此更适用于建模故障间隔时间(TBF)而非维修时间(TTR)。

最终建议在模型中使用 Gamma 分布。

此作者没有提供个人介绍。
最后更新于 2026-02-14