Discrete-Event Simulation

系统不是“连续流动”,而是在事件发生的瞬间跳到下一个状态

离散事件仿真把注意力放在“状态改变的时刻”:客户到达、机器空闲、任务完成、资源释放。 中间没有事件时,系统其实什么都不用算,这正是它高效又直观的地方。

事件驱动 排队等待 资源占用 吞吐与瓶颈
进入交互实验

DES 的直觉

只在事件发生时更新系统状态,所以它特别适合排队、制造、物流、医院、呼叫中心等流程系统。

状态 队列里有多少人、服务器是否忙碌、当前仿真时间是多少。
事件 到达、开始服务、完成服务、资源释放,都会推动系统跳变。
资源 柜台、机器、医生、车位等有限资源会决定拥堵和等待。
输出 等待时间、利用率、吞吐量、排队长度,都是最后读出来的结果。
理论速览

系统在事件之间“静止”,在事件瞬间“跳变”

离散事件仿真(Discrete-Event Simulation,DES)研究的是这样一类系统:状态只在某些离散时刻发生变化, 而在两次变化之间保持不变。所以真正需要计算的时间点非常少,仿真时钟是“跳”过去的,而不是“走”过去的。

01 状态

State · 系统此刻长什么样

队列长度、每台服务台是忙还是闲、已完成客户数、累计等待时间。这些量只在事件发生的那一刻才会被改写,其余时间原样冻结。

02 事件

Event · 推动跳变的触发器

到达、开始服务、服务完成、资源释放、班次结束。事件是状态改变的唯一原因,也是仿真日志里一行行记录的内容。

03 时钟

Clock · 会跳的仿真时间

仿真时钟不是每秒 +1,而是直接跳到“下一个最早事件的时刻”。无事发生的空档期,系统完全不计算,这是 DES 效率的来源。

04 随机性

Randomness · 为什么结果每次不同

到达间隔与服务时长由随机数发生器抽样。同一条流水线跑两遍,得到的平均等待时间不会完全一样,所以需要多次重复实验来给出区间估计。

05 资源

Resource · 有限的能力边界

服务台、机器、床位、车位都是有限的。资源数量一旦固定,系统能承受的到达强度也就有了上限,超过它队列会无限增长。

06 统计

Statistics · 最终要回答的问题

平均等待时间、平均队长、资源利用率、吞吐量、超时比例。仿真的产出不是一张截图,而是一组带置信区间的统计量。

形式化:DEVS 用七元组描述离散事件系统

1976 年,Bernard P. Zeigler 提出了 DEVS(Discrete Event System Specification), 用集合论的方式把“离散事件系统”这件事讲清楚,让仿真模型的语义第一次变得严格、可组合、可验证。

其中:X 是输入事件集合,S 是状态集合,Y 是输出事件集合, δ_int 是内部状态转移(自己内部定时器到点),δ_ext 是外部状态转移(收到外部输入事件), λ 是输出函数,ta 是时间推进函数——它告诉系统“当前状态还能维持多久”。

本页下方的排队实验,其实就是这个七元组的一个具体实例:X 是到达事件,S 是(队列长度, 各服务台剩余时间), δ_ext 处理到达,δ_int 处理服务完成,ta 决定下一个事件发生在什么时候。

历史脉络

从电话交换机到数字孪生,DES 用了一百年

离散事件仿真不是凭空出现的学科。它从排队论出发,被编程语言武装,最后被形式化理论统一。

  1. 1909–1917

    Erlang 与排队论的起点

    丹麦电话工程师 A. K. Erlang 在研究电话交换机拥塞时,提出了以他命名的 Erlang 分布与等待公式。这是人类第一次用数学描述“等待”这件事,也是 DES 最早的思想源头。

  2. 1953

    Kendall 记号:M/M/c 的由来

    D. G. Kendall 引入 A/B/c 记号来描述排队系统(后来扩展为 A/B/c/K/m/Z)。今天写的 M/M/1、M/M/c,第一个 M 指到达过程服从马尔可夫(泊松)性质,第二个 M 指服务时间服从指数分布。

  3. 1961

    GPSS 诞生,Little 定律被证明

    IBM 的 Geoffrey Gordon 发布通用仿真系统 GPSS,第一次让“用代码描述排队流程”变得可行;同年,John D. C. Little 严格证明了 L = λW,也就是后来无处不在的 Little 定律。

  4. 1963

    SIMSCRIPT 把仿真语言推向通用化

    兰德公司的 Harry Markowitz(后来获得诺贝尔经济学奖)主导开发 SIMSCRIPT,把仿真专用语法和通用编程语言结合起来,让模型可以描述更复杂的逻辑分支与优先级。

  5. 1976

    DEVS 形式化框架

    Bernard P. Zeigler 提出 DEVS,用七元组统一定义离散事件系统。它让“模型”第一次有了严格的数学语义,也让多个子模型可以像积木一样组合、复用与验证。

  6. 1982–1993

    SIMAN 与 Arena:DES 走进工业界

    C. Dennis Pegden 发布 SIMAN,随后演化为 Arena。图形化、拖拽式的建模方式,让制造、物流、医院等行业不需要自己写底层事件循环,也能搭建流程仿真模型。

  7. 2000

    AnyLogic 与多方法建模

    把离散事件、系统动力学、多智能体放进同一个模型,DES 不再孤立,开始与连续仿真、个体行为建模融合,用来处理更贴近现实的混合系统。

  8. 2010s → 现在

    数字孪生与云端仿真

    DES 成为数字孪生的核心引擎之一:实时接入产线、机场、医院的数据,在线推演“如果现在增加一个柜台会怎样”“哪一步是瓶颈”。本页的交互实验,就是这套思想的最小版本。

理解方法

DES 的核心是“时间跳到下一个关键事件”

不是一秒一秒傻算,而是直接跳到“下一位客户到达”或“下一个服务完成”的时刻。这会让流程仿真非常高效。

1

定义实体和资源

先明确谁会流动、谁在等待、哪些资源有限,例如顾客、任务、柜台、机器。

2

定义事件

到达、开始服务、结束服务、离开系统,这些事件是状态改变的唯一触发器。

3

把时间跳到下一个事件

系统不需要在无事发生的时间段里做计算,而是直接跳转到下一次状态改变。

4

统计流程表现

排队长度、资源利用率、平均等待时间和吞吐量,都是仿真结束后最重要的输出。

这页的教学实验

我们用多服务台排队系统来演示 DES。你会看到:当到达速度略快于处理速度时,队列会突然失控,这就是流程瓶颈最直观的样子。

交互实验室

调快到达、调慢服务,看看系统在哪一刻开始拥堵

这是一个事件驱动的排队系统。每次点击“推进一个事件”,系统时间都会直接跳到下一个关键时刻,而不是一点点前进。

排队系统现场
左侧是到达入口,中间是等待队列,右侧是服务台。你会直观看到客户什么时候开始排队、什么时候系统恢复顺畅。
等待中 服务中 已完成
队列长度曲线
只要到达强度稍微高过系统处理能力,队列曲线就会持续抬升,这是流程瓶颈的直观证据。
最近事件日志
DES 的本质就是事件序列。这里列出的每一项,都是系统状态真正发生改变的瞬间。

点击“推进一个事件”后,这里会出现到达、开始服务和完成服务的时间线。

模型公式如何随事件变化
这里把离散事件仿真的核心规则写成可计算公式。每推进一个事件,KaTeX 会同步刷新为当前状态。
t = 0.0 分 ρ = 0.00 c = 2 台
1. 下一事件由谁先到决定
2. 到达间隔与服务时长
3. 系统负荷与服务强度
4. 状态更新规则

系统尚未开始运行。点击“推进一个事件”后,这里会显示当前仿真时钟下的公式数值。

公式原理

把 DES 拆成十一条公式,一条一条看明白

前六条描述“系统怎么动”,后五条描述“动完之后怎么评估”。它们构成了排队类离散事件仿真的完整数学骨架。

状态在事件之间保持常数

这是 DES 最根本的一条假设。第 n 个事件发生后,系统状态冻结,直到第 n+1 个事件到来才改写。整张仿真图就是一条阶梯曲线。

下一事件时刻:谁先发生就跳给谁

系统只维护“下一次到达”和“下一次完成”两个候选时刻,取最小值作为新的仿真时钟。这就是事件调度法(event scheduling)的全部核心。

泊松到达与指数间隔

如果到达完全随机、彼此独立且强度恒定,那么在长度 t 的时间窗内到达 k 个客户的概率服从泊松分布,而相邻两次到达的间隔服从均值为 1/λ 的指数分布。

服务时长分布

指数服务的特征是“短任务多、长任务少”,并且具有无记忆性:已经服务了 3 分钟,剩下的时间期望依然是 1/μ。这既让模型好算,也解释了为什么排队系统里总会出现一些“特别慢”的客户。

服务强度 ρ:系统忙不忙

ρ 是到达速率与总服务能力的比值。ρ 小于 1 时系统长期稳定;ρ 等于或大于 1 时,队列会以正概率无限增长——这不是仿真算错了,而是系统本身撑不住。

Erlang-C:到达后要排队的概率

这是 M/M/c 排队系统的经典结果,由 Erlang 在电话交换机研究中提出。它给出“一个新来的客户发现所有服务台都忙、必须等待”的概率。

平均等待时间与平均队长

注意分母 cμ − λ:当到达速率 λ 逼近总服务能力 cμ 时,这个分母趋近于 0,等待时间会急剧上升。这就是“ρ 逼近 1 时系统突然崩掉”的数学解释。

Little 定律:三个量互相绑定

Little 定律不依赖具体分布,只要系统稳定就成立。它意味着:想降低队长,要么降低到达率,要么降低等待时间——没有第三条路。这也是排队分析中最常用的自检公式。

Kingman 近似:非指数分布怎么办

现实中到达和服务往往不是指数分布。Kingman 近似公式用变异系数 c_a、c_s 修正了 M/M/1 的结果,能快速估算 G/G/1 系统的等待时间,常用于早期方案筛选。

资源利用率怎么统计

利用率不是“感觉忙不忙”,而是把每台设备处于忙碌状态的时长累加起来,除以(设备数 × 总仿真时长)。它是判断“要不要加机器”的第一手依据。

为什么要重复多次、给出置信区间

因为随机性存在,单次运行的平均等待时间只是一个样本。规范做法是用不同的随机数种子重复 n 次独立运行,再用 t 分布给出置信区间,才能说“平均等待时间大约是 6 ± 0.8 分钟”。

关于“预热期”

系统刚开始仿真时,队列通常是空的,这一段属于暂态。如果统计时把它算进去,平均等待时间会被系统性低估。 标准做法是丢弃前一段预热期(warm-up period)的数据,只对稳态区间做统计,或者直接用足够多的重复实验取平均。

公式可视化

参数一动,曲线立刻跟着变

下面两张图会跟着上方实验面板的滑块实时刷新:左边是到达间隔与服务时长的分布形状,右边是平均等待时间随到达间隔变化的“爆炸曲线”。

指数分布长什么样
橙色是到达间隔的分布,蓝色是服务时长的分布。均值越小,曲线越陡——事件来得越密集。

虚线标记的是各自的均值。注意曲线在 0 附近最高:这意味着“很短的时间间隔”出现得最频繁,而“特别长的间隔”虽然少见,但一定会有。

等待时间随到达间隔的爆炸曲线
横轴是平均到达间隔,纵轴是理论平均排队等待时间。竖线是当前参数位置,红色区域是 ρ ≥ 1 的不稳定区。
服务强度 ρ —
平均排队等待 Wq —
平均排队长度 Lq —

以上三个量按 M/M/c 排队模型的理论公式实时计算,属于“理想化参考值”。页面上方的事件仿真带有随机波动,数值不会完全一致,但趋势应当吻合。

什么时候用

当系统由流程、资源和等待共同决定表现时

医院挂号、呼叫中心、工厂排产、物流分拣、收费站、机场安检,都很适合用离散事件仿真来理解瓶颈。

①

系统以事件推进

如果状态主要在到达、完成、切换这些时刻改变,而不是连续平滑变化,那么 DES 很自然。

②

资源是有限的

服务器、机器、工位、车辆、床位等有限资源,会自然产生等待和拥堵,这正是 DES 的主战场。

③

你需要定位瓶颈

如果你要回答“加一个柜台有没有用”“哪一步最堵”“等待会不会爆炸”,DES 非常直接。

方法边界

DES 很强,但它不是万能钥匙

清楚知道一个方法“什么时候不适用”,比知道它怎么用更重要。

不适合

连续变化的物理量

温度、压力、速度、液位这类连续演化的量,用微分方程或系统动力学更合适。硬用 DES 会需要极小的步长,得不偿失。

不适合

强空间耦合的流体与颗粒

需要精细刻画每个粒子的运动与碰撞时,应使用 CFD、离散元(DEM)等专用方法,DES 只能做粗粒度的排队近似。

要小心

数据不足时的分布假设

把所有到达都假设成泊松、所有服务都假设成指数,是最常见的建模偷懒。真实数据可能有高峰、有班次、有相关性,需要先做分布拟合与假设检验。

要小心

单次运行就下结论

一次仿真的结果只是随机过程中的一个样本。不做重复实验、不给置信区间、不考虑预热期,很容易得出误导性的结论。

一句话自检

如果你的系统可以用“实体在流程里流动、在资源前排队、由事件推动状态跳变”来描述, 那 DES 大概率是合适的选择;如果状态本身是连续演化的,请优先考虑连续系统仿真。

横向对比

它和其他仿真方法有什么不同

方法 时间推进方式 典型问题 主要输出
离散事件仿真 DES 跳到下一个事件时刻 排队、生产、物流、医院、呼叫中心 等待时间、队长、利用率、吞吐量
连续系统仿真 固定时间步长或数值积分 温度、压力、人口、库存连续变化 状态轨迹曲线、稳态与振荡特性
蒙特卡洛仿真 无时间概念,重复抽样 积分、风险评估、概率估计 概率分布、期望值、分位数
基于智能体的仿真 ABM 通常按固定步长推进 个体互动、涌现行为、传播扩散 宏观模式、群体分布、相变现象

实际工程中,这几种方法经常混用:比如 AnyLogic 允许在同一个模型里,用 DES 描述产线流程、用 ABM 描述工人行为、用系统动力学描述库存总量。