State · 系统此刻长什么样
队列长度、每台服务台是忙还是闲、已完成客户数、累计等待时间。这些量只在事件发生的那一刻才会被改写,其余时间原样冻结。
离散事件仿真把注意力放在“状态改变的时刻”:客户到达、机器空闲、任务完成、资源释放。 中间没有事件时,系统其实什么都不用算,这正是它高效又直观的地方。
只在事件发生时更新系统状态,所以它特别适合排队、制造、物流、医院、呼叫中心等流程系统。
离散事件仿真(Discrete-Event Simulation,DES)研究的是这样一类系统:状态只在某些离散时刻发生变化, 而在两次变化之间保持不变。所以真正需要计算的时间点非常少,仿真时钟是“跳”过去的,而不是“走”过去的。
队列长度、每台服务台是忙还是闲、已完成客户数、累计等待时间。这些量只在事件发生的那一刻才会被改写,其余时间原样冻结。
到达、开始服务、服务完成、资源释放、班次结束。事件是状态改变的唯一原因,也是仿真日志里一行行记录的内容。
仿真时钟不是每秒 +1,而是直接跳到“下一个最早事件的时刻”。无事发生的空档期,系统完全不计算,这是 DES 效率的来源。
到达间隔与服务时长由随机数发生器抽样。同一条流水线跑两遍,得到的平均等待时间不会完全一样,所以需要多次重复实验来给出区间估计。
服务台、机器、床位、车位都是有限的。资源数量一旦固定,系统能承受的到达强度也就有了上限,超过它队列会无限增长。
平均等待时间、平均队长、资源利用率、吞吐量、超时比例。仿真的产出不是一张截图,而是一组带置信区间的统计量。
1976 年,Bernard P. Zeigler 提出了 DEVS(Discrete Event System Specification), 用集合论的方式把“离散事件系统”这件事讲清楚,让仿真模型的语义第一次变得严格、可组合、可验证。
其中:X 是输入事件集合,S 是状态集合,Y 是输出事件集合,
δ_int 是内部状态转移(自己内部定时器到点),δ_ext 是外部状态转移(收到外部输入事件),
λ 是输出函数,ta 是时间推进函数——它告诉系统“当前状态还能维持多久”。
本页下方的排队实验,其实就是这个七元组的一个具体实例:X 是到达事件,S 是(队列长度, 各服务台剩余时间),
δ_ext 处理到达,δ_int 处理服务完成,ta 决定下一个事件发生在什么时候。
离散事件仿真不是凭空出现的学科。它从排队论出发,被编程语言武装,最后被形式化理论统一。
丹麦电话工程师 A. K. Erlang 在研究电话交换机拥塞时,提出了以他命名的 Erlang 分布与等待公式。这是人类第一次用数学描述“等待”这件事,也是 DES 最早的思想源头。
D. G. Kendall 引入 A/B/c 记号来描述排队系统(后来扩展为 A/B/c/K/m/Z)。今天写的 M/M/1、M/M/c,第一个 M 指到达过程服从马尔可夫(泊松)性质,第二个 M 指服务时间服从指数分布。
IBM 的 Geoffrey Gordon 发布通用仿真系统 GPSS,第一次让“用代码描述排队流程”变得可行;同年,John D. C. Little 严格证明了 L = λW,也就是后来无处不在的 Little 定律。
兰德公司的 Harry Markowitz(后来获得诺贝尔经济学奖)主导开发 SIMSCRIPT,把仿真专用语法和通用编程语言结合起来,让模型可以描述更复杂的逻辑分支与优先级。
Bernard P. Zeigler 提出 DEVS,用七元组统一定义离散事件系统。它让“模型”第一次有了严格的数学语义,也让多个子模型可以像积木一样组合、复用与验证。
C. Dennis Pegden 发布 SIMAN,随后演化为 Arena。图形化、拖拽式的建模方式,让制造、物流、医院等行业不需要自己写底层事件循环,也能搭建流程仿真模型。
把离散事件、系统动力学、多智能体放进同一个模型,DES 不再孤立,开始与连续仿真、个体行为建模融合,用来处理更贴近现实的混合系统。
DES 成为数字孪生的核心引擎之一:实时接入产线、机场、医院的数据,在线推演“如果现在增加一个柜台会怎样”“哪一步是瓶颈”。本页的交互实验,就是这套思想的最小版本。
不是一秒一秒傻算,而是直接跳到“下一位客户到达”或“下一个服务完成”的时刻。这会让流程仿真非常高效。
先明确谁会流动、谁在等待、哪些资源有限,例如顾客、任务、柜台、机器。
到达、开始服务、结束服务、离开系统,这些事件是状态改变的唯一触发器。
系统不需要在无事发生的时间段里做计算,而是直接跳转到下一次状态改变。
排队长度、资源利用率、平均等待时间和吞吐量,都是仿真结束后最重要的输出。
我们用多服务台排队系统来演示 DES。你会看到:当到达速度略快于处理速度时,队列会突然失控,这就是流程瓶颈最直观的样子。
这是一个事件驱动的排队系统。每次点击“推进一个事件”,系统时间都会直接跳到下一个关键时刻,而不是一点点前进。
点击“推进一个事件”后,这里会出现到达、开始服务和完成服务的时间线。
系统尚未开始运行。点击“推进一个事件”后,这里会显示当前仿真时钟下的公式数值。
前六条描述“系统怎么动”,后五条描述“动完之后怎么评估”。它们构成了排队类离散事件仿真的完整数学骨架。
这是 DES 最根本的一条假设。第 n 个事件发生后,系统状态冻结,直到第 n+1 个事件到来才改写。整张仿真图就是一条阶梯曲线。
系统只维护“下一次到达”和“下一次完成”两个候选时刻,取最小值作为新的仿真时钟。这就是事件调度法(event scheduling)的全部核心。
如果到达完全随机、彼此独立且强度恒定,那么在长度 t 的时间窗内到达 k 个客户的概率服从泊松分布,而相邻两次到达的间隔服从均值为 1/λ 的指数分布。
指数服务的特征是“短任务多、长任务少”,并且具有无记忆性:已经服务了 3 分钟,剩下的时间期望依然是 1/μ。这既让模型好算,也解释了为什么排队系统里总会出现一些“特别慢”的客户。
ρ 是到达速率与总服务能力的比值。ρ 小于 1 时系统长期稳定;ρ 等于或大于 1 时,队列会以正概率无限增长——这不是仿真算错了,而是系统本身撑不住。
这是 M/M/c 排队系统的经典结果,由 Erlang 在电话交换机研究中提出。它给出“一个新来的客户发现所有服务台都忙、必须等待”的概率。
注意分母 cμ − λ:当到达速率 λ 逼近总服务能力 cμ 时,这个分母趋近于 0,等待时间会急剧上升。这就是“ρ 逼近 1 时系统突然崩掉”的数学解释。
Little 定律不依赖具体分布,只要系统稳定就成立。它意味着:想降低队长,要么降低到达率,要么降低等待时间——没有第三条路。这也是排队分析中最常用的自检公式。
现实中到达和服务往往不是指数分布。Kingman 近似公式用变异系数 c_a、c_s 修正了 M/M/1 的结果,能快速估算 G/G/1 系统的等待时间,常用于早期方案筛选。
利用率不是“感觉忙不忙”,而是把每台设备处于忙碌状态的时长累加起来,除以(设备数 × 总仿真时长)。它是判断“要不要加机器”的第一手依据。
因为随机性存在,单次运行的平均等待时间只是一个样本。规范做法是用不同的随机数种子重复 n 次独立运行,再用 t 分布给出置信区间,才能说“平均等待时间大约是 6 ± 0.8 分钟”。
系统刚开始仿真时,队列通常是空的,这一段属于暂态。如果统计时把它算进去,平均等待时间会被系统性低估。 标准做法是丢弃前一段预热期(warm-up period)的数据,只对稳态区间做统计,或者直接用足够多的重复实验取平均。
下面两张图会跟着上方实验面板的滑块实时刷新:左边是到达间隔与服务时长的分布形状,右边是平均等待时间随到达间隔变化的“爆炸曲线”。
虚线标记的是各自的均值。注意曲线在 0 附近最高:这意味着“很短的时间间隔”出现得最频繁,而“特别长的间隔”虽然少见,但一定会有。
以上三个量按 M/M/c 排队模型的理论公式实时计算,属于“理想化参考值”。页面上方的事件仿真带有随机波动,数值不会完全一致,但趋势应当吻合。
医院挂号、呼叫中心、工厂排产、物流分拣、收费站、机场安检,都很适合用离散事件仿真来理解瓶颈。
如果状态主要在到达、完成、切换这些时刻改变,而不是连续平滑变化,那么 DES 很自然。
服务器、机器、工位、车辆、床位等有限资源,会自然产生等待和拥堵,这正是 DES 的主战场。
如果你要回答“加一个柜台有没有用”“哪一步最堵”“等待会不会爆炸”,DES 非常直接。
清楚知道一个方法“什么时候不适用”,比知道它怎么用更重要。
温度、压力、速度、液位这类连续演化的量,用微分方程或系统动力学更合适。硬用 DES 会需要极小的步长,得不偿失。
需要精细刻画每个粒子的运动与碰撞时,应使用 CFD、离散元(DEM)等专用方法,DES 只能做粗粒度的排队近似。
把所有到达都假设成泊松、所有服务都假设成指数,是最常见的建模偷懒。真实数据可能有高峰、有班次、有相关性,需要先做分布拟合与假设检验。
一次仿真的结果只是随机过程中的一个样本。不做重复实验、不给置信区间、不考虑预热期,很容易得出误导性的结论。
如果你的系统可以用“实体在流程里流动、在资源前排队、由事件推动状态跳变”来描述, 那 DES 大概率是合适的选择;如果状态本身是连续演化的,请优先考虑连续系统仿真。
| 方法 | 时间推进方式 | 典型问题 | 主要输出 |
|---|---|---|---|
| 离散事件仿真 DES | 跳到下一个事件时刻 | 排队、生产、物流、医院、呼叫中心 | 等待时间、队长、利用率、吞吐量 |
| 连续系统仿真 | 固定时间步长或数值积分 | 温度、压力、人口、库存连续变化 | 状态轨迹曲线、稳态与振荡特性 |
| 蒙特卡洛仿真 | 无时间概念,重复抽样 | 积分、风险评估、概率估计 | 概率分布、期望值、分位数 |
| 基于智能体的仿真 ABM | 通常按固定步长推进 | 个体互动、涌现行为、传播扩散 | 宏观模式、群体分布、相变现象 |
实际工程中,这几种方法经常混用:比如 AnyLogic 允许在同一个模型里,用 DES 描述产线流程、用 ABM 描述工人行为、用系统动力学描述库存总量。