Module 01 · 离散事件仿真

时间不流逝,
只在事件之间跳跃。

一句话:系统的状态只在离散事件发生的瞬间改变,事件之间什么也不发生——所以仿真时钟不必连续推进,它直接从一个事件跳到下一个事件。这一页拆开 DES 的内部构造:事件表如何调度、排队系统如何运转、以及它最著名的数学骨架 M/M/1。

01 · 直觉与定义

想象一家只有一个柜台的银行:顾客随机到达,排队等候,被服务,然后离开。DES 的世界里只有这些「瞬间」有意义——第 3 分钟某人到达、第 7 分钟柜台空闲、第 11 分钟下一位被叫号。两个瞬间之间,系统状态(队列长度、柜台忙闲)保持不变。

事件(event)因此被定义为「在某个时间点上、瞬间改变系统状态的事情」。一个 DES 模型 = 状态变量 + 事件例程 + 时间推进规则。它对「事件之间发生了什么」不感兴趣——那正是它与 SD 的分界线。

三种建模视角

实践中 DES 有三种写法:事件导向(直接调度事件)、进程导向(把实体的生命周期写成进程,如 SimPy、AnyLogic 的流程块)、活动扫描(扫描活动何时能开始)。工程上进程导向最常用,但内核都是同一台「事件调度机」。

到达队列处理服务台离开
单队列-单服务台:作业进入队列等待,被服务后离开——系统状态只在「到达」与「离开」两类事件时刻改变。

02 · 核心机制:事件表与下次事件推进

DES 的心脏是一张按时间排序的未来事件表(Future Event List, FEL)。时钟推进规则只有一条:取 FEL 中最早的事件,把时钟直接跳到那个时刻。这条规则叫「下次事件时间推进」(next-event time advance)。

两个推论值得记住。其一,时钟只在事件时刻有取值,仿真里的「当前时间」是离散的;其二,事件表操作的效率决定模型上限——成熟实现用优先队列把一次调度降到 O(log n)。

t = 2t = 9t = 10t = 17t = 24now
指针在事件之间完全停顿,然后瞬间跳到下一个事件——仿真时钟从不滑动。注意 t = 9 → t = 10 的短跳。
tn+1 = min { t | t ∈ FEL }下一次时钟读数 = 未来事件表中的最小时间戳。
while (t < t_end) {
  e = FEL.pop_min_time()      // 取最早事件:时钟的直接来源
  t = e.time                  // 时钟跳跃——不是步进
  apply(e.state_change)       // 状态只在事件时刻改变
  FEL.schedule(e.new_events)  // 新事件写回事件表
}

03 · 架构组成

一台 DES「机器」由六个部件组成,分工严格正交:把「排队银行」换成「车间调度」,只需要换状态变量与事件例程,调度器和时钟原封不动。这是 DES 六十余年来框架设计的核心遗产。

随机数源RNG仿真时钟simulation clock未来事件表FEL事件调度器scheduler系统状态state统计收集器statistics间隔抽样取最早写入跳到 t施加改变新事件采样
调度器取最早事件 → 跳时钟 → 改状态 → 写回新事件:这就是 DES 全部的心跳。
State

状态变量

描述系统的最小变量集——队列长度、忙碌标志、在制品数。

Event

事件例程

每类事件一个函数:到达、离开、故障、修复——状态改变只写在这里。

Clock

仿真时钟

当前仿真时间,只在事件时刻更新,事件之间完全静止。

FEL

未来事件表

按时间排序的待发生事件:取最小、插新事件,模型的引擎室。

RNG

随机数源

到达间隔、服务时长的抽样来源——通常用逆变换法。

Stats

统计收集器

等待时间、队长、利用率——实验真正的产出物。

04 · 数学骨架:从泊松到 M/M/1

到达通常被建模为泊松过程:间隔独立同分布、服从指数分布。指数分布的无记忆性让「到达与过去无关」成为数学事实,而不是直觉假设。

P(τ ≤ t) = 1 − e−λt到达间隔 τ 的分布;λ 为到达率——单位时间内的平均到达数。
N(t) ~ Poisson(λt)到时刻 t 为止累计到达个数服从泊松分布。

单队列-单服务台、泊松到达、指数服务——记作 M/M/1——是排队论里能被完整解析求解的最小系统,也是检验 DES 代码时最好的对照组。

ρ = λμ · L = ρ1 − ρ = λμ − λ · W = 1μ − λρ 利用率必须小于 1(否则队列无限增长);L 为系统内平均顾客数(含正在接受服务者),W 为平均逗留时间。注意 L 不是排队长度——平均排队长度为 L_q = ρ²/(1 − ρ)。
L = λWLittle 定律——稳态下系统内平均顾客数 = 到达率 × 平均逗留时间,对任意排队系统成立(注意 L 与上式的 L 同口径,均指系统内而非队列中)。

用法提示:写 DES 之前先算出 M/M/1 的解析解,写完之后比较仿真值与解析值——这是最便宜的一类模型验证,也是 /knowledge 页「验证仍是短板」的最易上手解法。

05 · 适用与失效

它擅长

  • 流程与排队系统:医院门诊、物流分拨、生产线。
  • 资源竞争与瓶颈定位——哪台机器、哪个环节是约束。
  • 随机离散动态:到达、故障、订单、审批。
  • 运转策略的 what-if:排班、容量、优先级规则。

它失效

  • 累积与反馈——说不出「库存为何持续下降」这类存量问题。
  • 连续动态——温度、水位、流行率这类连续变化的量。
  • 宏观结构——个体层面的事件堆不出可靠的长期趋势。

这些不是缺陷,而是范式边界——在对照页里,它们恰好是 SD 与 ABM 的主场。

06 · 耦合接口提示

放进混合模型时,DES 通常负责「流程执行层」:它向其他范式导出实体流、完成事件与排队指标,也接收它们的输入——智能体的决策变成新到达,宏观需求率改变到达参数。

最关键的技术点是时间尺度对齐:DES 的事件时刻与 SD 的连续步长、ABM 的离散周期必须有明确的同步策略,否则两层信息会在时间上错位。三种范式耦合属性的完整对照,见对照与衔接页。

查看完整对照表 →

DES 在耦合中的典型分工

  • 导出:实体到达流、完成/离开事件、平均等待与利用率。
  • 接收:智能体的订单决策、宏观层的需求率或产能参数。
  • 同步:事件时间 ↔ 连续步长,需要时间推进协议(见对照页)。