时间不流逝,
只在事件之间跳跃。
一句话:系统的状态只在离散事件发生的瞬间改变,事件之间什么也不发生——所以仿真时钟不必连续推进,它直接从一个事件跳到下一个事件。这一页拆开 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)。
while (t < t_end) { e = FEL.pop_min_time() // 取最早事件:时钟的直接来源 t = e.time // 时钟跳跃——不是步进 apply(e.state_change) // 状态只在事件时刻改变 FEL.schedule(e.new_events) // 新事件写回事件表 }
03 · 架构组成
一台 DES「机器」由六个部件组成,分工严格正交:把「排队银行」换成「车间调度」,只需要换状态变量与事件例程,调度器和时钟原封不动。这是 DES 六十余年来框架设计的核心遗产。
状态变量
描述系统的最小变量集——队列长度、忙碌标志、在制品数。
事件例程
每类事件一个函数:到达、离开、故障、修复——状态改变只写在这里。
仿真时钟
当前仿真时间,只在事件时刻更新,事件之间完全静止。
未来事件表
按时间排序的待发生事件:取最小、插新事件,模型的引擎室。
随机数源
到达间隔、服务时长的抽样来源——通常用逆变换法。
统计收集器
等待时间、队长、利用率——实验真正的产出物。
04 · 数学骨架:从泊松到 M/M/1
到达通常被建模为泊松过程:间隔独立同分布、服从指数分布。指数分布的无记忆性让「到达与过去无关」成为数学事实,而不是直觉假设。
单队列-单服务台、泊松到达、指数服务——记作 M/M/1——是排队论里能被完整解析求解的最小系统,也是检验 DES 代码时最好的对照组。
用法提示:写 DES 之前先算出 M/M/1 的解析解,写完之后比较仿真值与解析值——这是最便宜的一类模型验证,也是 /knowledge 页「验证仍是短板」的最易上手解法。
05 · 适用与失效
它擅长
- 流程与排队系统:医院门诊、物流分拨、生产线。
- 资源竞争与瓶颈定位——哪台机器、哪个环节是约束。
- 随机离散动态:到达、故障、订单、审批。
- 运转策略的 what-if:排班、容量、优先级规则。
它失效
- 累积与反馈——说不出「库存为何持续下降」这类存量问题。
- 连续动态——温度、水位、流行率这类连续变化的量。
- 宏观结构——个体层面的事件堆不出可靠的长期趋势。
这些不是缺陷,而是范式边界——在对照页里,它们恰好是 SD 与 ABM 的主场。
06 · 耦合接口提示
放进混合模型时,DES 通常负责「流程执行层」:它向其他范式导出实体流、完成事件与排队指标,也接收它们的输入——智能体的决策变成新到达,宏观需求率改变到达参数。
最关键的技术点是时间尺度对齐:DES 的事件时刻与 SD 的连续步长、ABM 的离散周期必须有明确的同步策略,否则两层信息会在时间上错位。三种范式耦合属性的完整对照,见对照与衔接页。
查看完整对照表 →DES 在耦合中的典型分工
- 导出:实体到达流、完成/离开事件、平均等待与利用率。
- 接收:智能体的订单决策、宏观层的需求率或产能参数。
- 同步:事件时间 ↔ 连续步长,需要时间推进协议(见对照页)。