概述
- 离散事件仿真(DES)介绍
- 术语
- 我们如何推进仿真时间?
- 离散事件仿真的组成部分和组织结构
- 示例:单服务器排队系统的仿真
- 建模世界观(不同的方法)
- 仿真和模型构建的步骤
离散事件仿真(DES)
- 离散事件仿真模拟的是一个系统,其状态只能在时间的离散点发生变化。
- 假设在连续的状态转换之间没有发生任何相关的事情。
- 系统由称为实体的对象组成,这些实体具有称为属性的特定属性。
- 系统状态是表示系统实体的属性或状态变量的集合。
- 事件是时间中的瞬时发生,可能会改变系统的状态。
术语
- 事件随机发生(模仿现实生活)并可能改变系统的状态。
- 事件启动一个活动,即实体参与某些操作的时间长度。
- 实体、属性、事件、活动以及这些组件之间的相互关系在系统的模型中定义。
- 任何位于系统边界之外但可以影响系统的对象和活动构成了系统环境。
- 模拟运行的时间段被称为模拟的持续时间。
- 过程是可能包含多个活动的事件序列。
事件、活动和过程的关系
示例:一个服装制造厂
- 实体:机器、工人、材料包、机器维修工
- 机器的属性:其操作(缝边、缝制、压制等)、效率、当前分配的工人
- 工人的属性:他的技能、效率等级等。
- 活动:缝制、缝边、检查、包装等。
- 事件:一包材料到达工作站进行缝制,工人去吃午饭
- 状态:操作机械的工人数量
示例:单服务器系统的建模与仿真
- 实体:客户、服务器
- 客户的属性:所需服务
- 服务器的属性:服务器的技能(其服务率)
- 事件:客户到达;客户离开
- 活动:服务客户,等待新客户
如何在模拟时间中模拟事件?
- 维护一个事件列表以确定接下来发生什么。事件列表指示每个单元的不同类型事件发生的时间。(也称为事件日历、未来事件列表、事件日记、日历队列)
- 一个时钟来标记事件在时间中的发生。
模拟时间的推进
- 每个(动态)模拟研究的基本要素是模拟时间流逝的机制。因此,每个模型都包含一个称为内部时钟或模拟时钟的变量。
- 我们如何推进模拟时间?
- 固定增量时间推进方法(同步时间模型)
- 下一个事件时间推进方法(异步时间模型)
同步时间模型
如何推进模拟时间?
- 固定增量时间推进方法(同步时间模型)
- 时钟通过相同的时间增量∆t更新。
固定增量时间推进
- 每次时钟更新后,都会识别出在此间隔期间预定发生的所有事件。事件被认为发生在间隔的末尾,系统状态相应更新。
- 用于模拟事件只在某些固定长度的间隔发生的系统。
- 缺点:
- 浪费扫描 - 在∆t期间没有事件发生
- 精度问题 - 大∆t失去精度(假设事件只在∆t的倍数发生)
异步时间模型
如何推进模拟时间?
- 下一个事件时间推进(异步时间模型)
- 时间从当前事件的时间推进到下一个预定事件的时间,即模拟跳过非活动期。
下一个事件时间推进
- 这是更常用的方法。
- 时间从当前事件的时间推进到下一个预定事件的时间。
- 模拟跳过非活动期。以增加编程工作为代价,节省了计算机运行模拟的时间。
- 这种方法被称为事件驱动的离散事件模拟(DES),是异步的,与之相对的是同步的逐步时间方法。
未来事件列表(FEL)
- 同步和异步模型都假设事件按时间顺序排列。
- 事件日历(也称为未来事件列表、事件列表、事件日记、事件日历)包含所有预定事件,按时间顺序排列。在模拟器中,这只是一个数据结构,例如列表、树。
执行例程
- 一个用于管理时钟和日历的例程 - 执行例程(也称为执行监视器、调度器)。
- 获取下一个预定事件,推进模拟时间,并将控制权转移到适当的操作例程(事件、活动、过程)。
- 这个例程的性质取决于世界观(稍后讨论)。
- 世界观的差异在于下一个事件选择的策略,以及操作的类型,例如事件、活动或过程。
执行例程(下一个事件时间推进算法)
- 数据结构:未来事件列表(FEL)、状态向量(SV)、时钟(CL)
- 重复
- 从FEL中移除最小的事件(时间为t)
- 设置CL=t
- 处理事件(并修改SV)
- 模拟结束
离散事件模拟的组件和组织
- 系统状态:描述特定时间系统所需的状态变量集合。
- 模拟时钟:给出模拟时间当前值的变量。
- 事件列表:包含每种事件类型下次发生的时间的列表。
- 统计计数器:用于存储系统性能相关统计信息的变量。
- 初始化例程:在时间零初始化模拟模型的子程序。
- 计时例程:确定事件列表中的下一个事件,并将模拟时钟推进到该事件发生的时间的子程序。
- 事件例程:当特定类型的事件发生时更新系统状态的子程序(每种事件类型一个例程)。
- 库例程:用于生成随机观测值的一组子程序,这些观测值来自于作为模拟模型一部分确定的概率分布。
- 报告生成器:计算统计计数器的估计值(从所需性能指标),并在模拟结束时生成报告的子程序。
- 主程序:调用计时例程以确定下一个事件,然后将控制权转移到相应的事件例程以适当更新系统状态的子程序。主程序还可能检查终止条件并调用报告生成器。
离散事件模拟器的组织
示例:单服务器排队系统的模拟(M/M/1)
- 单队列单服务器系统
- 本节详细展示了如何模拟单服务器排队系统。其模拟方式相当具有代表性。
单服务器排队系统的建模与模拟
- 建模方面
- 客户到达系统:到达间隔时间
- 服务政策:先到先服务(FIFO)
- 终止标准:当第n个客户开始服务时
- 模拟
- 时间推进机制: 下一个事件时间推进
- 事件类型:
- A:客户到达系统
- D:客户离开
- 事件例程:
- 每种事件类型一个
单服务器排队系统的模拟
- 问题陈述
- 到达间隔时间A1, A2, ... 是独立同分布(IID)随机变量(“同分布”意味着到达间隔时间具有相同的概率分布)。
- 连续客户的服务时间S1, S2, ... 是IID随机变量,且与到达间隔时间独立。
- 模拟将在固定数量的客户(n)完成队列中的延迟后结束,即当第n个客户开始服务时模拟将停止。
- 为了衡量这个系统的性能,我们看三个量的估计:
- 队列中的平均延迟,d(n)
- 队列中客户的时间平均数,q(n)
- 服务器的利用率,u(n)
● 队列中的平均延迟,d(n)为
- 其中 D1, D2,…,Dn 是客户延迟
- 帽子符号 (^) 表示估计器
● 队列中的时间平均客户数量,q(n)为
- 其中 pi 是 Q(t) 等于 i 的时间比例的预期值。
- Q(t) 表示时间 t 时队列中的客户数量,对于 t ≥ 0
● 举例说明,n = 8
- 到达时间:0.4, 1.6, 2.1, 3.8, 4.0, 5.6, 5.8, 7.2
- 离开(服务完成)时间:2.4, 3.1, 3.3, 4.9, 8.6
● 如果我们让 Ti 表示队列长度为 i 的总模拟时间,那么 T(n) = T0 + T1 + T2 + …。
● 由于 Q(t) 下的曲线面积是一个积分,我们可以写为:
● 估计器 q(n) 可以表示为:
● 服务器利用率,u(n),是服务器忙碌的时间比例。我们定义“忙碌函数”为
- B(t) = 1,如果服务器在时间 t 忙碌
- B(t) = 0,如果服务器在时间 t 空闲
直观解释
- 解释在时间 e0 = 0 和连续13个事件发生的时间 e1, e2, …, e13 时,单服务器排队系统的模拟模型在计算机中的表示。
- 假设:
- 客户的到达间隔时间为:
- A1 = 0.4, A2 = 1.2, A3 = 0.5, A4 = 1.7, A5 = 0.2, …
- 客户的服务时间为:
- S1 = 2.0, S2 = 0.7, S3 = 0.2, S4 = 1.1, …
- 客户的到达间隔时间为:
- 注意,不需要声明时间单位是什么(分钟、小时等),但需要确保所有时间量都用相同的单位表示。
- 在实际模拟中,Ai 和 Si 将从它们对应的概率分布中生成。
系统和其计算机表示的快照
单服务器系统的模拟:执行例程
- 主(执行例程):
- 设置时钟 CLOCK = 0
- 将累积统计设置为 0
- 定义初始系统状态(队列空,服务器空闲)
- 生成第一个到达事件的发生时间并放入 FEL
- 从 FEL 选择下一个事件(到达或离开事件)
- 将模拟时钟推进到下一个事件的时间
- 处理这个事件(执行相应的事件例程)
- 如果不是模拟结束,转到步骤 5
单服务器系统的模拟:事件例程
● 到达事件例程
- 描述客户到达系统时要做的事情
● 离开事件例程
- 描述客户离开系统时要做的事情
到达例程
- 生成下一个到达事件的发生时间,并将到达事件放入未来事件列表
- 如果服务器空闲,则
- 设置服务器为忙碌
- 更新服务器空闲时间统计
- 生成离开事件的发生时间,并将离开事件放入未来事件列表 否则(服务器忙碌)
- 将客户放入队列
- 更新队列长度统计
离开例程
- 销毁当前事件
- 如果队列为空,则
- 设置服务器为空闲
- 更新服务器空闲时间统计 否则
- 从队列中移除下一个客户
- 更新队列等待时间统计
- 生成离开事件的发生时间,并将离开事件放入未来事件列表
三种建模世界观
- 事件调度 - 关注事件及其对系统状态的影响
- 过程互动 - 关注一个实体及其在“通过”系统时所经历的事件和活动序列
- 活动扫描 - 使用预定时间和条件测试来从事件列表中选择下一个事件
重要:所有三种方法都使用事件概念来推进模拟时钟。
事件调度方法
- 在单服务器队列中,只有两种事件类型:
- 到达
- 离开或服务完成
- 状态:队列长度,服务器状态
- 事件调度方法包括以下两个阶段:
- 将时钟推进到下一个事件的时间,
- 执行由于发生的下一个预定事件
- 主要、到达和离开例程的算法已在前面讨论过
过程互动方法
- 过程描述一个实体在其生命周期内参与的操作。例如:
- 客户过程
- 加入队列,等待队列,接受服务,离开系统
- 服务器过程
- 等待客户,服务客户
- 客户过程
- 一个实体可能在过程中的各个点被阻塞或延迟
- 在过程互动方法中,执行例程维护两个按时间顺序排列的事件列表:
- 未来事件列表 (FEL) - 包含在未来时钟时间预定的过程
- 当前事件列表 (CEL) - 包含在当前时间有资格执行但在其过程模拟的某个阶段被阻塞并等待在队列中的过程
- 执行例程的功能是:
- 将时钟推进到下一个事件的发生时间 (FEL)
- 所有预定在当前时间的事件从 FEL 移动到 CEL
- 扫描 CEL 以查看是否有任何实体可以执行它们过程中的下一步
活动扫描方法
- 采用固定时间增量和基于规则的方法来决定是否可以启动任何活动。
- 建模者专注于模型的活动以及允许活动启动的条件。
- 在每个时间步骤中,会检查条件,如果条件为真,则相应的活动开始。
- 纯粹的活动扫描是浪费和缓慢的。
- 通常与事件调度结合使用。
• 三阶段方法,其中我们将活动分为三类
• B活动是必然发生的活动
• C活动是有条件的活动
• B活动会提前在未来事件列表 (FEL) 上安排好
• 在每次时间推进时,检查是否有B活动要运行并运行它们
• 然后扫描C活动,看它们是否可以启动
• 重复此过程,直到没有更多事件
• 阶段1:从FEL中删除事件(时间前进到事件时间),以及在相同事件时间发生的所有事件
• 阶段2:执行这些事件
• 阶段3:扫描条件并激活那些可以启动的C活动