全书目录
全书目录
1 仿真导论
仿真(simulation)是对真实世界过程或系统运行过程的模仿。无论采用手工方式还是计算机方式,仿真都包含两个要素:生成系统的一段人造历史(artificial history),并观察这段人造历史,从而推断真实系统的运行特性。
研究系统随时间演化的行为,方法是建立仿真模型(simulation model)。该模型通常以一组关于系统如何运行的假设的形式出现。这些假设通过系统中各实体(entity,即关注的对象)之间的数学、逻辑和符号关系来表达。模型一旦建立并通过验证(validated),就可以用它来研究关于真实世界的各种"如果……会怎样"(what if)问题。可以先对系统的潜在变更进行仿真,以预测其对系统性能的影响。仿真也可用于研究尚处于设计阶段、尚未建成的系统。因此,仿真建模既可作为分析工具,用于预测对既有系统的变更所产生的效果,也可作为设计工具,用于预测新系统在各种不同情形下的性能。
在某些情况下,所建立的模型足够简单,可以用数学方法"求解"。这类解可能通过微分学、概率论、代数方法或其他数学技术获得。解通常由一个或多个数值参数构成,这些参数称为系统的性能度量(measures of performance)。然而,许多真实世界系统极其复杂,其模型几乎不可能用数学方法求解。在这些情况下,可以采用基于计算机的数值仿真来模仿系统随时间的行为。从仿真中收集数据,就如同在观察一个真实系统一样。这些由仿真生成的数据被用来估计系统的性能度量。
本章首先讨论何时应当使用仿真、仿真的优点与缺点,以及仿真的实际应用领域。随后探讨系统与模型的概念。最后给出建立并使用系统仿真模型的步骤概要。
1 仿真何时是恰当的工具
专用仿真语言的出现、运算成本不断下降所带来的巨量计算能力,以及仿真方法学的进展,使仿真成为运筹学与系统分析中被最广泛使用和认可的工具之一。何种情形下适合使用仿真,已有众多作者作过讨论,从 Naylor 等人 [1966] 到 Shannon [1998]。仿真可用于以下目的:
- 仿真使得对复杂系统内部交互作用、或复杂系统内某个子系统的交互作用进行研究、开展实验成为可能。
- 信息、组织和环境方面的变更可以先进行仿真,从而观察这些改变对模型行为的影响。
- 在设计仿真模型过程中所获得的知识,对提出针对所研究系统的改进建议极有价值。
- 改变仿真输入并观察相应的输出,可以产生有价值的洞察:哪些变量最为重要,以及变量之间如何相互作用。
- 仿真可以用作一种教学手段,以强化解析求解方法。
- 仿真可以在实施之前对新的设计或政策进行试验,从而为可能发生的事情做好准备。
- 仿真可以用来验证解析解。
- 对机器的不同能力配置进行仿真,有助于确定其需求。
- 为培训而设计的仿真模型,使学习成为可能,且无须付出在职培训的成本与干扰。
- 动画可以展示系统的仿真运行过程,使方案得以可视化。
- 现代系统(工厂、晶圆厂、服务组织等)极其复杂,其内部交互作用只能通过仿真来处理。
2 仿真何时不适用
本节基于 Banks 与 Gibson [1997] 的一篇文章,该文给出了十条用于判断何时不宜使用仿真的规则。第一条规则指出:当问题可以凭常识解决时,不应使用仿真。文中举了一个汽车牌照服务设施的例子,顾客随机到达,平均到达率为 100 人/小时,而平均服务率为 12 人/小时。为了确定所需服务人员的最小数量,并不需要仿真。只须计算 100/12 = 8.33,即可得出需要 9 名或更多服务人员的结论。
第二条规则指出:若问题可以用解析方法求解,则不应使用仿真。例如,在某些条件下,上述例子中的平均等待时间可以利用 www.bcnn.net 提供的工具求得。
第三条规则指出:若直接做实验的成本更低,则不应使用仿真。文中以一家快餐店汽车穿梭通道(drive-in)为例:为了确定增设一个接单点对顾客等待时间的影响,安排一个人使用手持终端并通过语音接单,其成本低于开展仿真研究。
第四条规则指出:若成本超过收益,则不应使用仿真。如第 12 节将要讨论的,完成一次仿真包含许多步骤,且每一步都必须扎实地完成。倘若一项仿真研究花费 2 万美元,而可能带来的节省仅为 1 万美元,那么仿真就不合适。
第五和第六条规则指出:若资源或时间不具备,则不应开展仿真。如果估计仿真成本为 2 万美元,而只有 1 万美元可用,那么建议不要贸然启动仿真研究。同理,若决策需要在两周内做出,而仿真要花一个月,那么也不建议开展仿真研究。
仿真需要数据,有时候需要大量数据。若没有数据可依,连估计值都没有,则不建议使用仿真。下一条规则涉及能否验证和确认模型。若时间不够,或人手不足,仿真就不适用。
如果管理者抱有不切实际的期望,过早要求过多东西,或者高估了仿真的能力,那么仿真也可能不适用。
最后,若系统行为过于复杂或无法定义,仿真就不适用。人类行为有时极其复杂,难以建模。
3 仿真的优点与缺点
仿真对客户而言具有直觉上的吸引力,因为它模拟了真实系统中发生的事情,或模拟了处于设计阶段的系统给人的感知。仿真的输出数据应当与从真实系统中可记录到的输出直接对应。此外,还可以在不依赖可疑假设(诸如"每个随机变量服从同一统计分布"这类数学可解模型的假设)的前提下,为系统建立仿真模型。由于这些以及其他原因,仿真常常成为问题求解的首选技术。
与优化模型不同,仿真模型是被"运行"(run)而非被"求解"(solved)的。给定一组特定的输入与模型特征,模型被运行,仿真行为被观察。这一改变输入与模型特征的过程,产生一组待评估的方案(scenario)。随后针对这些方案给出推荐方案,无论是对既有系统的分析还是对新系统的设计,最终都可将推荐的解决方案付诸实施。
仿真有许多优点,但也有一些缺点。Pegden、Shannon 与 Sadowski [1995] 列举了这些优缺点。部分优点如下:
- 可以在不干扰真实系统日常运行的前提下,探索新的政策、作业流程、决策规则、信息流、组织流程等。
- 可以对新的硬件设计、物理布局、运输系统等进行试验,而无须为购置它们而投入资源。
- 关于某些现象如何发生或为何发生的假设,可以就其可行性进行检验。
- 时间可以被压缩或拉伸,从而使所研究的现象得以加速或减速。
- 可以获得关于变量之间相互作用的洞察。
- 可以获得关于各变量对系统性能重要性的洞察。
- 可以进行瓶颈分析,以发现在制品、信息、材料等被过度延误的环节。
- 仿真研究有助于理解系统实际上是如何运行的,而不仅仅停留在人们认为系统如何运行的层面上。
- “如果……会怎样"类问题可以得到解答。这在新系统设计中尤其有用。
部分缺点如下:
- 建模需要专门训练。这是一门需要随时间、经由经验习得的技艺。而且,若两个模型由不同的行家分别构建,它们或许有相似之处,但完全相同的可能性极低。
- 仿真结果可能难以解释。多数仿真输出本质上是随机变量(它们通常基于随机输入),因此很难分辨某个观察结果究竟源于系统内部的相互关系,还是源于随机性。
- 仿真建模与分析可能既耗时又昂贵。在建模与分析上削减资源,可能导致仿真模型或分析不足以胜任任务。
- 在某些情况下,即便解析解存在甚至更可取,人们仍会使用仿真,正如第 2 节所讨论的。这在某些排队系统的仿真中可能尤为明显,因为那里已有闭式排队模型(closed-form queueing model)可用。
为仿真辩护,针对上述四点缺点分别可以作如下回应:
- 仿真软件厂商一直在积极开发包含若干模型的软件包,这些模型只需输入数据即可运行。这类模型有"模拟器”(simulator)或"模板"(template)这样的通用称谓。
- 许多仿真软件厂商已在其软件包中开发了输出分析功能,用以进行非常细致的分析。
- 今天的仿真比昨天做得更快,明天还会更快,这既得益于硬件的进步(可以快速运行方案),也得益于众多仿真软件包的进步。例如,某些仿真软件包含用于物料搬运建模的构件,可使用叉车、输送带和自动导引车(AGV)这类运输设备。
- 闭式模型无法分析实践中遇到的大多数复杂系统。在本书两位作者多年的咨询实践中,没有遇到过一个可以用闭式解求解的问题。
4 应用领域
仿真的应用极为广泛。冬季仿真会议(Winter Simulation Conference, WSC)是了解仿真应用与理论最新进展的绝佳途径。会议还提供从入门到高阶的大量教程。WSC 由六个技术学会和美国国家标准与技术研究院(NIST)赞助。这六个技术学会分别是:美国统计学会(ASA)、美国计算机协会/仿真专业兴趣组(ACM/SIGSIM)、电气电子工程师学会系统、人类与控制论学会(IEEE/SMCS)、工业工程师学会(IIE)、运筹学与管理科学学会仿真分会(INFORMS-SIM),以及国际建模与仿真学会(SCS)。关于即将召开的 WSC 的信息可从 www.wintersim.org 获取。含完整论文的 WSC 会议文集可从 www.informs-cs.org/wscpapers.html 获取。下面按领域列出最近一次 WSC 的部分报告:
制造业应用
- 选择最合适瓶颈检测方法的方法论
- 船厂制造模型的自动化开发
- 制造工程过程中的仿真(Emulation)应用
- 面向提升制造绩效的优化维护设计
- 汽车零部件行业的生产率管理
- 日本汽车制造厂的产线设计
晶圆制造
- 批次分配到机台的范式转变
- 带有重入过程的多芯片封装装配线调度
- 封装—测试设施的执行层产能分配决策
- 借助回路控制管理在制品(WIP)与周期时间
业务流程处理
- 服务请求分派问题的新策略
- 流程执行监控与调整方案
- 零售门店的店内陈列
- 小型零售店的销售预测
建筑工程与项目管理
- 多个建筑工地有限弯曲机(bar-bender)的调度
- 重复性项目的施工
- 面向公路建设项目改进规划的交通组织
- 隧道竖井施工建模模板
- 隧道施工规划决策支持工具
物流、运输与配送
- 驳船运输系统的运营策略
- 生物恐怖事件下应急医疗物资的发放方案
- 复杂邮件运输网络的分析
- 提升集装箱码头性能
- 基于实时数据的场桥调度
- 航空运营中的单元装载设备库存
- 基于预测更新策略的库存系统
- 食品配送中心的泊位分配
- 驳船运输系统的运营策略
军事应用
- 多国战区内部物流配送
- 加拿大军队行动的可持续性前景研究
- 替换 MK19 自动榴弹发射系统的可行性研究
- 为非对称作战训练联合部队
- 多目标无人机任务规划
- 由作战需求驱动的联邦的发展
医疗保健
- 缩短预约提前期与降低患者爽约率的干预措施
- 支持智慧型思维以改善医院绩效
- 急诊室流程精益改进的验证
- 缓解急诊科拥挤状况
- 易腐药品的库存建模
- 门诊手术中心的实施
- 传染病控制政策
- 手术室与麻醉后资源的平衡
- 结直肠癌筛查的成本效益分析
其他应用
- 采用多重反馈控制的劳动力资源行动管理
- 分析球洞大小对推杆入洞的影响
- 粒子滤波在野火蔓延仿真中的应用
- 封闭生境中的捕食者—被捕食者关系
- 集约化仔猪生产系统
- 呼叫中心的实时延迟估计
- 某公立大学的大流行性流感应急预案
在 ICS Newsletter(ICS 通讯)上一篇关于仿真未来的文章(Banks, 2008)中,十六位仿真研究者——其中包括该领域知名的专家——就以下问题给出了各自的回答:“从长远来看,比如说三年之后,我们将在仿真软件上看到哪些非凡的成果?“以下回答即出自该文:
- 在诸如基于智能体建模(agent-based modeling)这类全新思想与方法被软件厂商采纳之后(这将在几年内发生),仿真建模的进展将由计算能力的提升所驱动。例如,在某个时点上,我们将能够仿真超大型供应链和制造设施的详细运行过程。
- 仿真建模将更像一种"装配"活动,而非一种"从零开始建造"的活动。建模时将使用智能的、参数化的组件来拼装模型,而不是定义大量细化的逻辑。
- 在解决困难问题方面将取得进展。要为真正困难的问题提供工具,仿真软件开发者必须回到起点,认真重新思考一个根本问题:“谁提供力量,谁提供远见?“把这两者的组合摆正,对进一步进步至关重要。当软件开发者试图同时提供力量与远见时,最终用户将被迫接受开发者的范式。这对简单问题很有效,对困难问题则效果不佳。对于所有真正困难的问题,用户对问题的了解往往比软件开发者更多显而易见的解决方案是:由开发者提供经过深思熟虑的真正原语集合,以及组合和打包这些原语的方式。
- 仿真软件将与控制软件更紧密地集成。
- 建模者将拥有一个在组织内跨应用共享的单一模型。
- 仿真应用将不仅限于设计类应用,还将用于组织内部的日常运营决策。
- 运行在强大服务器上的仿真建模将通过基于网页的接口来访问。
- 对人类活动更好、更方便的建模将成为可能(例如把基于智能体的模型嵌入离散事件模型之中)。
- 可以预期会有更多协作式的仿真项目开发。
- 将采纳接口标准并融入 Web 服务,使仿真软件不仅能作为一个整合的联邦相互协作,还能标准化并简化其他应用与仿真软件之间的接口方式。
- 解析求解技术(如线性规划)将与仿真能力相结合。
- 那些"非凡"的成果将源自计算技术其他领域和软件工程方面的进展。但没有什么能超越由 SIMULA 67 引入软件主流开发之中的面向对象范式,而 SIMULA 67 恰恰源自仿真软件这一社区。
5 仿真的若干近期应用
本节介绍仿真的若干近期应用。这些案例均见于所标注的文献中,您可以查阅这些案例并了解更多细节。
案例 1
- 标题: “土耳其军队使用仿真对燃料供应系统建模与优化”
- 作者: I. Sabuncuoglu, A. Hatip
- 报道于: 2005 年 11—12 月,《Interfaces》
- 挑战: 对土耳其军队的燃料供应系统进行分析。
- 技术方法: (1) 在各种情形下测量既有系统与拟建系统的绩效;(2) 开发了一个基于遗传算法的仿真优化模型以优化系统性能;(3) 开展了大量仿真实验。
- 节约金额: 数百万美元。
案例 2
- 标题: “PLATO 帮助雅典夺得金牌:面向组织变革与资源管理的奥运会知识建模”
- 作者: D.A. Beis, P. Poucopoulos, Y. Pyrgiotis, K.G. Zografos
- 报道于: 2006 年 1—2 月,《Interfaces》
- 挑战: 开发一套用于规划和设计场馆运营的系统化流程;建立一个内容丰富的模型库,可直接迁移给未来的奥运会组委会及其他体育赛事。
- 技术方法: 基于仿真与其他决策分析方法的知识建模与资源管理技术及工具。
- 节约金额: 超过 6970 万美元。
案例 3
- 标题: “斯伦贝谢使用仿真进行陆地地震勘测的投标与实施”
- 作者: P.W. Mullarkey, G. Butler, S. Gavirneni, D.J. Morrice
- 报道于: 2007 年 3—4 月,《Interfaces》
- 挑战: 快速且准确地度量地震勘测的成本。
- 技术方法: 开发了一套仿真工具,用于评估队伍规模、勘测区域、地理区域和天气条件对勘测成本与工期的影响。
- 节约金额: 每年 150 万至 300 万美元。
案例 4
- 标题: “运筹学助力 Standard Register 公司重塑运营战略”
- 作者: S.L. Ahire, M.F. Gorman, D. Dwiggins, O. Mudry
- 报道于: 2007 年 11—12 月,《Interfaces》
- 挑战: 在竞争激烈的传统印刷市场中,最小化提供有竞争力定价所需的总成本。
- 技术方法: (1) 用回归分析估计成本与时间属性;(2) 用优化建模确定订单路由策略;(3) 对生产—配送网络进行仿真建模。
- 节约金额: 每年超过 1000 万美元。
案例 5
- 标题: “仿真为服务业实现需求驱动的劳动力调度器”
- 作者: M. Zottolo, O.M. Ulgen, E. Williams
- 报道于: 2007 年冬季仿真会议论文集,编者 S.G. Henderson, B. Biller, M.-H. Hsieh, J. Shortle, J.D. Tew, R.R. Barton。
- 实施方: PMC(www.pmcorp.com)
- 客户: 美国某大型家电公司。
- 挑战: 由于排班过程耗时、依赖手工且效率低下,客户出现了工作组排班过量与不足、所提供服务水平不一致、现场管理人员不堪重负等问题。
- 技术方法: (1) 建立仿真模型,依据一天中客户需求的变化和服务时间为不同工作组排班;(2) 确定作业标准;(3) 开发用于输入数据的接口以及排班的存储与发布功能;(4) 实施该调度工具并培训员工使用。
- 节约金额: 估计为其美国工厂每年节约 8000 万美元。
案例 6
- 标题: “仿真改进某家电生产商的产线末端分拣与物料搬运取货调度”
- 作者: N. Kale, M. Zottolo, O.M. Ulgen, E. Williams
- 实施方: PMC(www.pmcorp.com)
- 客户: 美国某大型汽车租赁公司。(原文如此印)
- 报道于: 2007 年冬季仿真会议论文集,编者 S.G. Henderson, B. Biller, M.-H. Hsieh, J. Shortle, J.D. Tew, R.R. Barton。
- 挑战: 确定把若干种成品家电(SKU)分配到 12 条分拣通道的最有效方法,以尽量减少物料搬运作业和取货所需的叉车数量。由于产品组合波动大、SKU 数量众多、管理费用高昂,这一分拣任务及其相关的物料搬运任务复杂到值得采用离散事件仿真来分析。
- 技术方法: 建立仿真模型,并就以下方面开展实验:(1) 不同 SKU 向不同通道的分配;(2) 取货策略与取货批量;(3) SKU 的批量规模。
- 节约金额: 估计每年节约 10 万美元,而一次性资本投入仅 5 万美元。
6 系统与系统环境
要对一个系统建模,必须理解系统的概念以及系统边界(system boundary)的概念。系统(system)被定义为:一组以某种有规律的交互或相互依赖关系相结合、为达成某一目的而存在的对象。汽车制造生产系统即是一例:机器、零部件和工人沿装配线协同作业,生产出高质量的整车。
系统常常受到系统之外所发生变更的影响。这类变更被称为发生在系统环境(system environment)中 [Gordon, 1978]。在为系统建模时,必须界定系统与其环境之间的边界。这一决定可能取决于研究的目的。
以工厂系统为例,控制订单到达的因素可能被视为处于工厂影响之外,因而属于环境的一部分。然而,如果要考虑供给对需求的影响,工厂产出与订单到达之间就存在一种关系,而这种关系必须视为系统的活动。同样地,以银行系统为例,可能存在可支付最高利率的上限。对于研究单家银行而言,这将被视为环境施加的约束;但在研究货币法规对银行业影响的研究中,该上限的设定则属于系统的活动 [Gordon, 1978]。
7 系统的组成要素
为了理解与分析一个系统,需要定义若干术语。实体(entity)是系统中关注的对象;属性(attribute)是实体的性质;活动(activity)代表一段规定长度的时间。如果研究的是银行,那么顾客可能是实体之一,其支票账户余额可能是属性,而存款则是一项活动。
构成某项研究之系统的实体集合,可能只是另一项研究所针对的整个系统的一个子集 [Law, 2007]。例如,如果研究上述银行是为了确定办理存取款业务所需的柜台员人数,那么系统可以定义为银行中由普通柜台员和排队等待的顾客构成的那一部分。若研究目的扩展到确定所需的专职柜台员人数(用以开具银行本票、办理商业交易等),则系统的定义必须相应扩大。
系统的状态(state)被定义为:为在任意时刻描述系统、相对于研究目标而言所必需的那一组变量。在银行研究中,可能的状态变量包括忙碌的柜台员人数、排队等待或正在接受服务的顾客人数,以及下一位顾客的到达时间。事件(event)被定义为可能改变系统状态的一次瞬时发生。内生(endogenous)一词用于描述发生在系统内部的活动和事件;外生(exogenous)一词用于描述环境中那些影响系统的活动和事件。在银行研究中,顾客到达是外生事件,顾客服务完成则是内生事件。
表 1 列出了若干系统中实体、属性、活动、事件和状态变量的示例。这里仅给出系统组成部分的部分列表。除非明确研究目的,否则无法给出完整的清单。依据研究目的不同,系统中受到关注的方面也不同,从而可以补全这一组成要素清单。
表 1 系统及其组成要素示例
| 系统 | 实体 | 属性 | 活动 | 事件 | 状态变量 |
|---|---|---|---|---|---|
| 银行 | 顾客 | 支票账户余额 | 存款 | 到达;离开 | 忙碌的柜台员人数;等待的顾客人数 |
| 城际铁路 | 乘客 | 出发地;目的地 | 乘车行进 | 到达车站;到达目的地 | 各站等待的乘客人数;在途乘客人数 |
| 生产 | 机器 | 速度;产能;故障率 | 焊接;冲压 | 故障 | 机器状态(忙碌、闲置或停机) |
| 通信 | 消息 | 长度;目的地 | 传输 | 到达目的地 | 等待传输的消息数 |
| 库存 | 仓库 | 容量 | 取货 | 需求 | 库存水平;积压需求 |

8 离散系统与连续系统
系统可以被划分为离散型或连续型。“在实践中,完全离散或完全连续的系统很少,但由于对大多数系统而言总有一种变化占主导地位,因此通常可以把一个系统归类为离散型或连续型” [Law, 2007]。离散系统(discrete system)是指状态变量仅在一组离散时间点上发生变化的系统。银行就是一个离散系统的例子:状态变量"银行内的顾客人数"仅在顾客到达或顾客服务完成时才发生变化。图 1 展示了顾客人数如何仅在离散时间点上发生变化。

图 1 离散系统的状态变量。
连续系统(continuous system)是指状态变量随时间连续变化的系统。水坝后的水位即是一例。在暴雨期间及暴雨结束后的若干时间内,雨水流入坝后的湖中。水从大坝中引出,用于防洪和发电。蒸发也会使水位下降。图 2 展示了这一连续系统的状态变量——坝后水位——的变化过程。

图 2 连续系统的状态变量。
9 系统的模型
有时我们希望研究一个系统,以理解其组成部分之间的关系,或预测该系统在新政策下将如何运行。研究系统时,有时可以直接对系统本身做实验。但这并不总是可行的。一个新系统可能尚不存在,它可能只处于假想状态或设计阶段。即便系统已经存在,对其做实验也可能不切实际。就银行而言,为了研究减少柜台员人数对排队长度的影响而削减人员,可能会激怒顾客,以致他们把账户转往竞争对手。因此,对系统的研究往往要借助系统的模型来完成。
我们曾承担过一项咨询业务:为西澳大利亚州一个重新设计的港口做仿真。对于一个造价 3 亿美元的装卸泊位而言,投入如此巨资后再发现该泊位不适合承担任务,是不明智的。
模型(model)被定义为:为了研究某系统而对该系统所作的表示。对于大多数研究而言,只需考虑系统中那些影响所研究问题的方面。这些方面就体现在系统的模型中;模型按其定义就是对系统的简化。另一方面,模型又应足够详细,以便能对真实系统得出有效的结论。随着研究目的的变化,同一系统可能需要不同的模型。
正如系统的组成要素包括实体、属性和活动一样,模型也由这些要素来表示。不过,模型中只包含与研究相关的那些组成要素。
10 模型的类型
模型可以分为数学模型和物理模型。数学模型(mathematical model)使用符号记法和数学方程来表示系统。仿真模型(simulation model)是系统的一类特定数学模型。物理模型(physical model)是某个实物放大或缩小后的版本,例如放大的原子模型或缩小版的太阳系模型。
仿真模型还可以进一步分类为静态或动态、确定性或随机、离散或连续。静态仿真模型(static simulation model)有时也称为蒙特卡罗仿真(Monte Carlo simulation),表示系统在某一特定时间点的状态。动态仿真模型(dynamic simulation model)表示系统随时间的变化。例如,对银行从上午 9:00 到下午 4:00 的仿真就是一个动态仿真的例子。
不含随机变量的仿真模型被称为确定性(deterministic)的。确定性模型有一组已知的输入,从而产生一组唯一确定的输出。如果牙科诊所的所有病人都按预约时间准时到达,那么到达就是确定性的。随机仿真模型(stochastic simulation model)则含有一个或多个随机变量作为输入。随机输入导致随机输出。由于输出是随机的,因此只能被看作模型真实特性的估计值。对银行的仿真通常涉及随机的到达间隔时间和随机的服务时间。因此,在随机仿真中,输出度量——平均等待人数、顾客平均等待时间——必须被当作系统真实特性的统计估计来处理。
离散系统与连续系统已在第 7 节中定义。离散模型与连续模型的定义方式与此类似。然而,离散仿真模型并不总是用来模拟离散系统,连续仿真模型也不总是用来模拟连续系统。储罐和管道尽管我们知道流体流动是连续的,也可能被离散地建模。此外,仿真模型可以是混合型的,同时兼具离散与连续成分。究竟采用离散、连续(或者离散与连续兼有)的仿真模型,取决于系统的特征和研究目标。因此,如果每条消息的特征和移动都显得重要,通信信道就可以离散地建模;反之,若关注的是消息在信道上的总流量,那么用连续仿真来建模该系统可能更合适。本书所重点讨论的模型是动态的、随机的和离散的。
11 离散事件系统仿真
本书讨论的是离散事件系统仿真(discrete-event system simulation)。离散事件系统仿真是对状态变量仅在一组离散时间点上发生变化的系统进行建模。仿真模型采用数值方法而非解析方法进行分析。解析方法(analytical method)运用数学的演绎推理来"求解"模型。例如,可以使用微分学计算某些库存模型的最小成本策略。数值方法(numerical method)则运用计算过程来"求解"数学模型。对于采用数值方法的仿真模型而言,模型是被"运行"而非被"求解"的——也就是说,依据模型假设生成系统的一段人造历史,并收集观察值以供分析,从而估计真实系统的性能度量。真实世界的仿真模型相当庞大,所存储和操作的数据量巨大,因此这类运行通常要借助计算机来完成。
概括地说,本书讨论的是离散事件系统仿真,其中所关注的模型采用数值方法进行分析,通常借助计算机完成。
12 仿真研究的步骤
图 3 给出了一组步骤,用以指导建模者开展周密而可靠的仿真研究。其他文献中也有类似的图示与关于步骤的讨论 [Shannon, 1975; Gordon, 1978; Law, 2007]。图 3 中各符号旁的编号对应正文中更为详细的讨论。仿真研究的步骤如下:

图 3 仿真研究的步骤。
1. 问题表述(Problem formulation)
每项研究都应当以问题的陈述开始。如果问题陈述由决策者或遇到问题的人给出,分析人员必须确保对所描述的问题有清晰的理解。如果问题陈述由分析人员拟定,那么让决策者理解并认可这一表述就很重要。尽管图 3 中未予显示,但有时随着研究的推进,问题必须重新表述。在许多情形下,决策者和分析人员早在问题的性质尚未明确之前,就已意识到问题的存在。
2. 确定目标与总体项目计划(Setting of objectives and overall project plan)
目标指明仿真要回答的问题。在这一点上,应当判断:对于所表述的问题和所陈述的目标而言,仿真是否为恰当的方法学。假定已确定仿真是恰当的,那么总体项目计划应当包括对待考察备选系统的说明,以及评估这些备选系统有效性的方法。它还应当包括研究计划:涉及人员数量、研究成本、完成各阶段工作所需的天数,以及每一阶段结束时期望得到的结果。
3. 模型概念化(Model conceptualization)
构建系统模型大概是艺术与科学的结合。Pritsker [1998] 对这一步做了详尽的讨论。“尽管不可能给出一套指令,以确保在每一种情况下都能构建出成功而恰当的模型,但仍有一些可以遵循的一般性准则” [Morris, 1967]。建模艺术因以下能力而提升:抽象问题的本质特征,选择并修正刻画系统的基本假设,然后丰富和细化模型,直至得到一个有用的近似。因此,最好从一个简单的模型开始,逐步构建到更高的复杂度。不过,模型的复杂度不必超过达成模型既定目的所需的程度。违反这一原则只会增加建模和计算机方面的开销。模型与真实系统之间并不需要一一对应,只需要真实系统的精髓即可。
建议让模型使用方参与模型概念化工作。让模型使用方参与,既能提升所建模型的质量,也能增强模型使用方对模型应用的信心。(不过,只有对真实系统——而非教科书习题——的亲身经验,才能"教会"人们建模的艺术。)
4. 数据收集(Data collection)
模型的构建与所需输入数据的收集之间始终存在相互影响 [Shannon, 1975]。随着模型复杂度发生变化,所需的数据元素也会随之变化。此外,由于数据收集在完成一次仿真所需的总时间中占有很大比重,因此必须尽早开始,通常要与建模的早期阶段同步进行。
研究目标在很大程度上决定了要收集哪些数据。例如在银行研究中,若希望了解柜台员人数变化时排队长度的变化,那么所需的数据类型包括:到达间隔时间的分布(按一天中不同时段分别统计)、柜台员的服务时间分布,以及不同条件下排队长度的历史分布。最后一类数据将用于验证仿真模型。(参见 Henderson [2003] 的精彩讨论。)
5. 模型翻译(Model translation)
大多数真实世界的系统所导出的模型都需要大量的信息存储和计算,因此必须把模型录入计算机可识别的格式中。我们使用"程序"这一术语,尽管在许多情形下,或许几乎不需要真正的编码就能达成预期结果。建模者必须决定是用仿真语言(如 GPSS/H™)为模型编写程序,还是使用专用的仿真软件。在制造和物料搬运领域,有 AnyLogic®、Arena®、AutoMod™、Enterprise Dynamics®、Extend™、Flexsim、ProModel® 和 SIMUL8® 等软件。仿真语言强大而灵活。然而,若问题可用仿真软件解决,模型开发时间将大幅缩短。此外,多数仿真软件包都增加了增强其灵活性的功能,尽管灵活性的差异很大。
6. 验证了吗?(Verified?)
验证(verification)针对的是为仿真模型所编制的计算机程序。计算机程序的运行是否正确?对于复杂模型,要在不做大量调试的情况下完整成功地翻译模型是困难的,甚至几乎不可能;如果模型的输入参数和逻辑结构在计算机中得到了正确表示,验证即告完成。就大部分情况而言,完成这一步所依据的是常识。(Sargent [2007] 对此有专门讨论。)
7. 确认了吗?(Validated?)
确认(validation)通常通过模型的校准(calibration)来实现——这是一个迭代过程:把模型与实际系统行为作比较,利用两者之间的差异以及由此获得的见解来改进模型。反复进行这一过程,直到模型精度被认为可以接受。在前面提到的银行例子中,我们收集了当前条件下排队长度的数据。仿真模型能否复现这一系统度量?这是确认的一种手段。(Sargent [2007] 对此有专门讨论。)
8. 实验设计(Experimental design)
必须确定要仿真的备选方案。通常,关于仿真哪些备选方案的决策,会取决于已完成并分析过的运行结果。对每一个被仿真的系统设计,都需要就以下事项作出决策:初始化期的长度、仿真运行的长度,以及每次运行所要做的重复次数。(Sanchez [2007] 对此有非常详尽的讨论。)
9. 生产性运行与分析(Production runs and analysis)
生产性运行及其后续分析,用于估计被仿真系统设计的性能度量。(可辅助完成这一步的软件包括 AutoStat(在 AutoMod 中)、OptQuest(在若干仿真软件中)以及 SimRunner(在 ProModel 中)。)
10. 还需要更多运行吗?(More runs?)
在分析了已完成的运行之后,分析人员据此判断是否需要追加运行,以及这些追加实验应遵循何种设计。
11. 文档与报告(Documentation and reporting)
文档分为两类:程序文档与进展文档。程序文档(program documentation)的必要性体现在许多方面。如果该程序将由同一批或不同的分析人员再次使用,那么理解程序如何运行可能是必要的。这将建立对程序的信心,使模型使用方和决策者能够基于分析结果作出决策。同样,如果程序将由同一名或另一名分析人员修改,充分的文档会极大地方便这一工作。分析人员一次因文档不充分而吃了苦头,通常就足以让分析人员确信这一重要步骤的必要性。为程序编写文档还有一个理由:模型使用方可以随时更改参数,从而了解输入参数与输出性能度量之间的关系,或发现能"优化"某项输出性能度量的输入参数。
Musselman [1998] 讨论了进展报告(progress report),它提供仿真项目重要的书面历史。项目报告给出已完成工作和已作决策的时间脉络,这极有助于使项目保持在正确轨道上。Musselman 建议频繁出具报告(至少每月一次),使得即便那些未参与日常工作的人也能及时了解情况。他人的这种了解常常能促进项目的成功完成,因为能及早暴露误解,而此时问题尚易解决。Musselman 还建议维护一份项目日志(project log),以全面记录工作成果、变更请求、关键决策以及其他重要事项。
在交付物方面,Musselman 建议频繁产出阶段性成果。这些成果未必都是重大成就的产物。他的座右铭是:“与其只有一个绝对的截止期限,宁可设置许多中间里程碑。“最终报告之前的可能产出包括模型说明书、原型演示、动画、培训结果、中期分析、程序文档、进展报告和演示汇报。他建议在项目生命周期内对这些交付物作出合理的时间安排。
所有分析结果都应当在最终报告中清楚而简洁地报告。这将使模型使用方(此时即决策者)能够复核最终的问题表述、所涉及的备选系统、比较这些备选系统所依据的准则、实验结果,以及针对该问题所推荐的解决方案。此外,如果决策需要在更高层级上得到论证,最终报告还应当为模型使用方/决策者提供一种认证载体,并提升模型及建模过程的可信度。
12. 实施(Implementation)
实施阶段能否成功,取决于前十一个步骤执行得如何好,也取决于分析人员在整个仿真过程中让最终模型使用方参与的充分程度。如果模型使用方在整个建模过程中都参与其中,并且理解模型及其输出的性质,那么实施有力推进的可能性就会增大 [Pritsker, 1995]。反之,如果模型及其背后的假设没有得到恰当的沟通,那么无论仿真模型本身是否有效,实施都可能受到影响。
图 3 所示的仿真建模过程可以分解为四个阶段。第一阶段包括步骤 1(问题表述)和步骤 2(确定目标与总体设计),是一段发现或定向时期。最初的问题陈述通常相当"模糊”,最初的目标通常不得不重新设定,最初的项目计划通常也必须微调。这些重新校准与澄清可能发生在本阶段内,也可能在另一个阶段之后或进行之中发生(例如,分析人员可能不得不重新启动整个过程)。
第二阶段与模型构建和数据收集相关,包括步骤 3(模型概念化)、步骤 4(数据收集)、步骤 5(模型翻译)、步骤 6(验证)和步骤 7(确认)。各步骤之间需要持续相互配合。在此阶段将模型使用方排除在外,可能会在实施时带来严重后果。
第三阶段涉及模型的运行,包括步骤 8(实验设计)、步骤 9(生产性运行与分析)和步骤 10(是否需要更多运行)。本阶段必须针对仿真模型制定一个周密的实验计划。事实上,离散事件随机仿真就是一次统计实验。输出变量是含有随机误差的估计值,因此需要进行恰当的统计分析。这种思想与那种只做一次运行、就从这一个数据点得出推断的分析人员形成了鲜明对照。
第四阶段即实施阶段,涉及步骤 11(文档与报告)和步骤 12(实施)。能否成功实施取决于模型使用方的持续参与,以及流程中每一步的顺利完成。整个流程中也许最关键的一点是步骤 7(确认),因为一个未通过确认的模型将导致错误的结果,而这些结果一旦付诸实施,可能既危险又昂贵,甚至两者兼有。
参考文献
BANKS, J. [2008], “Some Burning Questions about Simulation.” ICS Newsletter, INFORMS Computing Society, Spring.
BANKS, J., and R. R. GIBSON [1997], “Don’t Simulate When: 10 Rules for Determining when Simulation Is Not Appropriate,” IIE Solutions, September.
GORDON, G. [1978], System Simulation, 2d ed., Prentice-Hall, Englewood Cliffs, NJ.
HENDERSON, S. G. [2003], “Input Model Uncertainty: Why Do We Care and What Should We Do About It?” in Proceedings of the Winter Simulation Conference, eds. S. Chick, P. J. Sánchez, D. Ferrin, and D. J. Morrice, New Orleans, LA, Dec. 7–10, pp. 90–100.
KLEIJNEN, J. P. C. [1998], “Experimental Design for Sensitivity Analysis, Optimization, and Validation of Simulation Models,” in Handbook of Simulation, ed. J. Banks, John Wiley, New York.
LAW, A. M. [2007], Simulation Modeling and Analysis, 4th ed., McGraw–Hill, New York.
MORRIS, W. T. [1967], “On the Art of Modeling,” Management Science, Vol. 13, No. 12.
MUSSELMAN, K. J. [1998], “Guidelines for Success,” in Handbook of Simulation, ed. J. Banks, John Wiley, New York.
NAYLOR, T. H., J. L. BALINTFY, D. S. BURDICK, and K. CHU [1966], Computer Simulation Techniques, Wiley, New York.
PEGDEN, C. D., R. E. SHANNON, and R. P. SADOWSKI [1995], Introduction to Simulation Using SIMAN, 2d ed., McGraw–Hill, New York.
PRITSKER, A. A. B. [1995], Introduction to Simulation and SLAM II, 4th ed., Wiley & Sons, New York.
PRITSKER, A. A. B. [1998], “Principles of Simulation Modeling,” in Handbook of Simulation, ed. J. Banks, John Wiley, New York.
SANCHEZ, S.R. [2007], “Work Smarter, Not Harder: Guidelines for Designing Simulation Experiments,” in Proceedings of the 2007 Winter Simulation Conference, eds. S. G. Henderson, B. Biller, M.-H. Hsieh, J. Shortle, J. D. Tew, and R. R. Barton, Washington, DC, Dec. 9–12, pp. 84–94.
SARGENT, R.G. [2007], “Verification and Validation of Simulation Models,” in Proceedings of the 2007 Winter Simulation Conference, eds. S. G. Henderson, B. Biller, M.-H. Hsieh, J. Shortle, J. D. Tew, and R. R. Barton, Washington, DC, Dec. 9–12, pp. 124–137.
SHANNON, R. E. [1975], Systems Simulation: The Art and Science, Prentice-Hall, Englewood Cliffs, NJ.
SHANNON, R. E. [1998], “Introduction to the Art and Science of Simulation,” in Proceedings of the Winter Simulation Conference, eds. D. J. Medeiros, E. F. Watson, J. S. Carson, and M. S. Manivannan, Washington, DC, Dec. 13–16, pp. 7–14.
习题
为下列系统各列举若干实体、属性、活动、事件和状态变量:
- (a) 一家自助餐厅
- (b) 一家杂货店
- (c) 一家自助洗衣店
- (d) 一家快餐店
- (e) 一家医院急诊室
- (f) 一家拥有 10 辆出租车的出租车公司
- (g) 一条汽车装配线
考虑图 3 所示的仿真过程。
- (a) 通过合并相似的活动,至少减少两个步骤。请给出理由。
- (b) 通过拆分现有步骤或对现有步骤加以细化,至少增加两个步骤。请给出理由。
拟对某大型交通路口进行仿真,目的是改善当前的交通流。请针对图 3 仿真过程中的步骤 1 和步骤 2,按复杂度递增的顺序给出三个迭代版本。
拟对烹制一顿意大利面进行仿真,以确定一个人应当在什么时间开始动手,才能在晚上 7:00 前把饭菜端上餐桌。请从网上下载一份意大利面的食谱(或向朋友或亲戚索取食谱)。尽可能地追踪你认为在图 3 仿真过程的数据收集阶段所需要进行的内容,以便完成一次包含食谱中每个步骤的仿真。该系统中的事件、活动和状态变量分别是什么?
使用你的支票簿所涉及的事件和活动有哪些?
第 1 节中给出了大量使用仿真的理由。但可能还有其他理由。请查阅当届 WSC 论文集中的应用,看能否发现其他理由。(WSC 论文集见 www.informs-cs.org/wscpapers.html)
在 www.informs-cs.org/wscpapers.html 可获取的当届 WSC 论文集中,选取一篇与你所学专业或兴趣领域相关的仿真应用文章,撰写报告,说明作者是如何完成图 3 所列各步骤的。
从习题 7 的网址获取一份近期的 WSC 论文集,就你感兴趣的领域,报告其中讨论的不同应用。
从习题 7 的网址获取一份近期的 WSC 论文集,报告你所发现的最不寻常的应用。
找出第 12 节中的某一个案例,描述其所采用的方法。
访问冬季仿真会议网站 www.wintersim.org,回答下列问题:
- (a) 上一届 WSC 提供了哪些高阶教程,或下一届 WSC 计划提供哪些高阶教程?
- (b) 下一届 WSC 将于何时何地举办?
访问冬季仿真会议网站 www.wintersim.org,回答下列问题:
- (a) 迄今规模最大(按参会人数计)的一届 WSC 是哪一届,共有多少人参加?
- (b) 自 WSC 创办以来,哪一个公历年份没有召开会议?
- (c) 自 WSC 创办以来,两次会议之间最长的时间间隔是多久?
- (d) 从第 25 届 WSC 开始,你能否看出会议举办地点的某种规律?
向 WSC 提交论文的流程是怎样的?
将近期 WSC 的参展商名单按"软件供应商"和"其他"两类进行划分。
WSC 基金会的宗旨与历史是什么?
使用你常用的搜索引擎,在网上搜索 ‘discrete event simulation output analysis’,并就搜索结果撰写报告。
使用你常用的搜索引擎,在网上搜索 ‘supply chain simulation’,并就搜索结果撰写报告。
使用你常用的搜索引擎,在网上搜索 ‘web based simulation’,并就搜索结果撰写报告。
2 电子表格中的仿真示例
本章借助电子表格示例来介绍仿真(simulation)。这些示例相对简单;其中许多既可以在电子表格中完成,也可以手工完成。我们的主要目的,是引入并图解仿真中的若干关键概念;而不是讲授如何构建或开发电子表格模型,而是通过若干简单的电子表格模型,以示例的方式说明任何仿真都具备的一些关键要素。这些关键要素涵盖从模型的组成部分直至对模型进行实验。
尽管某些现实世界的仿真模型——例如风险分析、财务分析、某些可靠性问题等——适合用电子表格来表述和求解,但电子表格对于大多数复杂的现实世界动态事件驱动仿真而言,存在着严重的局限。这类复杂模型更多地是在仿真软件包或通用编程语言中开发的,而不是在电子表格中开发的。
本章的电子表格示例既包含蒙特卡罗仿真(Monte Carlo simulation),也包含随时间跟踪事件的动态仿真。电子表格仿真的实现方式是设计一张仿真表(simulation table),它提供了一种跟踪系统状态随时间变化的方法。尽管这些仿真表包含若干共同的要素,但总体而言它们都是临时拼凑的(ad hoc),也就是说,它们是针对手头问题专门定制的。由于这种临时拼凑的性质,开展动态离散事件仿真需要一个通用的框架。
本章引入的关键要素包括:利用随机数表示不确定性;用于预测排队模型与库存模型中系统性能的描述性统计量;以及把模型理解为由输入、活动、事件、状态、输出和响应所构成所带来的好处。这些主题在此均通过示例加以介绍。
第 1 节讲述基本内容,例如生成随机样本以及仿真模型的基本组成部分;后续示例都依赖于这里学到的概念与技术。其余各节的示例涉及若干应用领域,例如掷硬币、排队或等待线、库存策略、可靠性、命中目标(轰炸或飞镖靶)以及项目网络分析。在这些示例中,我们对模型实现(implementation)只作有限关注;而把重点放在识别模型的组成部分(输入、事件、状态等)以及开展一项简单的实验上,其中的关键概念是试验(trials)或重复(replications)。
本章所有示例都配有 Excel 电子表格解答,可在本书网站 www.bcnn.net 上获取。这些电子表格包含说明与注释,为每个示例补充了技术细节,其中包括实现细节;对于修改现有模型或按照某些习题要求开发新的电子表格仿真模型的学生而言,这些细节可能颇有价值。
1 电子表格仿真的基本原理
本节介绍完成本章其余示例仿真所需的基本内容。我们将学习如何在电子表格仿真中生成随机数,以及手工仿真时到哪里去取得随机数。我们将学习如何针对若干简单情形生成随机样本,例如掷硬币、排队仿真中的服务时间与到达时间,以及库存模型中的随机需求。此处学到的方法,足以应付本章示例中用到的任何简单离散统计分布。
1.1 如何仿真随机性
本书所考虑的几乎所有仿真模型都包含一个或多个随机变量(random variable)。显然,对于掷硬币而言,需要某种机制来模拟一次随机的投掷,结果为正面或反面。在排队模型中,当到达时间与服务时间事先未知、无法预测但遵循某种统计规律时,服务时间与到达间隔时间(interarrival time)二者都可以由统计分布来定义。
我们如何取得随机量?关于随机数和随机变量生成背后的理论与一般性解释,这里暂且不论。本章采取一种务实、实用的观点:对于电子表格仿真或手工仿真,我们如何取得随机量?
生成任何随机量,都要从生成一个位于 0 与 1 之间区间内的随机数(random number)开始。“随机数"一词始终指在 0 到 1 之间的单位区间内随机生成的量。与之相对,“随机变量"一词指具有特定统计分布的任意随机生成的量。任何生成随机数序列的方法,都称为随机数发生器(Random Number Generator,RNG)。
随机数的生成方法应当产生具有两项重要统计性质的数列:
这些数应当在 0 与 1 之间均匀分布。
随后生成的数应当与此前生成的所有数在统计上相互独立。
均匀性除其他含义外还意味着:落入区间 (a, b)(其中 a 和 b 均介于 0 与 1 之间)的概率,等于该区间的长度 b − a。统计独立性除其他含义外还意味着:知道先前已生成数的取值,对预测随后生成数的取值毫无帮助。此外,它还意味着相邻两个数之间的相关系数为零。
由此得到的这些数通常称为伪随机数(pseudo-random number)。其原因之一在于这样一个悖论:我们希望生成的数在统计上均匀且相互独立,同时我们又希望能加以控制。我们希望在任何时候都能重现该数列,从而使得仿真实验能够得到控制并被复现;还有一个实用原因:这有助于模型的开发与调试。
一般而言,我们如何取得这些随机数?它们从哪里来?(以下文中,VBA 指 Visual Basic for Applications,即 VB 编程语言在 Excel 及其他 Microsoft Office 应用程序中的实现。)随机数有如下若干标准来源:
- 在 Excel 中,我们可以在单元格的公式里使用内置的工作表函数(worksheet function)RAND。RAND 生成 0 与 1 之间的值。使用 RAND 的公式的典型例子包括生成 0 与 1 之间的随机值,如下所示:
或者用于生成两个值之一(0 或 1)的更复杂表达式,如下所示:
注意,工作表函数 IF 在其第一个参数中检查一个条件;若条件为真,则返回第一个值,否则返回第二个值。
Excel 还提供工作表函数 RANDBETWEEN(),它返回指定下限与上限之间均匀分布的整数值。Excel 或其某些加载项还提供其他生成随机值的函数。这些我们一概不用。
在 Excel 的工作表单元格中,我们可以调用一个用户编写的 VBA 函数,该函数进而调用 VBA 内部库函数,例如 Rnd(),或本书网站上提供的 VBA 函数(MRG32k3a)。本章的电子表格示例全都带有可从单元格中调用的 VBA 函数 Rnd01()。(Rnd01() 只是简单地调用 VBA 内部库函数 Rnd()。)
仿真软件包提供多种方法,可从一长串标准统计分布以及从数据中,生成随机数和随机变量。
大多数通用编程语言都提供内置的库函数来生成随机数,其中许多还提供从各种统计分布中生成样本的设施。若缺少这些,模型开发者可以自行编写一个或多个算法。
对于手工(纸笔)仿真,可以使用某种物理随机数发生器,例如抛一枚或多枚硬币,或者掷骰子。由于这些做法除最简单的情形外都不切实际,另一种可能是使用随机数表或来自特定分布的随机变量表,例如附录中的表 A.1(均匀分布)与表 A.2(标准正态分布)。
工作表函数 RAND() 和 VB 函数 Rnd() 都不应当用于专业工作;它们都存在已知的缺陷。例如,VB 函数 Rnd() 返回单精度值(约 5 位小数的精度),而所有优秀的 RNG 都返回双精度(约 15 位小数);其次,Rnd() 的周期很短——在生成相对少量的数之后便会重复。它的周期是 2^24,约 1677 万。RAND() 函数的周期更短,而且在均匀性与独立性这两项关键性质上有更严重的缺陷。(注意 Microsoft 在 Office 2003 中修改了 RAND() 函数;据说它既有错误又有缺陷,因而广受批评。)我们只在例 1 中使用 RAND(),且仅出于教学目的。既然有易于获得的更好的发生器,包括本书网站上 Excel 文件 “RandomNumberTools.xls” 中的 VBA 函数 MRG32k3a,我们深信在专业工作中没有任何理由(或借口)去使用有缺陷的发生器。
大多数 RNG 都可以用一个称为种子(seed)的用户指定数字来初始化。电子表格示例中「重置种子并运行」(‘Reset Seed & Run’)按钮背后的 VBA 代码,展示了如何为 VBA 的 Rnd() 发生器设定种子。显然,Excel 的 RAND 发生器无法设定种子(这是不使用它的另一个理由)。MRG32k3a 发生器(在 “RandomNumberTools.xls” 中)附带 VBA 函数 InitializeRNSeed(),用于设定该发生器的种子。通过指定种子,用户可以让随机数发生器重复同一数列。这对调试仿真模型和重复仿真实验都很有价值。请记住,我们所仿真的是随机性;可重复性所带来的这种可控性是一项特性,而不是缺陷。
1.2 示例中所用的随机数发生器
每个示例电子表格都带有若干 VBA 函数,用于在若干简单情形下生成随机变量。我们建议在开发新模型时,从一个现有的电子表格模型入手;这样一来,为各个示例编写的全部 VBA 函数都可为新模型所用。
用于在工作表单元格中生成随机值的 VBA 函数与 Excel 工作表函数包括:
Rnd01(),用于生成 0 与 1 之间的随机数;
DiscreteUniform(min, max),用于生成从最小值 min 到最大值 max 的随机整数,其中 min 与 max 可以是数字,也可以是包含该数字的单元格区域;
DiscreteEmp(rCumProb, rValues),用于从由两个 Excel 区域(单元格区域)指定的离散分布中生成样本:rCumProb 为累积概率,rValues 为取值;
Uniform(low, high),用于从下限 low 与上限 high 之间的连续均匀分布中生成一个实值(而不只是整数),其中 low 与 high 可以是数字,也可以是包含该数字的单元格;
NORMSINV(Rnd01()),用于生成均值为 0、标准差为 1 的标准正态变量。
除 NORMSINV() 之外,上述所有函数都是为本章示例编写的 VBA 函数;NORMSINV() 是 Excel 工作表函数,可以(按上述形式)用来生成标准正态变量。我们建议不要使用工作表函数 RAND() 和 RANDBETWEEN()。所有电子表格解答都可以调用其中任何一个函数,无论所提供的解答是否用到了它;因此,这些示例电子表格是完成某些习题的良好起点。
在本书的这一点上,我们并不期望读者完全理解上述所有函数的工作方式。不过,我们的目标是:让你理解每个函数所生成随机值的性质,并能在修改示例或创建新的电子表格模型时,于习题中加以运用。后续各节在示例中使用这些函数时,会对它们作更详细的说明。
1.3 如何使用这些电子表格
电子表格仿真模型位于各解答工作簿的「One Trial」(单次试验)工作表中。该工作表包含模型输入的定义与规格说明、包含用于生成仿真表中每一行从而推进仿真的公式的仿真表,以及若干概括统计量(通常还有一幅直方图),用以表示一次仿真运行的结果。工作表上的两个按钮控制仿真:
每点击一次,「生成新试验」(‘Generate New Trial’)按钮就用一列新的随机数完成一次新的仿真运行。
每点击一次,「重置种子并运行」(‘Reset Seed & Run’)按钮就把 RNG 种子设为用户在相邻单元格中指定的值,然后用该种子运行仿真。默认种子是任意取值 12,345。
你随时可以点击「重置种子并运行」按钮回到初始结果。
「Experiment」(实验)工作表允许用户开展一项仿真实验:反复执行「One Trial」工作表,每次使用不同的随机数,并把指定的模型响应(取自 Link 单元格)记录到响应表(Response Table)中。用户指定试验次数,例如 100,意思是「One Trial」工作表将执行 100 次,并把 100 个响应值记录到响应表中。这称为重复(replication);重复的次数就是试验次数。
所有试验的实验结果汇总在「Experiment」工作表上的「多次试验汇总」(‘Multi-Trial Summary’)表中。这些汇总统计量包括频数分布及其配套的直方图,以及样本均值、中位数、最小值、最大值等标准统计量。第 2 节的表 6 给出了一个示例。
要在「Experiment」工作表上运行实验,按如下方式使用这两个按钮:
每点击一次,「运行实验」(‘Run Experiment’)按钮就按指定的试验次数完成一次实验运行。随后的每次点击,都使用不同的随机数运行该实验。
每点击一次,「重置种子并运行」按钮就把 RNG 种子设为相邻单元格中指定的值(默认 12,345),并完成一次实验运行。每次点击都会复现完全相同的原始结果。
本章所有示例中给出的结果,都来自点击「重置种子并运行」按钮;这保证了读者能够复现出同样的结果。每个电子表格解答都包含关于解答各个方面的注释与说明,其中包括模型逻辑的实现;有些解答还带有一个名为「Explain」(说明)的工作表,对模型的某些方面给出更详尽的解释。
1.4 如何仿真掷硬币
如何在电子表格模型中仿真一次掷硬币?本解答展示了如何在电子表格仿真中使用均匀随机数发生器。
例 1:掷硬币
我们希望仿真一系列 10 次掷硬币。该硬币是一枚"公平"硬币,也就是说出现正面的概率与出现反面的概率相同。二者各以 0.5 的概率发生。你应当多次运行该仿真,并把结果与现实生活中掷硬币的预期进行比较。这是一个蒙特卡罗仿真的例子;其中并没有跟踪任何事件或时钟时间。
解答见表 1,位于电子表格 “Example2.1CoinToss.xls” 中。事实上,该电子表格中共有四个解答,前两个使用 RAND() 随机数发生器,后两个使用所提供的 VBA 函数 Rnd01()。留作练习(见本章末尾)的是:为这四个解答在统计上的等价性给出一番论证,尽管每次点击「生成新试验」按钮时,这四组结果都不相同。
表 1 掷硬币的仿真表
| B | C | D | E | F | G | H | I | |
|---|---|---|---|---|---|---|---|---|
| 11 | 解答 #1A | 解答 #1B | 解答 #2A | 解答 #2B | ||||
| 12 | 投掷 | RAND() | 使用 C 列随机数的解答 | 使用 RAND() 的解答 | 投掷 | Rnd01() | 使用 G 列随机数的解答 | 使用 Rnd01() 的解答 |
| 13 | ||||||||
| 14 | ||||||||
| 15 | 1 | 0.7317089 | T | T | 1 | 0.9871114 | T | T |
| 16 | 2 | 0.8285837 | T | T | 2 | 0.0225598 | H | H |
| 17 | 3 | 0.0701168 | H | T | 3 | 0.0008356 | H | T |
| 18 | 4 | 0.2147295 | H | H | 4 | 0.2127686 | H | T |
| 19 | 5 | 0.8613179 | T | H | 5 | 0.8586159 | T | H |
| 20 | 6 | 0.4159098 | H | H | 6 | 0.5503362 | T | T |
| 21 | 7 | 0.7492317 | T | H | 7 | 0.5243730 | T | H |
| 22 | 8 | 0.9671661 | T | T | 8 | 0.8884351 | T | H |
| 23 | 9 | 0.4823089 | H | T | 9 | 0.2111118 | H | T |
| 24 | 10 | 0.6738897 | T | H | 10 | 0.7680427 | T | H |
掷硬币的电子表格逻辑很简单。第二个解答(E 列)为:
而第四个解答(I 列)为:
每一次调用 RAND() 或 Rnd01() 都会产生一个新的随机数。「One Trial」工作表记录 10 次投掷中正面与反面各自出现的频数,并以直方图把结果绘出。
第一个和第三个解答分作两步,这种做法在所生成的随机数要被使用多次时很有用。C 列与 G 列存放所生成的随机数,D 列与 H 列存放结果 。第四个解答是例 4 中掷硬币游戏的基础。
在此后所有的电子表格仿真中,我们都使用所提供的 VBA 函数 Rnd01(),或以 Rnd01() 为基础的某个 VBA 函数,而不再使用 RAND()。不过,对于严肃的专业工作,我们建议使用文件 “RandomNumberTools.xls” 中由 VBA 函数 MRG32k3a 实现的发生器。如前所述,Excel 工作表函数 RAND() 与 VBA 函数 Rnd() 都存在严重的局限与缺陷,只应用于随意或教学目的。
1.5 如何仿真随机服务时间
下面的示例展示如何从任意离散分布中生成随机样本。这个示例很简单,服务时间只有 3 个可能取值。其关键原理——即从一个随机数变换为具有给定概率的服务时间——很容易推广到任何具有有限个可能取值的离散分布。
此处以及第 1.6 节中就到达时间所描述的方法,被用于本章几乎所有后续示例。
例 2:随机服务时间
某自动电话信息服务与每位来电者的通话时间,要么是 3 分钟,要么是 6 分钟,要么是 10 分钟。各服务时长所占的呼叫比例分别为 30%、45% 和 25%。我们希望在电子表格中仿真这些服务时间。我们真正的目的,是学习如何从离散分布中生成随机样本,为随后的排队、库存及其他示例做准备。这同样是一个蒙特卡罗仿真的例子。
表 2 给出了输入规格说明和仿真表的一部分(前 4 位来电者),取自电子表格模型 “Example2.2ServiceTimes.xls”。输入规格说明定义了各服务时间的概率,同时也给出了累积概率。累积概率总是递增到 1.0;正如我们将要看到的,生成方法用到的正是累积概率。该方法总是从一个随机数开始,以所期望的值(本例中即具有指定分布的随机服务时间)结束。电子表格中的仿真表展示出为 25 位来电者所生成服务时间的频率分布(或直方图)。
表 2 服务时间的输入规格说明与仿真表
| A | B | C | D | |
|---|---|---|---|---|
| 4 | 服务时间 | 概率 | 累积概率 | |
| 5 | ||||
| 6 | ||||
| 7 | 3 | 0.30 | 0.30 | |
| 8 | 6 | 0.45 | 0.75 | |
| 9 | 10 | 0.25 | 1.00 | |
| 10 | ||||
| 11 | 来电者人数= | 25 | ||
| 12 | 仿真表 | |||
| 13 | 步骤 | 活动 | ||
| 14 | 来电者 | 服务时间 | ||
| 15 | ||||
| 16 | 1 | 6 | ||
| 17 | 2 | 6 | ||
| 18 | 3 | 10 | ||
| 19 | 4 | 6 |
图 1 说明了如何把一个随机数变换为服务时间。可以把它想成:向一块特殊的飞镖靶投掷一支特殊的飞镖;飞镖总会落在单位区间上的某处,且落在 0 到 1 之间直线上任何一点的可能性都相等。飞镖所落入的子区间,决定了所生成的值。
在图 1 中,各概率(位于上方)用单位区间上互不重叠的线段表示,且必须加总为 1。累积概率(紧贴线的下方)用线上的点表示。箭头表示这一变换。该算法的工作方式如下:首先选取一个随机数,记作 R。若 R 落在第一个区间内,也就是 R 小于或等于 0.30,则该过程生成一个 3 分钟的服务时间样本。类似地,若 R 介于 0.30 与 0.75 之间,服务时间为 6 分钟;最后,若 R 大于 0.75,则服务时间为 10 分钟。该算法很容易推广到任何离散分布。
为说明这一过程,我们首先生成 5 个随机数样本,或者在 Excel 中生成(使用 RAND 或 Rnd01 或任何其他随机数发生器),或者从诸如附录中的表 A.1 那样的随机数表中取 5 个样本。假设这 5 个样本是:
0.9871 0.0226 0.0008 0.2128 0.8586
经过图 1 所示的变换后,所得服务时间为:
10 3 3 3 10
在一个小样本(此处样本量为 5)中,我们不能指望各取值的实际出现频数接近其概率;不过,当样本量足够大时,样本频数应当相当接近这些概率。你可以试用电子表格示例 “Example2.2ServiceTimes.xls”,看看小样本与所假定的概率可以相差多远。

图 1 从随机数到服务时间的"随机飞镖"变换。
在 Excel 中,我们可能会以为可以实现这一变换——至少对于取值个数较少(此处为 3 个)的分布——用一个嵌套的 IF 工作表函数,例如:
这个求解尝试引入了一个严重错误。每一次引用 Rnd01() 函数都会产生一个新的随机数;而该变换过程依赖于只使用一个随机数。(你或许愿意把 “Example2.2ServiceTimes.xls” 中的电子表格解答改成这个错误的解答,看看由此得到的概率。)这一做法可以修改为使用两个单元格:第一个存放 Rnd01 的结果,第二个使用修改后的 IF 语句。
更好的办法是使用随所有示例一道提供的 VBA 函数 DiscreteEmp()(离散经验分布,discrete empirical,即由数据定义)。要了解该函数的使用方法,请参看电子表格解答 “Example2.2ServiceTimes.xls”;一个生成随机服务时间的典型单元格如下:
其中 $ D$7:$ D$9 是包含累积概率的单元格区域,$ B$7:$ B$9 是包含服务时间期望取值的单元格区域。Discrete 意味着只会生成所列出的那些取值。这两个工作表区域中的每一个都必须是列向量(即所有数据在一列中),且长度相同,也就是单元格个数相同。每个地址中行号与列号之前的”$“表示绝对地址而非相对地址;这样一来,在把公式键入「服务时间」列中某一个单元格之后,把它复制粘贴到该列的所有单元格中就更方便了。
此处所使用的、随附所提供的 VBA 函数 DiscreteEmp() 的方法,很容易推广到本章中使用简单离散分布作为模型输入的多数示例(和习题)。要使用 DiscreteEmp(),需在工作表中提供两个区域,一个用于累积概率,另一个用于期望取值。它适用于分布中任意多个取值。
在后续示例中,请记住图 1;它恰好说明了 DiscreteEmp() 的工作原理。虽然它的 VBA 实现涉及一个循环,对非编程人员而言可能显得复杂,但其基本逻辑就是图 1 的简单逻辑——向单位区间这块特殊飞镖靶投掷飞镖这一简单逻辑,以及随之而来的变换。
1.6 如何仿真随机到达时间
本节的目标是学习如何生成随机的到达间隔时间(相继到达之间的时间),以及如何计算顾客或其他实体到达系统的时间。到达间隔时间,与例 2 中的服务时间一样,都是由仿真生成的时间长度,称为活动时间(activity time)或活动(activity)。它们与到达时间(arrival time)相区别——后者是仿真时钟上的时刻,表示到达某一设施的时刻。
仿真时钟(simulation clock)是每一个动态离散事件仿真的关键组成部分。在所有 Excel 电子表格解答中,时钟时间都标注在仿真表相应列标题的正上方,从而便于你区分活动时间(例如服务时间或到达间隔时间)与计算得到的时钟时间。在所有情形下,一个时钟时间都表示某事件发生的时间,例如排队模型中的到达、服务开始或服务完成。
例 3:随机到达时间
打往该电话信息服务(其服务时间在例 2 中定义)的电话,其发生时刻是随机的,由一个离散分布定义,其中到达间隔时间的取值为 1、2、3 或 4 分钟,且概率相同。我们在此的目的,是展示如何同时生成到达间隔时间与到达时间。
由于本例只有一个事件,即到达事件,它是我们第一个动态的、事件驱动的模型示例(尽管很简单)。动态(dynamic)简单地说就是基于时间的,系统状态随时间变化;动态、事件驱动(event-based)则意味着模型跟踪事件发生随时间的推进过程。
到达间隔时间的生成方式与例 2 中服务时间的生成方式完全相同。不过,电子表格还提供了第二个 VBA 函数,以简化从离散均匀分布中随机生成数值。均匀(uniform)意味着所有取值的概率相同;本例中,所有到达间隔时间都可能是 1、2、3 或 4 分钟,其出现概率各为 0.25。对于这样的离散均匀分布,电子表格提供了 VBA 函数 DiscreteUniform(),它带两个参数:或者先给出含期望整数区间最小值的单元格、再给出含最大值的单元格,或者直接给出实际的上下限,例如:
或
DiscreteUniform(low, high) 函数由一行 VBA 代码实现,如下:
对本例而言即为:
其中 Rnd() 生成 0 与 1 之间的随机数(在 VBA 中它总是小于 1 但可以等于 0),而 Int() 是一个 VBA 函数,它对其参数截断(向下取整)。(注意,4 * Rnd() 生成 0.0 到 3.99999 之间的实值,因此截断后再加 1,就得到所需的 1 到 4 的范围。为什么我们期望概率相等?)
表 3 给出了到达间隔时间的输入规格说明以及仿真表的一部分,取自电子表格模型 “Example2.3ArrivalTimes.xls”。如步骤 1(第 14 行)所示,我们假定第一次到达发生在仿真时刻 0。(第一位顾客的假定到达时间取决于模型;它可以是任何其他指定的时刻,既可以是常数,也可以是随机的。)到达间隔时间用 DiscreteUniform(1, 4) 函数随机且独立地生成。到达时间则由一个简单的公式计算得出,即把当前顾客的到达间隔时间加上前一位顾客的到达时间。(你应当核对一下电子表格中计算到达时间的公式。)
表 3 到达时间的输入规格说明与仿真表
| A | B | C | D | |
|---|---|---|---|---|
| 4 | 到达间隔时间(分钟) | |||
| 5 | ||||
| 6 | 最小值 | 1 | ||
| 7 | 最大值 | 4 | ||
| 8 | ||||
| 9 | 来电者人数= | 25 | ||
| 10 | 仿真表 | |||
| 11 | 步骤 | 活动 | 时钟 | |
| 12 | 来电者 | 到达间隔时间 | 到达时间 | |
| 13 | ||||
| 14 | 1 | 0 | ||
| 15 | 2 | 2 | 2 | |
| 16 | 3 | 1 | 3 | |
| 17 | 4 | 3 | 6 |
例 3 是第一个包含事件的示例,该事件即到达事件,以及与该事件相关联的事件时间,即到达时刻的 CLOCK 时间。注意表 3 把活动时间与 CLOCK 时间区分开来。
1.7 电子表格仿真的一个框架
仿真表提供了结构,而下面列出的步骤则提供了开展电子表格仿真的一套通用准则。我们已经见过若干仿真表的示例,其中例 3 中的表 3 是目前最好的一例——因为它包含到达事件的时钟时间,从而使它成为最简单的动态事件驱动仿真之一。
首先,模型开发者必须定义模型输入、系统状态和模型输出。输入是那些(通常)独立于其他系统特征而定义的外生变量;例子包括掷硬币出现正面的概率、排队系统中的服务时间分布与到达间隔时间分布,以及库存模型中的需求分布。这些输入规格说明用于生成随机活动时间和其他随机变量。其他一些输入,例如策略或决策参数,可能是常数。
输出用于计算系统性能度量(也称为模型响应,或简称响应)。例如,一个输出可以是某位顾客在队列中的等待时间,或者库存系统中某笔交易的成本。相应的响应则可能是队列中的平均等待时间,或库存系统中单位时间的平均成本。
每张仿真表都是针对手头问题专门定制的。表中的每一列属于以下几种类型之一:
与某个模型输入相联系的活动时间;
由某个模型输入所定义的其他任何随机变量;
一个系统状态;
一个事件,或某个事件的时钟时间;
一个模型输出;
有时是一个模型响应。
对于此处的电子表格仿真,上面列出的这些项目已经足够。
一般而言,模型响应(也称为系统性能度量)是在仿真完成之后、在仿真表之外计算的。例如,在一个等待线模型中,每位顾客在队列中的延迟是一个模型输出,而所有顾客的平均延迟则是一个模型响应。模型输出在仿真表中跟踪;响应则在此之后计算。
活动时间是由常数或统计分布(例如服务时间或到达间隔时间)所定义的时间。活动是一段时间长度,与之相对的事件时间则是时钟时间。
系统状态例如包括排队模型中的服务台状态(忙碌或空闲)以及库存模型中的库存水平。一般来说,系统状态的集合包括仿真随时间推进(或从一步推进到下一步)所需的任何信息,以及任何能使仿真逻辑更简单、更清晰、因而更易理解的量或信息。在模型逻辑正确的前提下,尽可能简单有助于理解,而这种理解极有价值,尤其是在试图验证模型逻辑确实正确的时候。
表 4 通用仿真表
| 步骤 | 活动与系统状态 | 输出 | |||||
|---|---|---|---|---|---|---|---|
| 1 | |||||||
| 2 | |||||||
| 3 | |||||||
| . | |||||||
| . | |||||||
| . | |||||||
| n |
仿真表中的每一行代表仿真中的一个步骤,通常与一个或多个事件的发生,或者某个实体(例如一位顾客)在系统中推进的过程相联系。仿真表的设计使得:给定的某一步只依赖于模型输入,和(或)当前这一步之前的一个或多个步骤,以及先前已计算出的数值。
一般而言,模型开发者按如下准则开发并运行电子表格仿真或手工仿真:
确定仿真中各个输入的特征。经常遇到的输入类型包括常数以及概率分布。
确定与问题相关的活动、事件和系统状态。
确定模型响应或概括性的性能度量,视目标以及为实现这些目标而须回答的具体问题而定。
确定计算模型响应所需的模型输出。
构建一张仿真表。仿真表的一种通用表示见表 4。在该表中,有 p 个活动与系统状态,,以及每个仿真步骤 的一个输出 y_i。通过填写步骤 1 的数据来初始化该表。在构建电子表格模型时,最初的一个或若干步骤(通常只有步骤 1)与后续步骤不同,后续步骤由公式定义。
对每个步骤 i,先为各活动生成一个取值,然后计算系统状态和输出 y。随机输入值可以通过从步骤 1 中所选定的分布中抽样得到。一个输出通常依赖于输入、系统状态,也可能依赖于其他输出。
仿真结束时,利用各输出计算模型响应或性能度量。
在以下各节中,我们将看到若干在专门设计的仿真表中完成的电子表格仿真示例。这些示例包括一个掷硬币游戏的示例,以及排队、库存、可靠性和网络分析等应用领域中的示例。这个掷硬币游戏提出的问题很简单,但其答案我们相信会让大多数读者感到意外。
两个排队示例分别说明单服务台和双服务台系统。第一个库存示例涉及一个有闭式解的问题;因此该仿真解答可以与数学解答作比较。第二个库存示例则涉及经典的订购至水平模型。
其余示例包括一个命中目标的模型、一个可靠性模型、一个用于估计某个复杂随机变量(即提前期需求)分布的蒙特卡罗模型,最后还有一个项目作业网络模型。命中目标模型引入了正态分布随机数的使用。
2 掷硬币游戏
在掷硬币的游戏中,你和对手各自领先的时间大约占一半(即大约有一半的投掷次数上双方各领先一半)的可能性,是否大于其中一方在大多数时间领先的可能性?
借助下面的示例,我们更详细地说明电子表格解答的布局、两个主要工作表(「One Trial」和「Experiment」)、用于运行仿真的按钮,以及所使用的术语:试验(或重复)与实验。模型逻辑的细节(所用的公式、调用的函数等等)在电子表格本身中都有解释,这些都可以在本书网站 www.bcnn.net 上找到。
例 4:掷硬币游戏
Charlize 为她的朋友 Harry 和 Tom 掷硬币,恰好掷 100 次。掷出正面时 Harry 赢 $1.00,Tom 输 $1.00;掷出反面时 Tom 赢 $1,由 Harry 支付。Charlize 在他们玩这个游戏的过程中记录各自的盈亏。在任何一次投掷中,可能是 Harry 领先,也可能是 Tom 领先,还可能双方打平。
在任意一局游戏(一局游戏恰好是 100 次投掷)中,两人各自领先大约占一半投掷次数的可能性,是否大于其中一人在大多数时间领先的可能性?
注意,我们问的不是游戏结束时的输赢;也不是问正面与反面之比(正如你所知,从长远看应当接近 50:50)。这个问题关心的是在整个游戏过程中,Harry 或 Tom 领先或落后的频繁程度。还要注意,问题中的这两种可能性并不是一局游戏仅有的两种可能结果;因此,它们的概率不会加起来等于 1。
具体地说,下面哪一种更可能,以及大约相差多少?
(A) Harry 和 Tom 各自领先大约占一半的投掷次数;具体地说,Harry 在 45 到 55 次投掷中领先,因而 Tom 也在 45 到 55 次投掷中领先;或者
(B) Harry 在 95 次或更多次投掷中领先;或者
(C) Harry 在 5 次或更少次投掷中领先。
先猜一猜,再看结果。表 5 给出了输入规格说明以及仿真表中的前 14 次投掷,取自电子表格模型 “Example2.4CoinTossGame.xls”,使用默认种子(12,345)并点击「重置种子并运行」按钮。「One Trial」工作表中含有一局 100 次投掷游戏的逻辑与结果。
表 5 掷硬币游戏的输入规格说明与仿真表
| A | B | C | D | |
|---|---|---|---|---|
| 4 | 硬币 | 概率 | 累积概率 | |
| 5 | ||||
| 6 | ||||
| 7 | 正面 | 0.50 | 0.50 | |
| 8 | 反面 | 0.50 | 1.00 | |
| 9 | ||||
| 10 | 投掷次数 = 100 | |||
| 11 | 仿真表 | |||
| 12 | 步骤 | 状态 | 输出 | |
| 13 | 投掷 | 投掷结果 | Harry 的盈亏 | |
| 14 | 1 | T | -$1 | |
| 15 | 2 | H | 0 | |
| 16 | 3 | T | -1 | |
| 17 | 4 | H | 0 | |
| 18 | 5 | H | 1 | |
| 19 | 6 | T | 0 | |
| 20 | 7 | H | 1 | |
| 21 | 8 | T | 0 | |
| 22 | 9 | T | -1 | |
| 23 | 10 | H | 0 | |
| 24 | 11 | T | -1 | |
| 25 | 12 | H | 0 | |
| 26 | 13 | T | -1 |
如果你查看电子表格解答中的「One Trial」工作表(采用 RNG 默认种子的那次试验),你会看到在第 13 次投掷时 Harry 的盈亏为负(他在输钱),并且在这局游戏余下的过程中一直为负;事实上,在这局游戏中,Tom 在 100 次投掷中的 92 次上领先,而他最终却只赢了 $6.00。Harry 只在 100 次投掷中的 2 次上领先,双方打平的情形有 6 次(最后一次是在第 12 次投掷时)。
现在,我们不能只靠玩一局游戏来回答所提出的问题(这相当于点击一次「生成新试验」按钮,因为每次试验就是一局 100 次投掷的游戏)。要玩很多局,我们使用「Experiment」工作表,并把试验次数(单元格 C3)设为 400。(就我们目前的目的而言,任何相当大的试验次数都可以。)然后点击标有「重置种子并运行」的按钮,它把种子设为默认值(12,345)并用该种子运行实验。运行实验意味着「One Trial」工作表被执行 400 次,每次试验之后,其结果都被记录到「Experiment」工作表中。该电子表格中包含关于公式、函数以及实现模型逻辑和收集所需输出的其他技术细节的注释与说明。
表 6 掷硬币游戏的实验工作表
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 3 | 试验次数:400 | |||||
| 4 | 性能度量链接: | |||||
| 5 | 度量名称:链接 | |||||
| 6 | Harry 领先的 100 次投掷次数:31 | |||||
| 7 | ||||||
| 8 | ||||||
| 9 | 响应表 | 多次试验汇总 | ||||
| 10 | 试验 | Harry 领先的投掷次数 | 组(区间) | 频数 | 相对频数 | |
| 11 | 1 | 2 | 0 到 5 | 73 | 18.3% | |
| 12 | 2 | 91 | 45 到 55 | 28 | 7.0% | |
| 13 | 3 | 1 | 95 到 100 | 46 | 11.5% | |
| 14 | 4 | 76 | ||||
| 15 | 5 | 17 | ||||
| 16 | 6 | 11 | 平均值 | 48.2 | ||
| 17 | 7 | 94 | 中位数 | 50 | ||
| 18 | 8 | 95 | ||||
| 19 | 9 | 78 | 最小值 | 0 | ||
| 20 | 10 | 0 | 最大值 | 100 | ||
| 21 | 11 | 40 |
表 6 给出了实验规格说明(400 次试验与响应)、前 11 次试验(前 11 局游戏)的响应表,以及多次试验汇总。图 2 是根据多次试验汇总中的频数结果绘制的直方图。
基于这次包含 400 次试验(或重复)的实验,结果可能会让许多人感到意外:
Harry 在大多数时间落后 在 400 局游戏中的 73 局(18.3%)里,Harry 只在 100 次投掷中的 5 次或更少次上领先。
Harry 与 Tom 差不多 在 400 局游戏中的 28 局(7.0%)里,Harry 与 Tom 大致平分领先。
Harry 在大多数时间领先 在 400 局游戏中的 46 局(11.5%)里,Harry 在 100 次投掷中的 95 次或更多次上领先。

图 2 Harry 领先机会的直方图。
当然,这三种可能性并非全部的可能性;这正是频数之和不等于 400 局、也不等于 100% 的原因。你也许会想:是什么解释了"0 到 5"这一结果看起来比"95 到 100"更有可能,而两者又都比 Tom 与 Harry 大致平分领先更有可能?这一差异有多大?这些结果是否与硬币是"公平"的、正反面概率相等的假设相矛盾?这些结果对 Harry 或 Tom 最终的盈亏又说明了什么?
你可以多次点击「运行实验」按钮做实验,看看结果在一次实验与下一次实验之间如何变化。每次实验包含 400 局游戏,直觉上结果不会有太大变化。一次实验运行与另一次实验运行是完全一样的,只不过使用了一组新的随机数。(你随时可以点击「重置种子并运行」按钮,回到这里所给出的原始随机数和原始结果。)要验证这里基于 400 局游戏(即 400 次试验)引用的结果,你可以运行一次试验次数非常多的实验,比如 4000 次试验。随着试验次数增加,精度会提高。
3 电子表格中的排队仿真
我们先描述排队模型或等待线模型的组成部分。随后给出两个示例:一个单服务台队列和一个双服务台队列;两者都是动态的、事件驱动的模型。

图 3 单通道排队系统。
3.1 等待线模型
一个排队系统(queueing system)由其呼叫总体(calling population)、到达的性质、服务机制、系统容量以及排队规则(queueing discipline)加以描述。图 3 描绘了一个简单的单通道排队系统。呼叫总体的成员可以是顾客、电话呼叫,或是修理铺里的活件;这里我们称它们为单位(unit)。
在本章的简单模型中,我们假定呼叫总体在潜在意义上是无限的,且到达率是恒定的。也就是说,无论已经到达或仍留在系统中的单位有多少,下一次到达之前的到达间隔时间都服从同一个统计分布。到达的服务请求以随机的方式一个接一个地发生;一旦加入等待线,它们最终都会得到服务。此外,服务时间按某个概率分布取某个随机长度,该分布不随时间变化。系统容量没有限制,这意味着任何数量的单位都可以在排队线上等待。最后,单位按其到达顺序接受服务(通常称为 FIFO:先进先出,或 FCFS:先到先服务),服务由一个服务台或多个并行服务台完成。
服务与到达分别由服务时间的分布和到达之间时间的分布来定义,正如例 2 与例 3 所示。对于任何简单的单通道或多通道队列,总的有效到达率必须小于总服务率,否则等待线将无限增长。当队列无限增长时,称其为爆炸的或不稳定的。(在某些可重入的排队网络中,单位在最终离开系统之前会多次返回同一个服务台,此时"到达率小于服务率"这一条件未必能保证稳定性。更多解释参见 Harrison 与 Nguyen [1995]。有趣的是,这类不稳定性最初并非在理论中被发现,而是在半导体制造厂的实际制造过程中被注意到。)也可能出现更为复杂的情形——例如在短时间内到达率大于服务率,或者具有路由的队列网络。然而,本章只讨论最基本的队列。
系统状态、事件和仿真时钟的概念如何应用于排队模型?排队模型的系统状态通常由系统中的单位数以及服务台状态(忙碌或空闲)构成。事件是一组引起系统状态瞬时变化的情形。在单通道(或任何多通道)排队系统中,事件包括到达事件、服务开始事件和离开事件(也称服务完成事件)。仿真时钟用于跟踪仿真时间。
当离开事件发生时,仿真按图 4 的流程图所示的方式推进。离开事件引起系统状态的变化。如果队列中没有单位在等待,服务台状态变为空闲;如果有一个或多个单位在等待,则下一个单位开始服务。在这两种情形下,系统中的单位数都减少一个。

图 4 离开事件流程图。
到达事件的流程图见图 5。该单位发现服务台要么空闲要么忙碌;因此,该单位要么立即开始服务,要么进入队列。该单位遵循图 6 所示的行动路线。如果服务台忙碌,该单位进入队列。如果服务台空闲且队列为空,该单位开始服务。服务台不可能在队列非空时处于空闲状态。

图 5 到达事件流程图。
| 队列状态 | |||
|---|---|---|---|
| 非空 | 空 | ||
| 服务台状态 | 忙碌 | 进入队列 | 进入队列 |
| 空闲 | 不可能 | 开始服务 | |
| 服务台结果 | 忙碌 | 不可能 | |
| 空闲 | 不可能 |
图 6 到达时单位可能采取的行动。
图 7 服务完成后的服务台结果。
服务完成之后,服务台要么变为空闲,要么在有下一个单位的情况下保持忙碌。这两种结果与队列状态之间的关系见图 7。如果队列非空,另一个单位就占用服务台,服务台于是保持忙碌状态。如果队列为空,服务台变为空闲。这两种可能性表现为图 7 中的阴影部分。
在大多数仿真中,许多事件发生在随机时刻,这种随机性模拟着现实生活中的不确定性。例如,无法确切知道下一位顾客何时会到达杂货店收银台,也无法确切知道银行柜员完成一笔业务要花多长时间。在这些情形下,要根据收集并分析得到的数据,或者根据主观估计与假设,建立数据的统计模型。就我们的目的而言,我们假定到达间隔时间与服务时间服从简单的离散概率分布。
那么,这里所描述的事件是如何在仿真时间中发生的呢?排队系统的仿真通常需要维护一份事件列表(event list),用以判定接下来会发生什么。事件列表跟踪各类事件将要发生的未来时刻。本章通过显式地跟踪每一个单位来简化仿真。注意,这种临时拼凑的做法对于电子表格中的简单仿真而言是令人满意的,但对于更为复杂的现实世界仿真(以及更为有趣的学生仿真)而言,更为系统化的做法是必不可少的。
表 7 是专门为按先进先出(FIFO)原则为顾客服务的单通道队列设计的一张仿真表。它跟踪每个事件发生时的时钟时间。(注意表中不含输出列;这些将在下一个示例中加入。)这张仿真表依据假定的一系列到达间隔时间计算到达时间:
2 4 1 2 6
B、C 和 E 列是仿真时钟时间。B 列(到达时间)仅由所生成的到达间隔时间计算得到。E 列(离开事件或服务完成事件的时间)则可由 D 列所生成的输入以及 C 列中服务开始的时刻容易地计算出来。因此我们看到,计算 C 列(服务开始时间)是主要难点。对一个到达的单位来说,服务开始的时间是以下两个时刻中较晚的一个:其到达时间,或前一单位的离开时间。(对于双服务台以及其他多服务台队列而言,服务完成时间的计算就没那么容易了。)
如表 7 所示,第一位顾客在时钟时刻 0 到达并立即开始服务,该服务需要两分钟。服务在时钟时刻 2 完成。第二位顾客在时钟时刻 2 到达,在时钟时刻 3 服务结束。注意第四位顾客在时钟时刻 7 到达,但服务直到时钟时刻 9 才能开始。这是因为顾客 3 直到时钟时刻 9 才服务结束。
表 7 强调时钟时间的仿真表
| A | B | C | D | E |
|---|---|---|---|---|
| 顾客编号 | 到达时间(时钟) | 服务开始时间(时钟) | 服务时间(活动) | 服务结束时间(时钟) |
| 1 | 0 | 0 | 2 | 2 |
| 2 | 2 | 2 | 1 | 3 |
| 3 | 6 | 6 | 3 | 9 |
| 4 | 7 | 9 | 2 | 11 |
| 5 | 9 | 11 | 1 | 12 |
| 6 | 15 | 15 | 4 | 19 |
表 8 事件的时间顺序
| 事件类型 | 顾客编号 | 时钟时间 |
|---|---|---|
| 到达 | 1 | 0 |
| 离开 | 1 | 2 |
| 到达 | 2 | 2 |
| 离开 | 2 | 3 |
| 到达 | 3 | 6 |
| 到达 | 4 | 7 |
| 离开 | 3 | 9 |
| 到达 | 5 | 9 |
| 离开 | 4 | 11 |
| 离开 | 5 | 12 |
| 到达 | 6 | 15 |
| 离开 | 6 | 19 |
到达事件与离开事件的时间顺序见表 8 和图 8。表 8 按时钟时间排序,但事件未必按顾客编号排序。事件的时间顺序是离散事件仿真方法的基础。
图 8 描绘了系统中的顾客数随时间的变化。它是表 8 事件列表的直观图像。顾客 1 在系统中的时段是从时钟时刻 0 到时钟时刻 2。顾客 2 在时钟时刻 2 到达,在时钟时刻 3 离开。从时钟时刻 3 到时钟时刻 6,系统中没有顾客。在某些时间段内系统中有两名顾客,例如在时钟时刻 8,顾客 3 和顾客 4 都在系统中。此外,也存在事件同时发生的情形,例如在时钟时刻 9,顾客 5 到达而顾客 3 离开。

图 8 系统中的顾客数。
3.2 单服务台队列的仿真
第一个排队示例是单服务台队列。我们用它说明如何计算典型的输出与性能度量,例如顾客的平均等待时间以及服务台空闲的时间比例。
例 5:杂货店收银台——单服务台队列
一家小型杂货店只有一个收银台。顾客在随机时刻到达收银台,相邻两次到达之间的间隔在 1 到 8 分钟之间。我们假定到达间隔时间为整数值,且 8 个取值各以相等概率出现;这就是一个离散均匀分布,如表 9 所示。服务时间在 1 到 6 分钟之间变化(同样为整数值),其概率如表 10 所示。我们的目标是通过仿真 100 位顾客的到达与服务来分析该系统,并计算排队模型中若干典型的性能度量。
实际上,100 位顾客所对应的样本量可能太小,不足以得出可靠的结论。视我们的目标而定,可以通过增大样本量(顾客数)或进行多次试验(或重复)来提高结果的精度。第二个问题是初始条件。一个从空系统开始的杂货店仿真,除非意在模拟系统从启动开始的运行过程,或者意在模拟直至达到稳态运行,否则可能并不现实。这里,为使计算保持简单,起始条件设定为杂货店为空,任何相关顾虑都不予考虑。
表 9 到达之间时间的分布
| G | H | |
|---|---|---|
| 4 | 到达间隔时间(分钟) | |
| 5 | ||
| 6 | 最小值 | 1 |
| 7 | 最大值 | 8 |
表 10 服务时间的分布
| A | B | C | D | |
|---|---|---|---|---|
| 4 | 服务时间(分钟) | 概率 | 累积概率 | |
| 5 | ||||
| 6 | ||||
| 7 | 1 | 0.10 | 0.10 | |
| 8 | 2 | 0.20 | 0.30 | |
| 9 | 3 | 0.30 | 0.60 | |
| 10 | 4 | 0.25 | 0.85 | |
| 11 | 5 | 0.10 | 0.95 | |
| 12 | 6 | 0.05 | 1.00 |
如何由服务时间分布与到达间隔时间分布生成服务时间和到达时间,已分别在第 1.5 节和第 1.6 节中讨论;同样的方法也适用于此处及后续各示例。对于手工仿真,请使用附录中的表 A.1 里的随机数。良好的做法是:从表 A.1 中的某个随机位置开始,沿某个方向系统地推进,并且在给定问题中绝不使用同一串数字。如果反复使用同一种模式,统计偏差或其他怪异效应可能会影响结果。
表 11 给出了单通道队列仿真表的一部分,取自 “Example2.5SingleServer.xls”;其中还给出了若干选定列的合计与平均值(位于仿真表上方)。第一步是初始化该表,即填写第一位顾客所在的各单元格——假定该顾客在时刻 0 到达并立即开始服务。这位顾客在 2 分钟时刻结束服务(第一个随机服务时间)。在第一位顾客之后,表中后续各行依据当前顾客随机生成的到达间隔时间与服务时间、前一位顾客的完成时间,以及对电子表格解答而言仿真表中各单元格公式所包含的仿真逻辑来确定。
接下来,第二位顾客在 5 分钟时刻到达并立即开始服务。因此,第二位顾客在队列中没有等待,而服务台有 3 分钟的空闲时间。
往下看,我们看到第五位顾客在 16 分钟时刻到达,发现服务台忙碌。在 18 分钟时刻,前一位顾客离开,第五位顾客开始服务,已在队列中等待了 2 分钟。这一过程对全部 100 位顾客持续进行。“Example2.5SingleServer.xls” 中的电子表格解答包含实现此处所述步骤的公式。为了最好地理解这些公式,你应当先尝试手工仿真若干步骤、弄清楚其中的逻辑,然后再研究这些公式是如何实现该逻辑的。
表中增加了 G、I 和 J 三列,用来收集三个模型输出,即每位顾客在队列中的时间、在系统中的时间,以及从前一位顾客离开到当前顾客到达之间服务台的空闲时间(如有)。这些模型输出又进一步用于计算若干性能度量,即顾客在队列中的平均时间和在系统中的平均时间,以及服务台空闲的时间比例。
为了计算系统性能度量,可以使用表 11 中已计算出的响应,该表给出了到达间隔时间、服务时间、顾客在队列中的等待时间、顾客在系统中所花的时间以及服务台空闲时间的合计与平均值。这些结果取自电子表格模型「One Trial」工作表上使用默认 RNG 种子(12,345)时的第一次试验运行。利用这些结果,我们可以说明等待线模型中若干典型的性能度量:
表 11 食品店仿真的模型响应与仿真表(前 11 位顾客)
| A | B | C | D | E | F | G | H | I | J | |
|---|---|---|---|---|---|---|---|---|---|---|
| 15 | 合计 | 420 | 320 | 163 | 483 | 106 | ||||
| 16 | 平均值 | 4.24 | 3.20 | 1.63 | 4.83 | 1.07 | ||||
| 17 | 顾客人数= | 100 | ||||||||
| 18 | 仿真表 | |||||||||
| 19 | 步骤 | 活动 | 时钟 | 活动 | 时钟 | 输出 | 时钟 | 输出 | 输出 | |
| 20 | 顾客 | 到达间隔时间(分钟) | 到达时间 | 服务时间(分钟) | 服务开始时间 | 队列中等待时间(分钟) | 服务结束时间 | 顾客在系统中所花时间(分钟) | 服务台空闲时间(分钟) | |
| 21 | ||||||||||
| 22 | ||||||||||
| 23 | 1 | 0 | 0 | 2 | 0 | 0 | 2 | 2 | ||
| 24 | 2 | 5 | 5 | 2 | 5 | 0 | 7 | 2 | 3 | |
| 25 | 3 | 5 | 10 | 4 | 10 | 0 | 14 | 4 | 3 | |
| 26 | 4 | 4 | 14 | 4 | 14 | 0 | 18 | 4 | 0 | |
| 27 | 5 | 2 | 16 | 3 | 18 | 2 | 21 | 5 | 0 | |
| 28 | 6 | 8 | 24 | 2 | 24 | 0 | 26 | 2 | 3 | |
| 29 | 7 | 7 | 31 | 3 | 31 | 0 | 34 | 3 | 5 | |
| 30 | 8 | 8 | 39 | 5 | 39 | 0 | 44 | 5 | 5 | |
| 31 | 9 | 5 | 44 | 1 | 44 | 0 | 45 | 1 | 0 | |
| 32 | 10 | 2 | 46 | 6 | 46 | 0 | 52 | 6 | 1 | |
| 33 | 11 | 1 | 47 | 4 | 52 | 5 | 56 | 9 | 0 |
- 顾客的平均等待时间为 1.63 分钟,计算如下:
- 顾客需要在队列中等待的概率为 0.46,计算如下:
- 服务台约有 25% 的时间处于空闲,计算如下:
因此,服务台约有 75% 的时间处于忙碌。
- 平均服务时间为 3.20 分钟,计算如下:
通过求服务时间分布的均值,可以把这一结果与期望服务时间作比较,所用的公式为
把期望值公式应用于表 10 中的分布,得到
期望服务时间与本次仿真试验所得的平均服务时间完全相同。一般说来并非如此;这里纯属巧合。
- 到达之间的平均时间为 4.24 分钟,计算如下:
由于第一次到达发生在时刻 0,我们除以 99 而不是 100。通过求端点为 和 的离散均匀分布的均值,可以把这一结果与到达之间的期望时间作比较。均值为
到达之间的期望时间略高于平均值。不过,随着仿真时间变长,到达之间时间的平均值会越来越接近理论均值 。
- 需要等待的那些顾客的平均等待时间为 3.54 分钟,计算如下:
注意,这不同于所有顾客的平均等待时间,因为许多顾客(本次仿真中有 54 位)在开始接受服务之前完全没有等待。在全部顾客中,平均等待时间为 分钟。需要等待的顾客人数 46,来自仿真表中"队列中等待时间"一栏下的 G 列,方法是数出非零等待时间的个数;也可以从图 9 得到,图 9 展示了这 100 个等待时间的直方图。
- 顾客在系统中所花的平均时间为 4.83 分钟,可用两种方式计算。第一种:
第二种方式是认识到下述关系必定成立:
个体顾客队列等待时间的频率分布

图 9 队列中等待时间的频率。
由结论 1 和结论 4 可得:
顾客在系统中所花的平均时间 = 1.63 + 3.20 = 4.83 分钟
现在我们感兴趣的是开展一项实验,以回答前 100 位顾客在队列中的平均时间如何逐日变化这一问题。把「One Trial」工作表以 100 位顾客运行一次,相当于一天。把它运行 50 次,则相当于使用「Experiment」工作表并把"试验次数"设为 50,其中每次试验代表一天。
对于例 5,图 9 给出了第一次试验中前 100 位顾客在队列中等待时间的频率。(注意:在本章余下部分的所有直方图中,组(区间)的上限都标注在 x 轴的图例上,即使图例显示在组(区间)的中央。)如直方图所示,54% 的顾客不必等待,而在需要等待的顾客中,34% 等待不到 4 分钟(但大于零分钟)。这些结果和图 9 中的直方图代表的是一次试验的结果,仅凭它们本身并不构成对我们问题的回答。
为回答我们的问题,我们使用「Experiment」工作表,把"试验次数"设为 50,然后点击标有「重置种子并运行」的按钮。这样就得到 50 个平均队列时间的估计值(每个都是对 100 位顾客取平均)。50 次试验上的总体平均等待时间为 1.32 分钟。图 10 是 50 次试验所得 50 个平均等待时间的直方图。它显示了在 50 天的样本中,平均等待时间如何逐日变化。
通过在电子表格解答上做实验并完成相关习题,你可以发现随机性以及所假定输入数据的影响。例如,如果你运行 400 次试验或 10 次试验,而不是 50 次,会怎样?图 10 中分布的形状会因试验次数而改变多少?为什么图 9 中的取值范围(0 到 12 分钟)要比图 10 中的取值范围(0.5 到 3 分钟)宽得多?

图 10 50 次试验平均等待时间的频率分布。
3.3 双服务台队列的仿真
第二个排队示例是一个具有两个服务台且两者服务时间不同的队列。
例 6:Able–Baker 呼叫中心问题
某计算机技术支持中心由 Able 和 Baker 两个人负责,他们接听来电、尝试解答问题并解决计算机故障。两次来电之间的间隔在 1 到 4 分钟之间,其分布如表 12 所示。Able 更有经验,能够比 Baker 提供更快的服务。他们的服务时间分布分别见表 13 和表 14。
当两人都空闲时,由 Able 接听。当两人都忙碌时,来电转入等待;这基本上与任何排队模型中顾客必须在排队线上等待是一回事。一般而言,仿真中的到达时间、服务时间以及由此得出的时钟时间都应当是连续的(实值)变量;它们在此处(以及其他示例中)是离散的、整数值,纯粹是为了便于讲解以及理解前面所解释的随机变量生成技术。
表 12 技术支持来电的到达间隔分布
| B | C | D | |
|---|---|---|---|
| 4 | 来电的到达间隔分布 | ||
| 5 | 到达间隔时间(分钟) | 概率 | 累积概率 |
| 6 | |||
| 7 | |||
| 8 | 1 | 0.25 | 0.25 |
| 9 | 2 | 0.40 | 0.65 |
| 10 | 3 | 0.20 | 0.85 |
| 11 | 4 | 0.15 | 1.00 |
表 13 Able 的服务时间分布
| F | G | H | |
|---|---|---|---|
| 4 | Able 的服务时间分布 | ||
| 5 | 服务时间(分钟) | 概率 | 累积概率 |
| 6 | |||
| 7 | |||
| 8 | 2 | 0.30 | 0.30 |
| 9 | 3 | 0.28 | 0.58 |
| 10 | 4 | 0.25 | 0.83 |
| 11 | 5 | 0.17 | 1.00 |
表 14 Baker 的服务时间分布
| I | J | K | |
|---|---|---|---|
| 4 | Baker 的服务时间分布 | ||
| 5 | 服务时间(分钟) | 概率 | 累积概率 |
| 6 | |||
| 7 | |||
| 8 | 3 | 0.35 | 0.35 |
| 9 | 4 | 0.25 | 0.60 |
| 10 | 5 | 0.20 | 0.80 |
| 11 | 6 | 0.20 | 1.00 |
仿真的推进方式与例 5 中的单服务台情形类似,只是其内在逻辑(仿真表中的电子表格公式)更为复杂,原因有二:有两个服务台,而且两个服务台的服务时间不同。完整的解答在工作簿 “Example2.6AbleBaker.xls” 中,表 15 展示了其中的一部分,并给出了估计来电者延迟(等待时间)所需的一些合计。该工作簿详细说明了仿真的各个步骤,包括计算每一步所依据的内在逻辑(公式)。(要理解这些步骤,你或许可以先做一次手工仿真,例如从一张包含步骤 1(第 20 行)以及到达间隔时间和服务时间各列的仿真表开始,尝试与表 15 中的结果对照。)
我们的目标是估计来电者在等待 Able 或 Baker 接听过程中所承受的延迟(等待时间)。为估计这一以及其他所期望的系统性能度量,我们对前 100 位来电者进行一次仿真。
从表 15 可见,假定来电者 1 在时钟时刻 0 到达。此时 Able 空闲,因此来电者 1 立即开始服务。服务时间 4 分钟,是按例 2 中的过程(投掷"随机飞镖”)由表 13 给出的分布生成的。因此,来电者 1 在时钟时刻 4 分钟完成服务,没有延迟。
表 15 呼叫中心示例的仿真表(100 位来电者中的前 10 位)
| B | C | D | E | F | G | H | I | J | K | L | M | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 13 | 合计 | 73 | 432 | |||||||||
| 14 | 来电者人数= | 100 | 随机数种子 | 12,345 | ||||||||
| 15 | 仿真表 | |||||||||||
| 16 | 步骤 | 活动 | 时钟 | 时钟 | 时钟 | 状态 | 活动 | 时钟 | 时钟 | 时钟 | 输出 | 输出 |
| 17 | 来电者编号 | 到达间隔时间(分钟) | 到达时间 | Able 可服务时刻 | Baker 可服务时刻 | 选中的服务台 | 服务时间(分钟) | 服务开始时间 | 服务完成时间 | 来电者延迟(分钟) | 在系统中的时间(分钟) | |
| 18 | Able | Baker | ||||||||||
| 19 | ||||||||||||
| 20 | 1 | 0 | 0 | 0 | Able | 4 | 0 | 4 | 0 | 4 | ||
| 21 | 2 | 1 | 1 | 4 | 0 | Baker | 4 | 1 | 5 | 0 | 4 | |
| 22 | 3 | 1 | 2 | 4 | 5 | Able | 3 | 4 | 7 | 2 | 5 | |
| 23 | 4 | 3 | 5 | 7 | 5 | Baker | 3 | 5 | 8 | 0 | 3 | |
| 24 | 5 | 2 | 7 | 7 | 8 | Able | 5 | 7 | 12 | 0 | 5 | |
| 25 | 6 | 2 | 9 | 12 | 8 | Baker | 5 | 9 | 14 | 0 | 5 | |
| 26 | 7 | 1 | 10 | 12 | 14 | Able | 5 | 12 | 17 | 2 | 7 | |
| 27 | 8 | 2 | 12 | 17 | 14 | Baker | 4 | 14 | 18 | 2 | 6 | |
| 28 | 9 | 4 | 16 | 17 | 18 | Able | 2 | 17 | 19 | 1 | 3 | |
| 29 | 10 | 1 | 17 | 19 | 18 | Baker | 3 | 18 | 21 | 1 | 4 |

图 11 第一次试验中来电者延迟的频率。
按例 3 中的过程由表 12 生成的 1 分钟到达间隔时间,使来电者 2 在时钟时刻 1 分钟到达。此时 Able 忙碌,因此来电者 2 由 Baker 服务。
来看来电者 3,他由 Able 从时钟时刻 4 分钟服务到时钟时刻 7 分钟;可以看到,来电者 3 在 2 分钟时刻到达时发现两个服务台都忙碌,因而不得不等待。
对于 100 位来电者的单次试验,图 11 中的频率图显示,100 位来电者中有 78 位(78%)没有延迟,16% 的延迟为 1 分钟,而少数几位不得不等待至多 3 分钟。使用不同随机数的其他试验,可能得到相似的结果,也可能得到大不相同的结果;唯有通过实验才能确定仿真 100 位顾客时所固有的变异性。
图 11 中来电者延迟的分布是右偏的。在「One Trial」工作表上反复点击「生成新试验」按钮,留意到来电者延迟分布常常有一条又长又细的尾巴伸向右侧。除了靠近零的高柱(高频数)之外,这对来电者延迟的性质意味着什么?一次试验提供的数据不足以据以形成可靠的结论,但这是使用电子表格的一大优势——变异性的影响相当明显——而且可以借助「Experiment」工作表把仿真重复任意多次。
在表 15 中,来电者延迟合计为 73 分钟,平均每位于来电者约 0.73 分钟。然而图 11 的直方图表明,单凭 0.73 分钟这一平均值,并不能很好地反映来电者要等待 Able 或 Baker 多久。虽然本次试验中有 78% 的顾客没有经历延迟,但少数顾客的延迟长达 3 分钟。这说明了根据模型的目标与目的选择恰当的系统性能度量的重要性。毕竟,不必等待的顾客不会抱怨等待,而那些等待很久的顾客则不会在乎平均值是 0.73 分钟。(实际上,在随后的一些试验中,平均延迟要高得多,分布的右偏也更加明显。你应当多次点击「生成新试验」,看看该系统可能表现出多大的随机变异。每次试验代表不同的一天。)

图 12 400 次试验实验中平均来电者延迟的频率。
接下来我们要问的问题是:平均来电者延迟(前 100 位顾客)如何逐日变化?使用「Experiment」工作表,并把每一天视为一次试验,我们把"试验次数"设为 400(即 400 天)。所得平均来电者延迟的分布见图 12 的直方图。请注意,这幅直方图并不是像图 11 那样个别来电者延迟的直方图。
从图 12 可见,大约 22% 的平均延迟(400 个中的 87 个)超过 1 分钟,而大约 78%(400 个中的 313 个)不超过 1 分钟。只有大约 1.25%(400 个中的 5 个)超过 2 分钟。我们看到,第一次试验的结果(平均来电者延迟 0.73 分钟)落在最频繁的组(区间)中,但也存在平均延迟高得多的日子。这个例子表明,一天的(一次试验的)仿真很可能并不能代表系统的长期性能。
总而言之,Able 和 Baker 能否承接服务需求、能在多大程度上承接,取决于你的判据,以及顾客所经历延迟的成本或价值。我们可以猜测,增设一个服务台很可能把来电者延迟(等待时间)降至接近于零;不过,减少顾客延迟所带来的收益,必须与增设一个服务台的成本相权衡。
4 电子表格中的库存仿真
仿真问题中有一类重要的情形涉及库存系统。图 13 所示的简单库存系统称为 (M, N) 系统,它每隔 N 个时段审查一次库存,最大库存水平为 M。每经过 N 个时间单位,就检查一次库存水平,并下订单把库存补足到水平 M。

图 13 概率型订购至水平库存系统。
为简单起见,图 13 中把提前期(lead time,即下达订单与收到订单之间的时间长度)画为零;订单一经下达便立即到达。实际上,提前期可能变化极大,必须建模为一个已知的常数或一个随机变量。
需求通常无法确切知晓,因此订货量要由一个概率分布来建模。在图 13 的图形中,需求被画成在该时段上均匀分布。实际上,需求通常并不均匀,而是随时间波动。
在第一个审查周期结束时,下达一个订货量 ,把库存水平补足到 M。每一次库存审查都重复这一做法。
请注意,在第二个周期中,库存量降到零以下,表明出现了缺货。在图 13 中,这些单位是延期交货(backorder)的;订单到达时,延期交货部分的需求先得到满足。为了避免缺货,就需要持有缓冲库存或安全库存。在某些库存系统中,库存耗尽时,一部分销售会直接流失,而不是延期交货。
库存系统有若干潜在的收入与成本来源:
销售收入;
售出商品的成本;
持有成本,即持有库存所产生的成本;
订货成本,即与下达订单相关的成本;
销售流失或延期交货的成本;
报废所造成的成本;
报废品或其他损坏商品所得的残值收入。
持有成本可以归因于为购买商品而借入资金所支付的利息(或者等价地,由于这些资金无法用于其他投资用途而造成的损失)。持有成本还包括搬运和存储空间的成本、雇请守卫的成本以及诸如此类的其他成本。订货成本可能包括运输与物流费用,以及取决于订货量的折扣。
在试图改进库存系统时,会面临若干权衡。作为持有高库存(并承担高持有成本)的替代方案,可以更频繁地进行审查,从而更频繁地采购或补货。这会带来相应的成本,即订货成本。此外,货物脱销也可能带来成本,这种短缺会使顾客不满,并导致商誉的损失。更大的库存会降低出现短缺的概率。通过调整策略参数或决策参数,可以在各项成本之间进行权衡,以使库存系统的总成本最小。
库存系统的总成本(或总利润)就是性能度量。它会受到各种备选策略的影响。例如,在图 13 中,决策者可以控制最大库存水平 M 以及周期长度 N。
库存系统及其策略有若干参数,其中一些可控,一些不可控。可控变量就是决策变量或策略变量。对库存中的每一项物品而言,这些变量包括:
最大库存水平 M
审查周期 N
订货量(用于补货),Q
补货提前期 L
当提前期无法控制时,它可能是随机的;在其他情形下,提前期也可能被严格控制,实际上就是一个已知的常数(例如在准时制(JIT)制造系统中订购零件或部件时),此时它就成为一个策略变量。
在 (M, N) 库存系统的模型中,可能发生的事件包括对库存中物品的需求、对库存位置的审查以及随之作出的下达补货订单的决定,还有补货库存的到达。当提前期被假定为零时(如图 13 所示),后两个事件在同一时刻发生。
在下面的示例与习题中,我们仿真各种各样的库存系统与库存策略。
4.1 报刊销售商问题的仿真
在下面的示例中,一位报刊销售商必须决定购买多少份报纸。在此类问题中,只有单一长度的一个时段是相关的,并且只进行一次采购。单一时段结束时剩余的库存按废品卖出、丢弃或回收。大量现实世界问题具有类似的特征,包括某些备件的储备、易腐物品、时尚商品以及特殊季节性商品 [Hadley and Whitin, 1963]。
例 7:报刊销售商问题
一位报刊销售商以每份 33 美分购入报纸,以每份 50 美分售出。一天结束时未售出的报纸,按每份 5 美分作为废品出售。报纸可以按 10 份一捆购买。因此,报摊可以买 50 份、60 份或 70 份,等等。订货量 Q 是唯一的策略决策。与某些库存问题不同,订货量 Q 是固定的,因为剩余报纸作为废品处理,期末库存总是为零。
表 16 按新闻日类型划分的每日报纸需求量分布
| B | C | D | E | F | G | H | |
|---|---|---|---|---|---|---|---|
| 4 | 报纸需求量分布 | ||||||
| 5 | 需求 | 需求概率 | 累积概率 | ||||
| 6 | 好 | 一般 | 差 | 好 | 一般 | 差 | |
| 7 | 40 | 0.03 | 0.10 | 0.44 | 0.03 | 0.10 | 0.44 |
| 8 | 50 | 0.05 | 0.18 | 0.22 | 0.08 | 0.28 | 0.66 |
| 9 | 60 | 0.15 | 0.40 | 0.16 | 0.23 | 0.68 | 0.82 |
| 10 | 70 | 0.20 | 0.20 | 0.12 | 0.43 | 0.88 | 0.94 |
| 11 | 80 | 0.35 | 0.08 | 0.06 | 0.78 | 0.96 | 1.00 |
| 12 | 90 | 0.15 | 0.04 | 0.00 | 0.93 | 1.00 | 1.00 |
| 13 | 100 | 0.07 | 0.00 | 0.00 | 1.00 | 1.00 | 1.00 |
新闻日有三种类型:“好”、“一般"和"差”,但报刊销售商无法预测某一天会属于哪一种类型。表 16 给出了按日类型划分的报纸需求量分布。表 17 给出了新闻日类型的分布。
我们的目标是计算报摊应当采购的最优报纸份数(即订货量 Q)。做法是在「One Trial」工作表中仿真 20 天的需求,并对给定的订货量记录每天的销售利润。一次试验完成后,计算总利润(模型响应或性能度量)。为完成实验,我们使用「Experiment」工作表,对给定的订货量(例如 70 份报纸)重复某个次数(例如 400 次)。最后,我们在某个合理范围内改变订货量(40、50、60、70 等等),并依据 20 天期间的总利润比较不同的订货策略。
每日利润由下列关系给出:
由于销售收入为每份 50 美分,而销售商的成本为每份 33 美分,因此对每一份无法供应的需求,损失的利润为 17 美分。
表 17 新闻日类型的分布
| J | K | L | |
|---|---|---|---|
| 4 | 新闻日类型 | ||
| 5 | 类型 | 概率 | 累积概率 |
| 6 | |||
| 7 | 好 | 0.35 | 0.35 |
| 8 | 一般 | 0.45 | 0.80 |
| 9 | 差 | 0.20 | 1.00 |
表 18 采购 70 份报纸的仿真表
| B | C | D | E | F | G | HI | I | |
|---|---|---|---|---|---|---|---|---|
| 16 | 仿真表 | |||||||
| 17 | 天 | 新闻日类型 | 需求 | 销售收入 | 超额需求造成的利润损失 | 废品出售所得残值 | 每日成本 | 每日利润 |
| 18 | ||||||||
| 19 | ||||||||
| 20 | 1 | 一般 | 50 | $25.00 | $0.00 | $1.00 | $23.10 | $2.90 |
| 21 | 2 | 一般 | 50 | $25.00 | $0.00 | $1.00 | $23.10 | $2.90 |
| 22 | 3 | 一般 | 70 | $35.00 | $0.00 | $0.00 | $23.10 | $11.90 |
| 23 | 4 | 好 | 80 | $35.00 | $1.70 | $0.00 | $23.10 | $10.20 |
| 24 | 5 | 差 | 40 | $20.00 | $0.00 | $1.50 | $23.10 | -$1.60 |
| 25 | 6 | 一般 | 50 | $25.00 | $0.00 | $1.00 | $23.10 | $2.90 |
| 26 | 7 | 差 | 50 | $25.00 | $0.00 | $1.00 | $23.10 | $2.90 |
| 27 | 8 | 一般 | 70 | $35.00 | $0.00 | $0.00 | $23.10 | $11.90 |
| 28 | 9 | 好 | 40 | $20.00 | $0.00 | $1.50 | $23.10 | -$1.60 |
| 29 | 10 | 好 | 100 | $35.00 | $5.10 | $0.00 | $23.10 | $6.80 |
| 30 | 11 | 一般 | 70 | $35.00 | $0.00 | $0.00 | $23.10 | $11.90 |
| 31 | 12 | 差 | 50 | $25.00 | $0.00 | $1.00 | $23.10 | $2.90 |
| 32 | 13 | 一般 | 50 | $25.00 | $0.00 | $1.00 | $23.10 | $2.90 |
| 33 | 14 | 差 | 40 | $20.00 | $0.00 | $1.50 | $23.10 | -$1.60 |
| 34 | 15 | 好 | 80 | $35.00 | $1.70 | $0.00 | $23.10 | $10.20 |
| 35 | 16 | 好 | 70 | $35.00 | $0.00 | $0.00 | $23.10 | $11.90 |
| 36 | 17 | 好 | 80 | $35.00 | $1.70 | $0.00 | $23.10 | $10.20 |
| 37 | 18 | 差 | 40 | $20.00 | $0.00 | $1.50 | $23.10 | -$1.60 |
| 38 | 19 | 一般 | 70 | $35.00 | $0.00 | $0.00 | $23.10 | $11.90 |
| 39 | 20 | 好 | 100 | $35.00 | $5.10 | $0.00 | $23.10 | $6.80 |
| 40 | 总利润 = | $114.70 |
这种缺货成本多少有些争议,但使问题有趣得多。废纸的残值为每份 5 美分。
采购 70 份报纸这一决策的仿真表(取自解答工作簿 “Example2.7NewsDealer.xls”)见表 18。在第 1 天,需求为 50 份报纸,因此有 70 份可供出售,其中 20 份作为废品处理。卖出 50 份报纸所得收入为 $25.00,废品残值为 $1.00,因此第一天的利润计算如下:
其余各天的利润用同样的方法即可容易地算出。20 天期间的利润是各日利润之和,为 $114.70,如表 18 所示。一般而言,由于某一天的结果与之前各天无关,这类库存问题在电子表格中要比排队问题容易解决得多。
使用 “Example2.7NewsDealer.xls” 中的「Experiment」工作表,我们针对每次订购 70 份报纸的订货策略,设置了包含 400 次试验(或重复)的实验。图 14 给出了这 400 次试验的结果,每次试验都是一次 20 天的仿真运行。20 天总利润的平均值(在 400 次试验上取平均)为 $135.49。20 天利润的最小值为 $86.60,最大值为 $198.00。图 14 表明,在 400 次试验中,只有 38 次的 20 天总利润超过 $160。(请记住,组(区间)下方的数字是该组(区间)的上限。)

图 14 报刊销售商每天订购 70 份报纸时 20 天总利润的频率。
表 18 中所示的那一次试验利润为 $114.70,处于图 14 中分布的偏低一侧。这再一次说明,一次 20 天试验的结果可能并不代表长期性能,同时也表明有必要仿真若干次试验,并在得出结论之前进行仔细的统计分析。
在「One Trial」工作表上,注意多次点击「生成新试验」按钮时每日利润的变化。无论在标题为"每日利润频率"的直方图(展示 20 天中每一天发生了什么)中,还是在这 20 天的总利润上,结果的变化都相当大。图 15 给出了前四次试验的每日利润直方图,其形状的变化比 20 天总利润直方图的形状变化要大得多。
习题 28 要求你开展一项实验,以确定报刊销售商的最优订货报纸数量。用仿真解决该问题,需要设定每天购买某个数量报纸的策略,并针对该策略运行大量次数的实验。把策略(所购买的报纸数量)改为某个合理范围内的其他取值(比如说 40、50、60 等等),并重复仿真,直到找到最佳取值。要有把握地估计某个仿真的差异很可能是真实存在、而非随机偶然造成的,还需要额外的统计方法。




图 15 报刊销售商问题每日利润的四个典型直方图。
4.2 (M, N) 库存策略的仿真
下一个示例是经典的订购至水平 (M, N) 库存策略,它具有固定的审查周期(N)、最大库存水平(M)、随机需求和随机提前期。
例 8:冰箱库存问题
某销售冰箱的公司通过每隔固定天数(例如 N 天)进行一次审查、并就订购多少台以补充店铺库存作出决策,来维持库存。当前策略是订购至某一水平(订购至水平——设为 M),使用下列关系:
例如,若订购至水平 M 为 11 台冰箱,审查周期 N 为 5 天,而第 5 天结束时的库存为 3 台冰箱,那么在该周期的第五天,将向供应商订购 8 台冰箱。另一方面,若第五天出现了 2 台冰箱的缺货,那么就会订购 13 台冰箱;最先收到的两台将提供给那些已经下单并愿意等待的顾客(所谓的延期交货)。 (与之相对,销售流失的情形是指在无库存可用时顾客的需求直接流失。)
每日需求量(即顾客每天购买的冰箱台数)是随机分布的,如表 19 所示。公司下达补货订单之后,提前期为 1 至 3 天,随机分布,如表 20 所示。假定订单在一天结束时下达。提前期为零时,来自供应商的订单在次日清晨到达,冰箱在第二天即可供应。提前期为一天时(表 20 中的最小可能值),来自供应商的订单在两天后的清晨到达,并在当天即可供应。
表 19 每日需求量的分布
| B | C | D | |
|---|---|---|---|
| 4 | 每日需求量的分布 | ||
| 5 | 需求量 | 概率 | 累积概率 |
| 6 | |||
| 7 | 0 | 0.10 | 0.10 |
| 8 | 1 | 0.25 | 0.35 |
| 9 | 2 | 0.35 | 0.70 |
| 10 | 3 | 0.21 | 0.91 |
| 11 | 4 | 0.09 | 1.00 |
表 20 提前期的分布
| F | G | H | |
|---|---|---|---|
| 4 | 提前期的分布 | ||
| 5 | 提前期(天) | 概率 | 累积概率 |
| 6 | |||
| 7 | 1 | 0.60 | 0.60 |
| 8 | 2 | 0.30 | 0.90 |
| 9 | 3 | 0.10 | 1.00 |
“订购至 11 台冰箱"这一策略的仿真表见表 21,取自电子表格解答 “Example2.8RefrigInventory.xls”。仿真以如下的假定初始条件开始:期初库存为 3 台冰箱,且此前有一笔 8 台冰箱的补货订单将在 2 天后到达。(如需要,这些值可以在电子表格解答中更改。)
跟踪仿真表中若干选取的日子,可以看出仿真的逻辑。8 台冰箱的订单在第一个周期第三天的清晨可以到货,使库存水平从零台冰箱上升到 8 台冰箱。第一个周期余下时间的需求,使第五天结束时的库存水平降至 3 台冰箱。因此下达了一个 8 台冰箱的订单;其提前期恰为 2 天。这笔订单在第 2 个周期的第 7 天清晨计入库存。
请注意,在第 10 天出现了缺货,形成了一笔延期交货,并下达了一笔 13 台冰箱的订单。由于提前期为 2 天,在订单到达之前还会发生额外的缺货,因此当这笔 13 台冰箱的订单到达时,延期交货加上当期需求使库存降至 6 台。
从 25 天(相当于 5 个库存审查周期)的仿真来看,期末库存的平均值约为 2.76(69/25)台。在 25 天中,有 5 天存在缺货状况。
表 21 订购至 11 台冰箱的库存策略仿真表
| B | C | D | E | F | G | H | I | J | K | |
|---|---|---|---|---|---|---|---|---|---|---|
| 13 | 仿真表 | |||||||||
| 14 | 步骤 | 状态 | 状态 | 状态 | 输入 | 状态 | 状态 | 状态 | 活动 | 状态 |
| 15 | 时钟 | 周期 | 周期内天数 | 期初库存 | 需求量 | 期末库存 | 缺货数量 | 在途订单(数量) | 提前期(天) | 距订单到达的天数 |
| 16 | 天 | |||||||||
| 17 | ||||||||||
| 18 | 0 | 0 | 5 | - | - | 3 | 0 | 8 | 2 | 2 |
| 19 | 1 | 1 | 1 | 3 | 2 | 1 | 0 | 8 | 1 | |
| 20 | 2 | 1 | 2 | 1 | 1 | 0 | 0 | |||
| 21 | 3 | 1 | 3 | 8 | 2 | 6 | 0 | |||
| 22 | 4 | 1 | 4 | 6 | 1 | 5 | 0 | |||
| 23 | 5 | 1 | 5 | 5 | 2 | 3 | 0 | 8 | 1 | 1 |
| 24 | 6 | 2 | 1 | 3 | 3 | 0 | 0 | |||
| 25 | 7 | 2 | 2 | 8 | 2 | 6 | 0 | |||
| 26 | 8 | 2 | 3 | 6 | 3 | 3 | 0 | |||
| 27 | 9 | 2 | 4 | 3 | 2 | 1 | 0 | |||
| 28 | 10 | 2 | 5 | 1 | 3 | 0 | 2 | 13 | 2 | 2 |
| 29 | 11 | 3 | 1 | 0 | 1 | 0 | 3 | 13 | 1 | |
| 30 | 12 | 3 | 2 | 0 | 2 | 0 | 5 | |||
| 31 | 13 | 3 | 3 | 13 | 2 | 6 | 0 | |||
| 32 | 14 | 3 | 4 | 6 | 3 | 3 | 0 | |||
| 33 | 15 | 3 | 5 | 3 | 1 | 2 | 0 | 9 | 1 | 1 |
| 34 | 16 | 4 | 1 | 2 | 0 | 2 | 0 | |||
| 35 | 17 | 4 | 2 | 11 | 4 | 7 | 0 | |||
| 36 | 18 | 4 | 3 | 7 | 2 | 5 | 0 | |||
| 37 | 19 | 4 | 4 | 5 | 3 | 2 | 0 | |||
| 38 | 20 | 4 | 5 | 2 | 3 | 0 | 1 | 12 | 1 | 1 |
| 39 | 21 | 5 | 1 | 0 | 2 | 0 | 3 | |||
| 40 | 22 | 5 | 2 | 12 | 1 | 8 | 0 | |||
| 41 | 23 | 5 | 3 | 8 | 4 | 4 | 0 | |||
| 42 | 24 | 5 | 4 | 4 | 1 | 3 | 0 | |||
| 43 | 25 | 5 | 5 | 3 | 1 | 2 | 0 | 9 | 1 | 1 |
| 44 | 合计 | 69 | 14 | |||||||
| 45 | 平均值 | 2.04 | 2.76 | 0.56 |
冰箱每日期末库存平均值的频率分布

图 16 25 天期末库存平均值的直方图。
在例 8 中,任何时刻都只能有一笔供应商订单尚未到货;但也存在这样的情形:提前期极长,以致迄今为止所展示的关系需要作如下修改:
计入在途数量,可以保证不会出现重复订货。
在「One Trial」工作表上,反复点击「生成新试验」将用不同的随机数运行下一次试验(或重复),这表明对于 25 天的仿真,每日期末库存的结果变化很大。(请注意随着新试验的运行,直方图如何变化。)相比之下,在「Experiment」工作表中把试验次数设为 100 并通过点击「运行实验」按钮反复运行实验,则在每日期末库存的平均值上产生的变异性要小得多(平均值是在一次 25 天的试验上取的)。25 天的平均值通常落在 1 到 5 台冰箱的范围内,如图 16 所示的直方图。变异性上的这一差异说明了一个众所周知的事实:平均数的波动小于单个观测值。在具体分析中该用哪一个,取决于所提出的目标与问题。
“Example2.8RefrigInventory.xls” 中的电子表格解答允许你改变订货策略(即 M 和 N 的取值)。它还允许你对每日需求量和提前期的统计分布作一些修改,但须满足某些限制:提前期必须为一天或更多,审查周期必须大于最长的提前期,可能还有其他限制;否则,实现该逻辑的公式可能不正确。
5 仿真的其他示例
本节包含四个杂项示例:一个可靠性问题、一次轰炸任务、提前期需求分布的估计,以及一个项目作业网络。
5.1 可靠性问题的仿真
下一个示例比较铣床上更换轴承的两种更换策略。该示例是一个蒙特卡罗仿真,而不是动态的事件驱动模型,因为其中不含事件和时钟时间。每个轴承的寿命都随机生成 15 次,并据此计算成本。
例 9:更换铣床上的轴承
一台铣机有三个不同的轴承,会在服役中失效。每个轴承寿命的分布都相同,如表 22 所示。轴承失效时,铣机停机,召唤一名机械师,由他为她装上一个新轴承(每只轴承 $32)。机械师到达的延迟时间是随机的,其分布见表 23。估计铣机停机的成本为每分钟 $10。机械师在现场的直接成本为每小时 $30。机械师更换一个轴承需要 20 分钟,更换两个轴承需要 30 分钟,更换三个轴承需要 40 分钟。工程人员提出了一项新策略:每当一个轴承失效时,就更换全部三个轴承。管理层需要对这一提案作出评价,所用的性能度量为每 10,000 轴承小时的总成本。
表 22 轴承寿命的分布
| B | C | D | |
|---|---|---|---|
| 3 | 轴承寿命分布 | ||
| 4 | 轴承寿命 | 概率 | 累积概率 |
| 5 | |||
| 6 | 1000 | 0.10 | 0.1 |
| 7 | 1100 | 0.13 | 0.23 |
| 8 | 1200 | 0.25 | 0.48 |
| 9 | 1300 | 0.13 | 0.61 |
| 10 | 1400 | 0.09 | 0.70 |
| 11 | 1500 | 0.12 | 0.82 |
| 12 | 1600 | 0.02 | 0.84 |
| 13 | 1700 | 0.06 | 0.90 |
| 14 | 1800 | 0.05 | 0.95 |
| 15 | 1900 | 0.05 | 1.00 |
表 23 直至机械师到达的延迟时间的分布
| F | G | H | |
|---|---|---|---|
| 4 | 延迟时间的分布 | ||
| 5 | 延迟时间 | 概率 | 累积概率 |
| 6 | |||
| 7 | 5 | 0.60 | 0.60 |
| 8 | 10 | 0.30 | 0.90 |
| 9 | 15 | 0.10 | 1.00 |
表 24 现行方法下的轴承更换
| B | C | D | E | F | G | H | |
|---|---|---|---|---|---|---|---|
| 17 | 仿真表 | ||||||
| 18 | 步骤 | 轴承 1 | 轴承 2 | 轴承 3 | |||
| 19 | 寿命(小时) | 延迟(分钟) | 寿命(小时) | 延迟(分钟) | 寿命(小时) | 延迟(分钟) | |
| 20 | |||||||
| 21 | 1 | 1000 | 5 | 1700 | 10 | 1300 | 10 |
| 22 | 2 | 1200 | 5 | 1100 | 5 | 1100 | 5 |
| 23 | 3 | 1200 | 10 | 1000 | 10 | 1300 | 10 |
| 24 | 4 | 1500 | 5 | 1000 | 10 | 1100 | 15 |
| 25 | 5 | 1700 | 5 | 1900 | 15 | 1200 | 5 |
| 26 | 6 | 1200 | 5 | 1200 | 10 | 1500 | 10 |
| 27 | 7 | 1300 | 5 | 1500 | 5 | 1100 | 10 |
| 28 | 8 | 1700 | 5 | 1700 | 5 | 1400 | 15 |
| 29 | 9 | 1000 | 5 | 1300 | 5 | 1800 | 15 |
| 30 | 10 | 1800 | 10 | 1300 | 5 | 1200 | 5 |
| 31 | 11 | 1200 | 5 | 1100 | 5 | 1500 | 5 |
| 32 | 12 | 1100 | 5 | 1800 | 5 | 1100 | 10 |
| 33 | 13 | 1300 | 10 | 1200 | 5 | 1700 | 10 |
| 34 | 14 | 1300 | 10 | 1100 | 5 | 1300 | 10 |
| 35 | 15 | 1100 | 5 | 1300 | 5 | 1300 | 10 |
| 36 | 合计 | 19,600 | 95 | 20,200 | 105 | 19,900 | 145 |
现行策略的仿真表见表 24,取自电子表格 “Example2.9CurrentBearings.xls”,它表示在"只更换那个失效的单个轴承"的现行策略下,15 次轴承更换的仿真。请注意,存在多个轴承同时失效的情形。这在实践中不太可能发生,其原因是采用了粗略的简化假设——假定轴承寿命是 100 小时的整数倍(这样我们就能采用一个简单的离散分布,而不是更贴近现实的分布)。这里我们假定这些时刻绝不会完全相同,因此任何一次故障中至多只更换一个轴承。
由这次仿真试验(或重复)出发,现行系统的成本估计如下:
全部 45 个轴承的总寿命为 小时。因此,每 10,000 轴承小时的总成本为 ($14,340/5.97) $2,402。
所提方法的仿真表见表 25,取自电子表格 “Example2.9ProposedBearings.xls”。对于第一组轴承,最早的失效发生在 1,100 小时。
表 25 所提方法下的轴承更换
| B | C | D | E | F | G | |
|---|---|---|---|---|---|---|
| 17 | 仿真表 | |||||
| 18 | 步骤 | 轴承 1 | 轴承 2 | 轴承 3 | 首次失效(小时) | |
| 19 | 寿命(小时) | 寿命(小时) | 寿命(小时) | 延迟(分钟) | ||
| 20 | ||||||
| 21 | 1 | 1300 | 1100 | 1300 | 1,100 | 10 |
| 22 | 2 | 1100 | 1200 | 1500 | 1,100 | 5 |
| 23 | 3 | 1100 | 1400 | 1800 | 1,100 | 15 |
| 24 | 4 | 1200 | 1500 | 1100 | 1,100 | 10 |
| 25 | 5 | 1700 | 1300 | 1300 | 1,300 | 5 |
| 26 | 6 | 1700 | 1100 | 1000 | 1,000 | 10 |
| 27 | 7 | 1000 | 1900 | 1200 | 1,000 | 10 |
| 28 | 8 | 1500 | 1700 | 1300 | 1,300 | 15 |
| 29 | 9 | 1300 | 1100 | 1800 | 1,100 | 5 |
| 30 | 10 | 1200 | 1100 | 1300 | 1,100 | 5 |
| 31 | 11 | 1000 | 1200 | 1200 | 1,000 | 15 |
| 32 | 12 | 1500 | 1700 | 1200 | 1,200 | 10 |
| 33 | 13 | 1300 | 1700 | 1000 | 1,000 | 10 |
| 34 | 14 | 1800 | 1200 | 1100 | 1,100 | 10 |
| 35 | 15 | 1300 | 1300 | 1100 | 1,100 | 10 |
| 36 | 合计 | 16600 | 145 |
在那时,三个轴承全都被更换了,尽管其余轴承还剩下更多的寿命。例如,轴承 1 本来还可以再使用 200 小时。
由该模型这次仿真试验(或重复)出发,所提策略的成本估计如下:
轴承的总寿命为 小时。因此,每 10,000 轴承小时的总成本为 ($9,190/4.98) $1,845。新策略每 10,000 小时的轴承寿命可节省 $557。
例 9 的电子表格解答分别是:现行策略见 “Example2.9CurrentBearings.xls”,所提策略见 “Example2.9ProposedBearings.xls”。在每个电子表格中,用户都可以更改若干输入:轴承寿命的分布、直至机械师到达的延迟时间的分布、成本参数,以及每个轴承或每组轴承的维修时间。
5.2 命中目标的仿真
下一个示例仿真一次轰炸任务,其中炸弹实际落点相对于目标的偏差量由一个正态分布定义,随机取值。该电子表格解答提供了一种生成这些正态随机变量的方法;手工解答则使用附录中表 A.2 的标准正态随机数。
就我们的目的而言,请回顾一下:正态分布(钟形曲线)关于其均值对称,其可能的取值范围由标准差决定;它在下一个示例中的用途,是正态分布用来表示误差的经典用法,本例中即相对于目标的偏差。这个示例是一个纯粹的蒙特卡罗抽样实验,因为其中既不含事件也不含时钟时间;因此,它不是动态的离散事件模型。
例 10:一次轰炸任务
考虑一架轰炸机试图摧毁一座弹药库,如图 17 所示。(这架轰炸机携带的是常规武器而非激光制导武器。)如果炸弹落在目标内部任何位置,就算命中;否则就是未命中。(请注意,当炸弹在视觉上似乎触及某条边界线时,它可能命中也可能没有命中目标;模型利用 (X, Y) 坐标以及弹药库分段线性边界的方程,在数学上判定是否发生了命中。)

图 17 带有 10 个炸弹落点的弹药库。
轰炸机沿水平方向飞行,携带 10 枚炸弹。瞄准点为 (0,0)。假定实际命中点围绕瞄准点呈正态分布,在飞行方向上标准差为 400 米,在垂直方向上标准差为 200 米。问题是仿真这一行动并估计命中目标的炸弹数量。
请回顾,标准正态变量 的均值为 0、标准差为 1,其分布为
其中 是正态随机变量, 是 X 的分布的均值,σ 是 X 的标准差。于是,在均值为零、且 与 的情况下,有
其中 (X, Y) 是模拟出的炸弹命中坐标。
表 26 模拟的一次轰炸
| F | G | H | I | J | K | L | M | N | O | P | Q | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 3 | 各枚炸弹的命中点(1–10) | |||||||||||
| 4 | 炸弹 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 命中数 |
| 5 | X | 891.8 | -1257.3 | 429.6 | 24.5 | -321.0 | -77.3 | 131.4 | 304.5 | -442.7 | -403.9 | |
| 6 | Y | -400.7 | -159.4 | 25.3 | 243.6 | 146.5 | 260.7 | -228.3 | -62.0 | 49.7 | 51.0 | |
| 7 | 命中? | 未命中 | 未命中 | 命中 | 命中 | 命中 | 命中 | 命中 | 命中 | 未命中 | 未命中 | 6 |
下标 i 和 j 是为了表明 x 方向和 y 方向的 Z 值应当不同。这些 Z 值是什么,又能在哪里找到?Z 值是均值为零、标准差为一的随机正态数。它们可以从均匀分布的随机数生成。就我们的目的而言,手工仿真可以使用附录中的表 A.2,电子表格模型则可以使用第 1.2 节列出的 Excel 公式。
例如,表 A.2 中最先的两个随机正态数是 0.23 和 -0.17,由此得到第一枚炸弹的 (x, y) 坐标为 (92.0, 34.0),这是把随机正态数分别乘以 400 和 200 这两个标准差得到的,如上式所示。
表 26 给出了模拟一次轰炸运行的结果。在我们的电子表格解答 “Example2.10Target.xls” 中,我们使用第 1.2 节所述的工作表函数 NORMSINV(Rnd01()) 来生成具有所需标准差的正态变量,如下所示:
用于 x 坐标(其中单元格 E5 存放 x 方向的标准差)。y 坐标可以用一个类似的公式处理。
使用 “Example2.10Target.xls” 中的电子表格解答,按假定的形状和标准差,我们运行了包含 400 次试验的实验(每次试验为 10 枚炸弹)。图 18 的直方图给出命中数量的频数,即有多少次轰炸运行取得了给定的命中数(可能的命中数从 0 到 10)。
从电子表格模型「Experiment」工作表的"多次试验汇总"中可以看到,实际结果从 2 次命中到 10 次命中,平均为 6.77 次命中。(显然,0 次命中或 1 次命中都是可能的。由于我们做了 400 次重复,实验仍表明:在具有所假定特征的轰炸任务中,1 次命中或 0 次命中极不可能发生。)如果我们只仿真一次任务(即一次试验),可能得到极具误导性的结果,而图 18 提供了有用的描述性信息。例如,在 17%(400 次中的 68 次)的轰炸运行中,命中数为 5 次或更少。在约 60% 的运行中(400 次中的 239 次),命中数为 7 次或更多。
“Example2.10Target.xls” 中的电子表格模型允许你通过编辑目标各条边两端点的 (X, Y) 坐标来改变目标的形状,只要保持形状为凸形即可。你也可以改变标准差,标准差越小则越有可能更接近目标,越大则离目标越远的可能性越大。在该电子表格解答中,模拟落点为 (X, Y) 的炸弹是否命中目标,是用初等代数导出的一组线性不等式来判定的;细节在电子表格中有说明。
400 次轰炸任务中命中数量的频率分布

图 18 轰炸任务命中数量的直方图。
5.3 提前期需求分布的估计
下一个示例的目的,是确定提前期需求(lead-time demand)的分布,即在整个提前期内所收到的总需求。提前期是从下达补货订单到收到该订单之间的时间。在这段期间内,需求继续从顾客那里到来。这一期间内顾客的总需求就是提前期需求。
这个模型是蒙特卡罗仿真的一个例子;它不是动态的事件驱动仿真。本质上,其中没有事件也没有时钟时间;它是一个纯粹的抽样实验,其目的是估计一个复杂的统计分布。提前期需求的分布常用于设计更好的库存策略,以尽可能低的成本减少延期交货和销售流失。
我们假定提前期和需求都是随机变量。因此,提前期需求是这样一个随机变量:定义为提前期内各期需求之和,即 ,其中 T 是提前期, 是第 i 个时间周期内的需求。提前期需求的分布是这样求得的:仿真许多个提前期周期,对提前期中的每个周期生成随机需求并求和,然后根据结果构建直方图。
例 11:提前期需求
某公司批发销售新闻纸卷。每日需求量由下列概率分布给出:
| 每日需求(卷) | 3 | 4 | 5 | 6 |
|---|---|---|---|---|
| 概率 | 0.20 | 0.35 | 0.30 | 0.15 |
表 27 提前期需求的仿真表
| B | C | D | E | F | G | |
|---|---|---|---|---|---|---|
| 13 | 仿真表 | |||||
| 14 | 周期 | 提前期 | 第 1 天需求 | 第 2 天需求 | 第 3 天需求 | 提前期需求 |
| 15 | ||||||
| 16 | ||||||
| 17 | 1 | 2 | 3 | 5 | 8 | |
| 18 | 2 | 1 | 4 | 4 | ||
| 19 | 3 | 2 | 3 | 5 | 8 | |
| 20 | 4 | 3 | 4 | 5 | 4 | 13 |
| 21 | 5 | 3 | 4 | 5 | 6 | 15 |
| 22 | 6 | 1 | 3 | 3 | ||
| 23 | 7 | 1 | 6 | 6 | ||
| 24 | 8 | 2 | 5 | 6 | 11 | |
| 25 | 9 | 2 | 5 | 3 | 8 | |
| 26 | 10 | 3 | 4 | 3 | 5 | 12 |
| 27 | 11 | 1 | 4 | 4 | ||
| 28 | 12 | 1 | 5 | 5 | ||
| 29 | 13 | 3 | 4 | 4 | 14 | |
| 30 | 14 | 1 | 6 | 6 | ||
| 31 | 15 | 1 | 3 | 3 | ||
| 32 | 16 | 2 | 5 | 3 | 8 | |
| 33 | 17 | 2 | 4 | 6 | 10 | |
| 34 | 18 | 3 | 4 | 5 | 5 | 14 |
| 35 | 19 | 3 | 4 | 3 | 6 | 13 |
| 36 | 20 | 2 | 5 | 6 | 11 |
提前期(即从下达订单到公司从供应商收到订单之间的天数)是一个随机变量,由下列分布给出:
| 提前期(天) | 1 | 2 | 3 |
|---|---|---|---|
| 概率 | 0.36 | 0.42 | 0.22 |
表 27 给出了仿真表,取自 “Example2.11LeadTimeDemand.xls”。这一仿真有一处不同于先前各例的特征:一个周期中所生成的随机需求个数本身是随机的。若生成的提前期为 2 天,就要生成两个随机需求并求和;若提前期为 3 天,则必须生成三个随机需求并求和。
使用电子表格解答,你可以生成许多个周期,把每个周期内的需求求和得到提前期需求,并通过直方图看到由此得到的提前期需求分布,如图 19 所示。该结果是通过在电子表格解答 “Example2.11LeadTimeDemand.xls” 中使用「One Trial」工作表点击「重置种子并运行」来仿真 20 个提前期周期而得到的。多次点击「生成新试验」按钮,你可以看到仅仅 20 个周期之内,提前期需求会有多大的变异。
20 个周期内提前期需求的频率分布

图 19 提前期需求的频率。
把这 20 个周期的结果与电子表格模型「Experiment」工作表上的结果作比较,后者给出的是 200 次试验的结果,每次试验对应一个提前期需求。这一比较表明,由于样本量小,图 19 的直方图可能并不代表提前期需求分布的形状。这说明样本量(试验次数)必须足够大,才能对所期望的响应变量作出准确的估计。
5.4 作业网络的仿真
假设你有一个项目,需要完成若干项活动。每项活动需要一定的时间,或为常数,或为随机。有些活动必须依次进行,也就是说要按规定顺序;另一些活动则可以并行进行。这个项目可以用一张活动网络来表示,如图 20 所示。弧表示活动,节点表示活动的开始或结束。
在图 20 的网络中,有三条路径,每条都从标有"开始”(Start)的节点通往标有"结束”(Finish)的节点。每条路径代表一系列必须依次完成的活动。不同路径上的活动可以并行进行。每项活动的时间标注在弧上,例如 U(2, 4) 表示一个在 2 到 4 分钟之间均匀分布的随机变量。完成一条路径上所有活动所需的时间,是该路径上各活动时间之和。要完成整个项目,所有活动都必须完成;因此,项目完成时间是所有路径完成时间的最大值。
与先前所有示例都不同的是,这里我们使用的是连续均匀分布;也就是说,下限与上限之间的所有取值都是允许的,而不仅仅是整数值。随加载项文件 “BCNNvba.xla” 一起提供、并且任何电子表格模型都可以使用的 VBA 函数 Uniform(),用一行 VBA 代码实现了均匀生成,公式很简单,它把在 0 到 1 上均匀分布的 VBA 随机数发生器 Rnd() 变换到任何指定范围,如下:
我们希望这个简单的公式多少有些直观上的吸引力。基本上,由于 Rnd() 在单位区间 (0, 1) 上均匀分布,因此函数 Uniform() 在所指定区间 (low, high) 上也均匀分布。
Pritsker [1995] 是把仿真技术应用于项目作业网络的先驱。虽然例 12 是一个蒙特卡罗仿真,但有些作业网络模型由于复杂性更高,可能要用离散事件仿真软件包或者专门为此类模型设计的软件包来实现。
例 12:项目仿真
假设三位朋友想为周末来访的客人做培根、鸡蛋和烤面包作为早餐。他们把工作分开,每人准备一样东西。图 20 表示活动的先后顺序,每条路径代表一个人的任务,如下:
完成每项活动所需的时间有一定的不确定性,由图 20 中相应弧上所示的均匀分布表示。这几位朋友希望估计总准备时间的分布,以便能告知客人何时到早餐桌旁就座。有了这个分布,而不只是总准备时间的均值或平均值,他们就能估计在指定时间内准备好早餐的概率。该模型位于电子表格 “Example2.12Project.xls” 中。

图 20 例 12 的活动网络。
由于连续均匀分布的均值是下限与上限的中点,可以看到图 20 项目网络中的 3 条路径每一条的均值都是 9 分钟。由各均匀分布的下限可以看出,每条路径的最短时间是 6 分钟;同样地,最长时间是 12 分钟。这些时间对预测项目总完成时间有任何帮助吗?
就准备早餐而言,项目完成时间就是所有路径上的最大时间。使用电子表格解答 “Example2.12Project.xls”,我们可以对任务时间进行大量次数的抽样,从而了解项目完成时间可能的范围与分布。「One Trial」工作表给出了网络仿真一次试验(或重复)的解答。实现它的逻辑和公式比先前许多示例都要简单得多,我们把这些留给学生。
借助「Experiment」工作表,我们可以运行许多次试验,估计项目完成时间的可能范围以及其他统计量。我们把"试验次数"设为 400,并通过点击一次「重置种子并运行」按钮来运行实验。在 400 次试验并使用默认种子的情况下,结果如下:
样本均值:10.21 分钟
最小值:6.65 分钟
最大值:11.99 分钟
所谓的关键路径(critical path),是在某一次特定试验中最终成为最长的那条路径;也就是说,该路径的时间就是项目完成时间。在 400 次试验中,每次使用不同的随机数,每条路径都有一定的概率成为关键路径。对于这 400 次试验中的每一次,实验都确定哪条路径是关键路径,结果如下:
上路径:25.50% 的试验
中间路径:32.25%
下路径:42.25%
我们由此得出结论:培根最后才做好的概率约为 42.25%。为什么各条路径不是各占约 1/3 的时间?此外,42.25% 这个数有多准确?你可以多次点击「运行实验」按钮,以了解这一估计通常会有多大的变动;每点击一次就会变动几个百分点。这种随机变动的幅度取决于实验中的试验次数(本例中为 400)。
项目完成时间的频率分布

图 21 基于 400 次试验的项目完成时间直方图。
项目完成时间被绘制在频率图(直方图)中,如图 21 所示。从该图我们得出以下推论:
早餐在 9 分钟或更短时间内准备好的概率约为 10.5%(400 次中的 42 次)。
耗时在 11 到 12 分钟之间的概率约为 24.25%(400 次中的 97 次)。
请注意,标注为"12.0"的组(区间)实际上是 11.0 到 12.0 分钟这一区间,因为组(区间)的标注始终是其上限。
回顾 3 条路径各自的平均时间为 9 分钟,直方图告诉我们耗时超过 9 分钟的概率约为 89.5%。换句话说,各条路径的均值几乎不能说明项目完成时间的分布——毕竟项目完成时间是由最慢的那一串任务决定的。
6 小结
本章的目的,是通过示例引入若干关键的仿真概念,并说明若干一般性的应用领域。
我们以仿真表——为每个问题专门定制——作为组织主线。仿真表中的各列代表活动时间或其他随机输入(例如需求)、事件发生时的时钟时间、系统状态,以及模型输出。各行代表一个仿真步骤,例如一位顾客或一天的需求。每个单元格中的公式实现仿真逻辑,或者计算模型输出。这些示例说明,需要弄清楚输入数据的特征、根据输入假设生成随机变量、定义并计算模型响应(性能度量),以及分析所得到的响应。
模型输入由策略参数和决策参数的常数值来定义,或者由服务时间、到达间隔时间、提前期和需求等变量的简单统计分布来定义。模型响应(也称系统性能度量)与仿真表分开计算,但所用的正是模型输出和其他数据,其依据是一次试验或一次仿真运行的结果。这些模型响应包括合计、平均值,以及频率分布(用于绘制直方图)。
在示例中,我们讲述了如何从四种分布类型中生成随机样本:离散经验分布、离散均匀分布、连续均匀分布和正态分布。(经验分布是指该分布基于数据和给定的概率。)本书网站 www.bcnn.net 上提供的电子表格示例,提供了生成每种分布的 VBA 函数。你应当以它们作为完成本章末尾各习题的起点。
仿真表中的事件是通过使用随机变量以及特定模型的逻辑(公式)而产生的。排队示例,特别是双通道队列的示例,说明了可能出现的某些复杂依赖关系——在所讨论的示例中,是相继来到队列的顾客之间的依赖关系。由于这些复杂性,即使是相对简单的队列网络以及其他中等复杂的模型,临时拼凑的仿真表方法也会失效或变得复杂得难以忍受。基于这一点以及其他理由,需要一种更为系统化的方法,例如事件调度方法。
我们引入了开展一项由多次试验或重复构成的实验这一想法,以及它的必要性。我们看到了由此产生的统计变异性,也看到了开展某种进一步分析的必要性。
参考文献
HADLEY G., AND T.M. WHITIN [1963], Analysis of Inventory Systems, Prentice-Hall, Englewood Cliffs, NJ.
HARRISON, J.M., AND V. NGUYEN [1995], “Some Badly Behaved Closed Queueing Networks,” Proceedings of IMA Workshop on Stochastic Networks, eds. F. Kelly and R.J. Williams.
PRITSKER, A. A. B. [1995], Introduction to Simulation and SLAM II, 4th ed., John Wiley, New York.
SEILA, A., V. CERIC, AND P. TADIKAMALLA [2003], Applied Simulation Modeling, Duxbury, Belmont, CA.
习题
电子表格与手工习题
若想了解在 Excel 中实现的提示,请研究 www.bcnn.net 上的电子表格解答,并阅读你感兴趣的任何示例的「Explain」工作表。你可能还需要用到电子表格解答中的一个或多个 VBA 函数。因此,为了让这些 VBA 函数可用,最简便的做法是从一个现有的电子表格模型入手——比如与该习题最接近的某个示例——并把 Excel 加载项文件 “BCNNvba.xla” 放在与你的电子表格相同的文件夹中。该加载项文件可在本书网站上找到。只要某个 VBA 函数位于 Excel 的 VBA 环境中的某个 VB 模块里(无论是在电子表格自身中,还是在一个已打开或已被引用的加载项中),你就可以在电子表格单元格的公式中调用它。
对于任何需要你构建电子表格模型的习题,请从某个示例入手,在「One Trial」工作表中删除、修改或增补已有的输入与仿真表,并使用保留下来的部分。在「Experiment」工作表中,把位于"Link"一词正下方那个单元格中的响应改掉,并按你的需要修改标题和列标题中的任何文字。第 1.5 节所述全部函数的 VBA 实现都在加载项文件 “BCNNvba.xla” 中。每个函数对每一个示例电子表格都是可用的,无论该示例当前是否用到了这个函数。
- 考虑如下连续运转的作业车间。作业的到达间隔时间分布如下:
| 到达之间的时间(小时) | 概率 |
|---|---|
| 0 | .23 |
| 1 | .37 |
| 2 | .28 |
| 3 | .12 |
作业的加工时间服从正态分布,均值 50 分钟,标准差 8 分钟。构建一张仿真表,并针对 10 位新顾客进行仿真。假定仿真开始时,有一件作业正在加工(预计 25 分钟后完成),另有一件加工时间为 50 分钟的作业在队列中。
(a) 这 10 件新作业在队列中的平均时间是多少?
(b) 这 10 件新作业的平均加工时间是多少?
(c) 这 10 件新作业在系统中的最长时间是多少?
- 一位面包师想要弄清楚每天该烤多少打贝果。贝果顾客人数的概率分布如下:
| 顾客人数/天 | 8 | 10 | 12 | 14 |
|---|---|---|---|---|
| 概率 | 0.35 | 0.30 | 0.25 | 0.10 |
顾客按下述概率分布订购 1、2、3 或 4 打贝果:
| 每位顾客订购的打数 | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 概率 | 0.4 | 0.3 | 0.2 | 0.1 |
贝果售价为每打 $8.40,制作成本为每打 $5.80。所有当天未售出的贝果都以半价卖给当地一家杂货店。基于 5 天的仿真,每天应当烤多少打(取整到最接近的 5 打)贝果?
为一个具有 i 个通道的排队系统,设计并解读与图 4 和图 5 类似(analogous)的流程图。
小城出租车(Smalltown Taxi)在上午 9:00 至下午 5:00 期间运营一辆车。目前正在考虑向车队增购第二辆车。对出租车的需求分布如下:
| 两次呼叫之间的时间(分钟) | 15 | 20 | 25 | 30 | 35 |
|---|---|---|---|---|---|
| 概率 | 0.14 | 0.22 | 0.43 | 0.17 | 0.04 |
完成一次服务所需时间的分布如下:
| 服务时间(分钟) | 5 | 15 | 25 | 35 | 45 |
|---|---|---|---|---|---|
| 概率 | 0.12 | 0.35 | 0.43 | 0.06 | 0.04 |
模拟现行系统以及增购一辆出租车后的系统各 5 个单独运行日的运作。就顾客的等待时间以及其他任何有助于说明情况的度量,对这两个系统进行比较。
- 随机变量 X、Y 和 Z 的分布如下:
对随机变量
仿真 50 个取值。用宽度为 3 的组(区间)编制所得取值的直方图。
- 已知 A、B、C 是不相关的随机变量。变量 A 服从正态分布, 且 。变量 B 服从离散均匀分布,其概率分布为 ,其中 b 为 0、1、2、3、4。变量 C 的分布如下表所示:
| C 的取值 | 概率 |
|---|---|
| 10 | .10 |
| 20 | .25 |
| 30 | .50 |
| 40 | .15 |
用仿真估计新变量 D 的均值,其中 D 定义为
使用样本量为 100 的样本。
用仿真估计如下运作的库存系统每周平均的销售流失量:
(a) 每当库存水平降至或低于 10 个单位时,就下达一个订单。同一时刻只能有一笔订单尚未到货。
(b) 每笔订单的数量等于 20 − I,其中 I 是下达订单时的库存水平。
(c) 如果在库存水平为零的时段发生需求,则该笔销售流失。
(d) 每日需求量服从正态分布,均值为 5 个单位,标准差为 1.5 个单位。(仿真过程中把需求量取整到最接近的整数,若结果为负值,则令其需求量为零。)
(e) 提前期在 0 到 5 天之间均匀分布——只取整数。
(f) 仿真开始时库存中有 18 个单位。
(g) 为简单起见,假定订单在营业日结束时下达,并在提前期过去之后收到。因此,若提前期为一天,则该订单在下达订单之后的第二个营业日上午即可供应。
(h) 让仿真运行 5 周。
某制造厂的一台电梯恰好能载运 400 千克物料。有三种物料装在箱中运抵,乘电梯搭乘。这些物料及其到达间隔时间的分布如下:
| 物料 | 重量(千克) | 到达间隔时间(分钟) |
|---|---|---|
| A | 200 | 5 ± 2(均匀) |
| B | 100 | 6(常数) |
| C | 50 | P(2) = 0.33 |
| P(3) = 0.67 |
电梯上到二楼需要 1 分钟,卸货需要 2 分钟,返回一楼需要 1 分钟。除非装满货物,否则电梯不离开一楼。模拟该系统 1 小时的运行。物料 A 的一箱的平均运输时间是多少(从其到达直至卸下)?物料 B 的一箱的平均等待时间是多少?1 小时内共有多少箱物料 C 完成了运输?
- 随机变量 X 和 Y 是实值(非整数)的,在如下区间上均匀分布:
(a) 对随机变量
仿真 200 个取值。编制所得取值的直方图。Z 的取值范围是什么?其平均值是多少?
(b) 与 (a) 相同,只是
- 考虑两块钢板的装配,每块钢板的中心都钻有一个孔。两块钢板通过一根销钉连接。装配时,两块钢板以左下角 (0,0) 为基准对齐。孔的位置在每块钢板上都居于 (3,2)。各个方向上的标准差为 0.0045。孔径服从正态分布,均值为 0.3,标准差为 0.005。销钉直径同样服从正态分布,均值为 0.29,标准差为 0.004。有多大比例的销钉能够穿过装配好的钢板?你的答案应基于 50 次观测的仿真。
h 孔径,i 表示板 1、板 2
p 销钉直径
x 到钢板孔中心的距离,水平方向,i 表示板 1、板 2
y 到钢板孔中心的距离,垂直方向,i 表示板 1、板 2
在上面的习题中,若销钉过松,它就会晃动。当 Min(h1, h2) − p ≥ 0.006 时发生晃动。有多大比例的装配会晃动?(条件概率——即在销钉能够穿过的前提下。)
在一个圆的圆周上随机选取三个点。用蒙特卡罗抽样方法估计三点全部落在同一个半圆上的概率。执行 5 次重复。
统计学中的两个定理如下:
定理 1 设 是相互独立且服从正态分布的随机变量,均值 、方差 。则随机变量
称为服从自由度为 k 的卡方分布,简称
定理 2 设 \(Z \sim N ( 0 , 1 )\),V 为自由度为 k 的卡方随机变量。若 Z 与 V 相互独立,则随机变量
称为服从自由度为 k 的 t 分布,简称
生成一个自由度为 3 的 t 分布随机变量的样本。按所示顺序,使用下列随机值中所需的尽可能多个:
| 随机数 | 随机正态数 |
|---|---|
| 0.6729 | 1.06 |
| 0.1837 | -0.72 |
| 0.2572 | 0.28 |
| 0.8134 | -0.18 |
| 0.5251 | -0.63 |
从 t 分布中生成一个样本,需要多少个随机数和标准随机正态数?
- 某银行有一名免下车服务柜员,另有一处可供一位顾客等待的空间。当队列已满时到达的顾客会把车停好,走进银行办理业务。到达之间的时间以及服务时间的分布如下:
| 到达之间的时间(分钟) | 概率 | 服务时间(分钟) | 概率 |
|---|---|---|---|
| 0 | 0.09 | 1 | 0.20 |
| 1 | 0.17 | 2 | 0.40 |
| 2 | 0.27 | 3 | 0.28 |
| 3 | 0.20 | 4 | 0.12 |
| 4 | 0.15 | ||
| 5 | 0.12 |
模拟免下车服务柜员为 10 位新顾客服务的运作。这 10 位新顾客中的第一位在一个随机确定的时刻到达。仿真开始时,有一位顾客正在接受服务(在时刻 3 离开),另有一位在队列中。有多少顾客走进银行办理了业务?
- 正在估算雪松沼泽湖(Cedar Bog Lake)所覆盖的acre 数。下面给出了该湖的图形,图上标出了以英尺为单位的比例尺:

用仿真估计该湖的面积。(1 acre 等于 43,560 平方英尺。)
在例 6 中,假设增设另一位服务台 Charlie 之后的平均延迟几乎为零。但另一位服务台的成本为每小时 $20。如果平均每位来电者的延迟成本为每小时 $200,那么在什么情况下增设另一位服务台才是可取的?
在例 12 中,为什么各条路径不是各占约 1/3 的时间?
在例 11 中,要得到 3 或 4 的提前期需求,唯一的可能是提前期为一天且需求量为 3 或 4。这种情况发生的概率是 0.36(0.20+0.35) = 0.198。用这一逻辑计算,提前期需求等于 11 或 12 的概率是多少?等于 18 的概率又是多少?(用计算,不要用仿真。)
将例 4(掷硬币游戏)中的实验运行 4000 次试验。解释为什么"Harry 在 100 次投掷中的 5 次或更少次上领先"的概率,应当大于"Harry 在 95 次或更多次投掷中领先"的概率。为什么关于 Tom 你也能说出同样的道理——而且并不矛盾。
基于电子表格示例的习题
修改第 1.5 节中的例 2,改用"WRONG !!“公式来生成服务时间。生成大量服务时间,比如 400 个,并编制所得频数的直方图。对于每个服务时间取值,样本频数与所指定的概率有多接近?解释为什么会不同。也就是说,解释这个公式为什么是错的。
在例 5 中,令到达分布为 1 到 10 分钟之间的均匀分布(只取整数)。运行 50 次试验的实验。所显示的组(区间)频数与图 10 中的相比有差别吗?
在例 5 中,把服务时间分布改为如下:
| 服务时间(分钟) | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 概率 | 0.05 | 0.10 | 0.20 | 0.30 | 0.25 | 0.10 |
运行 50 次试验的实验。此处的平均等待时间与修改之前的例 5 中的平均等待时间有差别吗?如果有差别,你把它归因于什么?
将例 5 中的实验分别运行 25、50、100、200 和 400 次试验。(所有试验都使用不同的随机数集合。)平均等待时间的最小值与最大值有什么差异?如果存在差异,你如何解释?
在例 6 中,运行 10 个实验,每个实验包含 100 次试验。在每个实验中,有多大比例的试验其来电者的平均延迟为 3 分钟或更少?对于刚刚仿真的这 1000 次试验,又有多大比例的来电者其平均延迟为 2 分钟或更少?
在例 6 中,开展一次包含 400 次试验的实验。解释最小平均延迟与最大平均延迟之间为何存在如此大的差距。
在例 6 中,运行 10 个各含 50 次试验的实验,以及 10 个各含 400 次试验的实验。解释你所观察到的这两类实验在输出上的差异(如果有的话)。
在例 6 中,修改电子表格,使 Able 和 Baker 各自接听的电话数能够显示出来。在 400 次试验的实验中,各接听了多大比例?
在例 7 中,基于 50 次试验的实验,确定订购报纸的最佳策略。
在例 7 中,运行 10 个实验,每个实验含 400 次试验。你所得的每日利润最大值与最小值之间的最大差异是多少?
使用例 8 的电子表格。对于 100 次试验,若 M = 11 且 N = 4、5、6,平均期末库存是多少?
使用例 8 的电子表格。对于 100 次试验,若 N = 5 且 M = 10、11、12,平均期末库存是多少?
以例 8 的解答为起点,修改该解答以模拟销售流失的情形;也就是说,把短缺改为销售流失。记录流失的销售量。
在例 9 中,轴承成本为何值时,现行系统与所提系统的每 10,000 小时总成本实际上相同?你的估计应基于现行系统和所提系统各 10 个实验,每个实验包含 400 次试验。
把例 9(现行或所提)的 Experiment 工作表上直方图的组(区间)宽度改为 $50,起始位置低于最小值(例如,若最小值为 $1528.46,则让第一个单元格从 $1500 开始)。这样做有什么好处?
使用例 9(所提策略)的电子表格,运行 10 个实验,每个实验含 40 次试验,并记录结果的极差(最大值减最小值)。然后计算平均极差。接着按同样的方式再做一遍,但每个实验使用 400 次试验。如果存在差异,你如何解释?
在例 10 的电子表格中,把 米和 米设定好。保持目标不变。开展一次包含 200 次试验的仿真。平均命中数是多少?
在例 10 的电子表格中,把 米和 米设定好。保持目标不变。开展一次包含 200 次试验的仿真。平均命中数是多少?
在例 10 的电子表格中,把 米和 米设定好。保持目标不变。开展一次包含 200 次试验的仿真。平均命中数是多少?解释本习题与上一个习题之间的差别。
在例 10 的电子表格中,把 米设定好。保持目标不变。如果基于一次包含 400 次试验的实验,平均命中数约为 6.0,那么 的取值是多少?
在例 11 中,假设你希望对提前期需求的分布有更好的估计:你应当 (1) 增加「One Trial」工作表上的周期数,还是 (2) 增加「Experiment」工作表上的试验次数?解释你的答案。
在例 11 中,假设你希望对提前期需求的均值有更好的估计,你应当怎么做?
在例 11 中,令可能取值 3、4、5、6 的需求概率相等。运行一次包含 400 次试验的实验。比较使用原始输入数据与使用新输入数据所得的平均提前期需求。
在例 11 中,令可能取值 1、2、3 的提前期概率相等。运行一次包含 400 次试验的实验。比较使用原始输入数据与使用新输入数据所得的平均提前期需求。
在例 12 中,把实验运行 20 次,每次含 400 次试验。记录中间路径最长的次数。你对中间路径被选中的概率所作的最佳估计是多少?
在上面的习题中,你遇到的中间路径被选中次数的最小值和最大值分别是多少?如果你只做了一次仿真,恰好得到了那个最小值(或最大值),并把它作为结果报告出来,你会如何为自己开脱?
在例 12 中,假定第三条路径(即图 20 中最下面那条)改为由六个 U(1,2) 活动组成。修改电子表格以适应这一变化。现在最常出现的路径是哪一条?本习题给你什么启发?
使用 Excel,用公式 =-10*LN(RAND()) 在一列中生成 1000 个值。
(a) 计算该列数据的描述性统计量,包括最小值、最大值、均值、中位数和标准差。
(b) 把这些值按 10 个组(区间)制表,每个组(区间)宽度为 5,第一个组(区间)从 0 开始,第 11 个组(区间)用于溢出值(如果有)。
(c) 该直方图像你所熟悉的某种分布吗?如果像,它叫什么名字?
提示:在 Excel 公式中使用 FREQUENCY 或 COUNT 来统计各组(区间)的频数。
使用 Excel,用公式 =RAND() 生成 12 列,每列 250 个值。
在 M1 单元格中放入公式 =SUM(A1:L1)-6,并把它复制到 M1 列下方的 249 个单元格中。
(a) 计算 M 列数据的描述性统计量,包括最小值、最大值、均值、中位数和标准差
(b) 把这些值按 9 个组(区间)制表。第一个组(区间)包含所有小于或等于 3.5 的值;接下来的 6 个组(区间)宽度为 1;最后一个组(区间)包含所有大于 3.5 的值。
(c) 该直方图像你所熟悉的某种分布吗?如果像,它叫什么名字?
提示 1:在 Excel 公式中使用 FREQUENCY 或 COUNT 来统计各组(区间)的频数。
提示 2:M 列中的数值可以作为表 A.2 中数值的粗略近似。
使用 Excel,生成一张可用来代替表 A.1 的表,公式为 =INT(RAND()*100000)。
用 Excel 设计一个蒙特卡罗实验来估计 π 的值,如同圆面积的公式
提示:考虑单位正方形内一个半径为 1 的四分之一圆。向单位正方形投掷一枚随机飞镖。
一名大学生正在为来年做财务规划。支出包括下列已知成本:
学费 $8,400
住宿 $5,400
另外还有许多不确定的支出,其范围如下:
伙食 $900–$1,350
娱乐 $600–$1,200
交通 $200–$600
书本 $400–$800
这名学生预计来年会有收入。其中只有下列金额是确定的:
州奖学金 $3,000
父母资助 $4,000
部分收入是可变的,其范围如下:
餐厅侍应 $3,000–$5,000
图书馆助理 $2,000–$3,000
这名学生预计需要一笔贷款。开发一个电子表格模型,并用 1000 次试验来预测贷款金额的概率分布。把任何金额可变的项目都视为在所给区间上均匀分布。
22 档的 Bally 1090 老虎机,其每个转轴上的符号数量如下:
| 符号 | 转轴 1 | 转轴 2 | 转轴 3 |
|---|---|---|---|
| 樱桃 | 2 | 5 | 2 |
| 橙子 | 2 | 3 | 7 |
| 李子 | 5 | 1 | 10 |
| 铃铛 | 10 | 2 | 1 |
| 条杠 | 2 | 10 | 1 |
| 7 | 1 | 1 | 1 |
中奖赔付如下:
| 组合 | 赔付 | 组合 | 赔付 |
|---|---|---|---|
| 左樱桃 | 2 | 三个李子 | 20 |
| 右樱桃 | 2 | 李子李子条杠 | 14 |
| 任意两个樱桃 | 5 | 条杠李子李子 | 14 |
| 三个樱桃 | 20 | 三个铃铛 | 20 |
| 三个橙子 | 20 | 铃铛铃铛条杠 | 18 |
| 橙子橙子条杠 | 10 | 条杠铃铛铃铛 | 18 |
| 条杠橙子橙子 | 10 | 三个条杠 | 50 |
| 三个 7 | 100 |
使用 Excel,模拟这台老虎机 1000 次转动,每次成本 \$1。
盈亏是多少?
www.bcnn.net 上可获取的资料清单
Example2.1CoinToss.xls - 掷硬币
Example2.2ServiceTimes.xls - 服务时间
Example2.3ArrivalTimes.xls - 到达时间
Example2.4CoinTossGame.xls - 掷硬币问题
Example2.5SingleServer.xls - 杂货店(单服务台队列)
Example2.6AbleBaker.xls - 呼叫中心(双通道队列)
Example2.7NewsDealer.xls - 报刊销售商的库存问题
Example2.8RefrigInventory.xls - 冰箱销售(库存订货)
Example2.9CurrentBearings.xls - 现行轴承更换策略
Example2.9ProposedBearings.xls - 所提轴承更换策略
Example2.10Target.xls - 一次轰炸任务
Example2.11LeadTimeDemand - 提前期需求分布
Example2.12Project.xls - 项目作业网络
BCNNvba.xla - 用于运行各示例的 Excel 加载项(VBA 代码)
Chap2Excel5ed.zip - 包含全部 Excel 示例的 zip 文件
3 一般原则
本章通过使用离散事件仿真(discrete-event simulation),为复杂系统的建模建立一个共同的框架。本章涵盖所有离散事件仿真模型的基本构件:实体(entity)与属性(attribute)、活动(activity)以及事件(event)。在离散事件仿真中,系统是依据其在每个时点的状态来建模的;依据流经系统的实体以及代表系统资源的实体来建模;依据引起系统状态改变的活动和事件来建模。对于那些系统状态仅在离散时间点上发生变化的系统,离散事件模型是适合的。
本章的讨论聚焦于仿真语言与仿真软件(统称为仿真软件包,simulation package)的离散事件概念与方法学。
本章介绍并解释所有离散事件仿真包所蕴含的基本概念与方法学。这些概念与方法学并不依附于任何特定的软件包。许多软件包使用的术语与本章所用的不同,而且大多数软件包都配备了若干高阶构件,以便在各自的应用领域中使建模更为简单直接。例如,本章讨论实体的基本抽象概念,但不涉及某些软件包中内置的、更为具体的实体实现(如机器、输送带和车辆),这些构件是为了便利制造、物料搬运或其他领域的建模而设置的。
第 1 节讨论离散事件仿真的一般原则与概念、事件调度/时间推进算法(event-scheduling/time-advance algorithm),以及三种流行的世界观(world view):事件调度(event scheduling)、过程交互(process interaction)和活动扫描(activity scanning)。第 2 节介绍列表处理(list processing)的一些概念,列表处理是离散事件仿真软件中更为重要的方法学之一。
1 离散事件仿真中的概念
本章专门讨论动态的、随机的(即涉及时间且包含随机成分的)并且以离散方式变化的系统。本节将展开讨论这些概念,并提出一个用于建立系统离散事件模型的框架。主要概念先给出简要定义,随后以示例加以说明:
系统(system) 一组随时间相互交互、从而实现一个或多个目标的实体(例如人和机器)的集合。
模型(model) 系统的一种抽象表示,通常包含用以状态、实体及其属性、集合、过程、事件、活动和延迟来描述系统的结构性、逻辑性或数学性关系。
系统状态(system state) 一组变量,包含了在任意时刻描述系统所需的全部信息。
实体(entity) 系统中需要在模型中显式表示的任何对象或构件(例如,一台服务台、一位顾客、一台机器)。
属性(attributes) 某一给定实体的性质(例如,等待顾客的优先级,某个工件在作业车间中的加工路线)。
列表(list) 一组(永久或临时)关联起来的实体,按某种逻辑方式排序(例如,当前所有处于排队线上的顾客,按"先到先服务"或按优先级排序)。
事件(event) 改变系统状态的一次瞬时发生(例如,一位新顾客的到达)。
事件通知(event notice) 一条关于将在当前或某个未来时刻发生的事件的记录,以及执行该事件所需的一切相关数据;该记录至少应包括事件类型和事件时间。
事件列表(event list) 未来事件的事件通知所组成的列表,按发生时间排序;也称为未来事件列表(future event list, FEL)。
活动(activity) 一段规定长度的时间(例如服务时间或到达间隔时间),其长度在开始时即已知(尽管它可能是以统计分布的形式定义的)。
延迟(delay) 一段长度不确定、无法预先确定的时间,在其结束之前无法知道其长度(例如,顾客在后进先出排队线中的延迟,在延迟开始时还取决于未来的到达)。
时钟(clock) 表示仿真时间的变量,在后续示例中称之为 CLOCK。
不同的仿真软件包对相同或相似的概念使用不同的术语——例如,列表有时被称为集合(set)、队列(queue)或链(chain)。集合或列表用于保存实体和事件通知。列表中的实体总是按某种规则排序,例如先入先出或后入先出,或者按某种实体属性(如优先级或到期日)排名。未来事件列表则总是按事件通知中记录的事件时间排名。第 2 节讨论处理列表的若干方法,并介绍一些对有序集合或列表进行高效处理的方法学。
活动通常代表服务时间、到达间隔时间,或其他任何持续时间已经由建模者刻画并定义的处理时间。活动持续时间的指定方式有若干种:
a. 确定性——例如,总是恰好 5 分钟;
b. 统计性——例如,以等概率从集合 2、5、7 中随机抽取;
c. 依赖于系统变量和/或实体属性的函数——例如,一艘铁矿石船的装载时间是该船允许载重量与每小时装载吨位装载率的函数。
无论以何种方式刻画,活动持续时间在其开始的那一瞬间都可由其规定算出。其持续时间不受其他事件发生的影响(除非如某些仿真软件包所允许的那样,模型中包含取消或推迟正在进行的活动的逻辑)。为跟踪活动及其预计完成时间,在仿真时刻某一活动持续时间开始时,生成一条事件通知,其事件时间等于该活动的完成时间。例如,若当前仿真时间为 CLOCK 100 分钟,且一项恰好 5 分钟的检验时间刚刚开始,则生成一条事件通知,规定事件类型(检验结束事件)与事件时间(100 + 5 = 105 分钟)。
与活动相反,延迟的持续时间并非由建模者预先指定,而是由系统状况决定。延迟的持续时间常常需要测量,并且是模型运行所期望的输出之一。通常,延迟在某组逻辑条件成立或一个或多个其他事件发生时结束。例如,顾客在排队线中的延迟可能取决于排在前面其他顾客的人数与服务持续时间,也可能取决于服务台与设备的可用性。
延迟有时称为条件等待,活动称为无条件等待。活动的完成是一个事件,常称为主事件(primary event),通过在 FEL 上放置一条事件通知来管理。与之相对,延迟则通过把相关实体放置到另一个列表(或许代表一条排队线)上来管理,直至系统状况允许处理该实体为止。延迟的完成有时称为条件事件或次事件(conditional or secondary event),但这类事件并不用事件通知表示,也不会出现在 FEL 上。
这里所考虑的系统都是动态的,即随时间变化的。因此,系统状态、实体属性与在活动实体数、集合的内容,以及当前正在进行中的活动和延迟,都是时间的函数,并随时间不断变化。时间本身由一个称为 CLOCK 的变量表示。
例 1:呼叫中心,再度审视
考虑《电子表格中的仿真示例》一章例 6 中的 Able–Baker 呼叫中心系统。一个离散事件模型具有以下构件:
系统状态 ,时刻 正在等待接受服务的呼叫者数量;,取 0 或 1,指示时刻 Able 是空闲还是忙碌;,取 0 或 1,指示时刻 Baker 是空闲还是忙碌。
实体 除非希望得到某些呼叫者的平均值(参见例 4 和例 5),否则呼叫者和服务台都不需要显式表示,只能通过状态变量来体现。
事件 到达事件; Able 的服务完成; Baker 的服务完成。
活动 到达间隔时间,定义见《电子表格中的仿真示例》一章的表 12; Able 的服务时间,定义见《电子表格中的仿真示例》一章的表 13; Baker 的服务时间,定义见《电子表格中的仿真示例》一章的表 14。
延迟 呼叫者在队列中等待,直到 Able 或 Baker 空闲下来。
模型构件的定义给出了模型的静态描述。此外,还需要对这些构件之间的动态关系与交互作用加以描述。需要得到回答的问题包括:
每个事件如何影响系统状态、实体属性和集合内容?
活动是如何定义的(即,确定性的、概率性的,还是某个其他数学方程)?什么事件标志着每项活动的开始或结束?该活动能否不受系统状态限制就开始,还是它的开始以系统处于某种状态为条件?(例如,一项机加工"活动"只有在机床空闲、未发生故障且不在维修之中的情况下才能开始。)
哪些事件触发每类延迟的开始(与结束)?延迟在什么条件下开始或结束?
时刻 0 的系统状态是什么?应当在时刻 0 生成哪些事件来"预热"模型——也就是使仿真得以启动?
离散事件仿真,是对这样一个系统随时间进行的建模:该系统的全部状态变化都发生在离散的时间点上——即事件发生的那些时点。离散事件仿真(下文简称仿真)通过产生一系列系统快照(system snapshot,或称系统映像)来推进,这些快照表示系统随时间的演化。给定时刻的一个快照(CLOCK t)不仅包含时刻 t 的系统状态,还包含当前正在进行的所有活动及其各自结束时刻的列表(FEL)、所有实体的状态与所有集合的当前成员,以及用于在仿真结束时计算汇总统计量的累积统计量与计数器的当前值。图 1 给出了一个原型系统快照。(并非所有模型都会包含图 1 中所展示的每一个要素。本章各示例中提供了进一步的说明。)
| CLOCK | 系统状态 | 实体与属性 | 集合 1 | 集合 2 | … | 未来事件列表(FEL) | 累积统计量与计数器 |
|---|---|---|---|---|---|---|---|
| t | (x,y,z,…) | (3,t1)- 时刻 t1 发生的 3 型事件;(1,t2)- 时刻 t2 发生的 1 型事件;. . . | . . . |
图 1 仿真时刻 t 的原型系统快照。
1.1 事件调度/时间推进算法
推进仿真时间、并保证所有事件按正确的时序发生的机制,建立在未来事件列表(future event list, FEL)的基础之上。该列表包含所有已安排在未来某个时刻发生的事件的事件通知。安排一个未来事件,意味着在某一活动开始的那一刻计算其持续时间,或从某个统计分布中抽取一个样本;并把该活动结束事件连同其事件时间一起放到未来事件列表上。在现实世界中,大多数未来事件并非事先安排,而只是偶然发生——例如随机故障或随机到达。在模型中,这类随机事件由某项活动的结束来表示,而活动的结束又由一个统计分布来表示。
在任一给定时刻 t,FEL 包含所有先前已安排的未来事件及其相应的事件时间(在图 1 中记作 )。FEL 按事件时间排序,意味着事件按时间先后排列——即各事件时间满足
时刻 t 是 CLOCK 的值,即当前仿真时间。与时刻 对应的事件称为即时事件(imminent event);也就是说,它是接下来将要发生的事件。在仿真时刻 CLOCK t 的系统快照更新之后,CLOCK 被推进到仿真时刻 ,即时事件的事件通知从 FEL 中被移除,然后执行该事件。执行即时事件意味着:基于时刻 t 的旧快照以及即时事件的性质,为时刻 生成一个新的系统快照。在时刻 ,可能会生成新的未来事件,也可能不会;但只要生成了,就要通过创建事件通知并把其放入 FEL 上的适当位置来加以安排。在时刻 的新系统快照更新之后,时钟被推进到新的即时事件发生的时刻,并执行该事件。这一过程不断重复,直至仿真结束。仿真器(或仿真语言)为推进时钟并构建新系统快照而必须执行的一系列动作,称为事件调度/时间推进算法,其步骤列于图 2(并在其后加以解释)。
随着仿真的推进,FEL 的长度与内容不断变化,因此在仿真软件包中对其进行高效管理,将对模型的计算机运行时间产生重大影响。对一个列表的管理称为列表处理(list processing)。在 FEL 上执行的主要列表处理操作是移除即时事件、向列表中添加新事件,以及偶尔移除某个事件(称为事件的取消)。由于即时事件通常位于列表的顶部,移除它的效率是最高的。添加新事件(以及取消旧事件)则需要搜索该列表。这一搜索的效率取决于列表的逻辑组织方式以及搜索的实施方式。除 FEL 之外,模型中的所有集合也按某种逻辑顺序维护,向集合中添加和移除实体同样需要高效的列表处理技术。第 2 节将简要介绍仿真中的列表处理。
FEL 中事件的移除与添加在图 2 中得到说明。事件时间为 的事件 3,比如说是服务台 3 的一个服务完成事件。由于它是时刻 t 的即时事件,因此它在事件调度/时间推进算法的第 1 步(图 2)中被从 FEL 移除。当事件 4(比如一个到达事件)在第 4 步被生成、其事件时间为 时,确定其在 FEL 上正确位置的一种可能做法是进行自顶向下的搜索:
(在图 2 中,假定 位于 与 之间。)另一种做法是进行自底向上的搜索。维护 FEL 效率最低的方式是把它留作一个无序列表(新增项任意放置在顶部或底部),这将要求在图 2 的第 1 步中,在每次推进时钟之前对整个列表进行完整搜索以找出即时事件。(即时事件是 FEL 上事件时间最低的那个事件。)
时刻 0 的系统快照由初始条件以及所谓外生事件(exogenous event)的生成所确定。所指定的初始条件确定了时刻 0 的系统状态。例如,在图 2 中,若 ,则状态 (5, 1, 6) 可以代表系统中三个不同位置上初始的顾客数。外生事件(exogenous event)是"发生在系统之外"、并对系统产生影响的一次发生。一个重要的例子是到达排队系统的事件。在时刻 0,生成第一个到达事件并将其安排到 FEL 上(也就是说,把其事件通知放到 FEL 上)。到达间隔时间是活动的一个例子。当时钟最终被推进到这一首次到达的时刻时,生成第二个到达事件。首先,生成一个到达间隔时间,记为
时刻 t 的旧系统快照
| CLOCK | 系统状态 | 未来事件列表 | ||
|---|---|---|---|---|
| (5, 1, 6) |
事件调度/时间推进算法
第 1 步. 从 FEL 中移除即时事件的事件通知(事件 3,时刻 。
第 2 步. 把 CLOCK 推进到即时事件时刻(即把 CLOCK 从 t 推进到 )。
第 3 步. 执行即时事件:更新系统状态,按需改变实体属性与集合成员关系。
第 4 步. 生成未来事件(若有必要),并把其事件通知按事件时间排序后放到 FEL 上。(例如:在时刻 发生的事件 4,其中 。
第 5 步. 更新累积统计量与计数器。
时刻 的新系统快照
| CLOCK | 系统状态 | 未来事件列表 | ||
|---|---|---|---|---|
| (5, 1, 5) |
图 2 推进仿真时间并更新系统映像。
并把它加到当前时间上, 由此得到的(未来)事件时间 用于确定新的到达事件通知在 FEL 上的位置。这种生成外部到达流的方法称为自举(bootstrapping);它给出了事件调度/时间推进算法第 4 步中如何生成未来事件的一个例子。自举过程在图 3 中得到说明。

图 3 通过自举生成外部到达流。
生成的前三个到达间隔时间为 3.7、0.4 和 3.3 个时间单位。到达间隔区间的结束是主事件的一个例子。
未来事件如何生成(图 2 第 4 步)的第二个例子,是排队仿真中的服务完成事件。当一位顾客在当前时刻 完成服务时,若下一位顾客已在,则要为下一位顾客生成一个新的服务时间 。下一个服务完成事件将被安排在未来时刻 发生,做法是在 FEL 上放入一条新的、类型为服务完成、事件时间为 t∗ 的事件通知。此外,若在到达事件发生的时刻,服务台组中至少有一台空闲的服务台,则也将生成一个服务完成事件并加以安排。服务时间是活动的一个例子。开始服务是条件事件(conditional event),因为其发生仅在"有顾客在场且有服务台空闲"这一条件下才被触发。服务完成是主事件的一个例子。注意,像开始服务这样的条件事件,是由某个主事件的发生以及系统中盛行的某些条件共同触发的。只有主事件才会出现在 FEL 上。
未来事件如何生成的第三个重要例子,是一台可能发生故障的机器其运行时长与停机时长的交替生成。在时刻 0,生成第一个运行时长,并安排一个运行时长结束事件。每当运行时长结束事件发生时,生成一个停机时长,并在 FEL 上安排一个停机时长结束事件。当 CLOCK 最终被推进到这一停机时长结束事件的时刻时,生成一个运行时长,并在 FEL 上安排一个运行时长结束事件。以此方式,运行时长与停机时长在整个仿真过程中不断交替。运行时长和停机时长是活动的例子,而运行时长结束和停机时长结束是主事件。
每一个仿真都必须有一个停止事件,在此称为 E,它规定了仿真将运行多长时间。停止仿真通常有两种方式:
在时刻 0,把一个停止仿真事件安排在某个指定的未来时刻 。这样,在仿真之前就知道仿真将在时间区间 上运行。例如:仿真一个作业车间, 小时。
运行长度 由仿真本身决定。一般而言, 是某个指定事件 E 的发生时刻。例如: 可以是某个服务中心第 100 次服务完成的时刻; 可以是一个复杂系统发生故障的时刻; 可以是战斗仿真中脱离接触或彻底毁伤(以先发生者为准)的时刻; 可以是配送中心把某一天订单中的最后一个纸箱发运出去的时刻。
在第 2 种情形下, 事先是不知道的。事实上,它完全可能就是仿真所要产生的主要统计量之一。
1.2 世界观
在使用仿真软件包时,甚至在做手工仿真时,建模者都会采取某种世界观或视角来开发模型。最为盛行的世界观是上一节讨论过的事件调度世界观、过程交互世界观和活动扫描世界观。即便某个特定的软件包并不直接支持其中一种或多种世界观,理解这些不同的方法仍可为某一给定系统的建模提供其他思路。
概括前面的讨论,在采用事件调度方法时,仿真分析人员关注的是事件及其对系统状态的影响。第 1.3 节的手工仿真将说明这一世界观。
在使用支持过程交互方法的软件包时,仿真分析人员以过程(process)的思维来思考问题。分析人员用实体或对象及其在流经系统过程中的生命期来定义仿真模型,这些实体或对象会要求资源并排队等待资源。更确切地说,一个过程就是一个实体的生命期。这一生命期由各种事件、活动构成。有些活动可能需要使用一项或多项容量有限的资源。正是这类资源约束和其他约束导致了过程之间的交互,最简单的例子就是:某个实体因其所需要的资源正被另一实体占用,而被迫在队列中(在一个列表上)等待。过程交互方法之所以流行,是因为它具有直观上的吸引力,而且实现该方法的仿真软件包允许分析人员用高层的模块或网络构件来描述过程流,而过程之间的交互则由软件自动处理。
更确切地说,一个过程是一个按时间顺序排列的事件、活动和延迟的列表(其中包含对资源的需求),它定义了一个实体在系统内移动时的生命期。图 4 给出了一个"顾客过程"的例子。在该图中,可以看到两个顾客过程之间的交互:顾客 n + 1 被延迟,直至前一位顾客的"服务结束事件"发生。通常,一个模型中会有许多过程同时处于活动状态,过程之间的交互可能相当复杂。
在仿真软件包中实现过程交互方法的基础(但通常对建模者不可见)是:事件被安排到未来事件列表上,实体在遇到延迟时被放到各个列表上,从而使一个过程暂时挂起其执行,而其他过程继续推进。建模者对相关概念有基本理解、并对所用仿真软件包中内置但隐藏的运行规则有详细理解,是十分重要的。Schriber 与 Brunner [2003] 对这方面提供了阐释。
事件调度方法与过程交互方法都采用可变时间推进——也就是说,当某一仿真时刻的所有事件与系统状态变化都已发生之后,仿真时钟被推进到 FEL 上下一个即时事件的时刻。与之相反,活动扫描方法采用固定时间增量,并用一套基于规则的方法来决定在每个仿真时点上是否有活动可以开始。

图 4 单服务台队列中两个相互作用的顾客过程。
在活动扫描方法下,建模者关注模型中的各项活动,以及那些使某项活动得以开始的条件(无论简单还是复杂)。在每次时钟推进时,检查每项活动的条件,若条件成立,则相应的活动开始。该方法的倡导者认为活动扫描方法概念简单,并能产生模块化的模型,这类模型日后更易于被其他分析人员维护、理解和修改。然而他们也承认,为查明某项活动能否开始而进行的反复扫描,会导致计算机上的运行速度缓慢。因此,纯活动扫描方法被所谓的三阶段方法(three-phase approach)加以修改(并在概念上变得略微复杂一些);该方法把事件调度的若干特征与活动扫描结合起来,从而既允许可变时间推进,又能在不必要的时候避免扫描,同时保留活动扫描方法的主要优点。
在三阶段方法中,事件被视为持续时间为零个时间单位的活动。按照这一定义,活动被分为两类,称为 B 类和 C 类。
B 类活动 必然要发生的活动;即所有主事件和无条件活动。
C 类活动 以某些条件成立为前提的活动或事件。
B 类活动与事件可以像在事件调度方法中那样预先安排。这就允许了可变时间推进。FEL 中只包含 B 类事件。为查明是否有 C 类活动可以开始或 C 类事件发生而进行的扫描,只在每次时间推进结束、全部 B 类事件完成之后才进行。总之,在三阶段方法下,仿真通过反复执行以下 3 个阶段而推进,直至仿真完成:
阶段 A 从 FEL 中移除即时事件,并把时钟推进到其事件时刻。把 FEL 中所有具有相同事件时间的其他事件也一并移除。
阶段 B 执行所有从 FEL 中移除的 B 类事件。(这可能释放若干资源,或以其他方式改变系统状态。)
阶段 C 检查触发各项 C 类活动的条件,并激活其中条件已满足者。反复扫描,直至没有更多的 C 类活动可以开始、也没有事件发生。
三阶段方法提高了活动扫描方法的执行效率。此外,该方法的倡导者认为,活动扫描方法与三阶段方法特别擅长处理复杂的资源问题——在这些问题中,完成不同任务需要资源的各种不同组合。这两种方法保证:给定仿真时刻被释放的所有资源,都将在任何可用资源被重新分配给新任务之前得到释放。
例 2:呼叫中心,再度登场
对于例 1 中的呼叫中心,若采用面向活动扫描世界观的三阶段方法,则阶段 C 中各项活动的开始条件如下:
| 活动 | 条件 |
|---|---|
| Able 的服务时间 | 有呼叫者在队列中,且 Able 空闲 |
| Baker 的服务时间 | 有呼叫者在队列中,Baker 空闲且 Able 忙碌 |
若采取过程交互世界观,则应从一位呼叫者及其"生命期"的视角来看待该模型。若认为生命期始于到达,则一个顾客过程如图 4 所示。
总之,过程交互方法已被美国最为流行的仿真软件包所采用。另一方面,若干活动扫描软件包则在英国和欧洲颇受欢迎。有些软件包允许模型的一部分采用基于事件调度的形式(若该视角更方便),再与过程交互方法混合使用。最后,还有一些软件包以流程图、框图或网络结构为基础,而仔细考察之下会发现,它们其实是过程交互概念的一种具体实现。
1.3 使用事件调度进行手工仿真
在进行事件调度仿真的过程中,需要使用一张仿真表(simulation table),以记录时间推进过程中的各个相继系统快照。
例 3:单通道队列
考虑《电子表格中的仿真示例》一章例 5 中以某种特殊方法仿真的、只有一个收银台的杂货店。系统由排队线上的顾客加上正在结账的那一位(若有)构成。本例设定停止时刻为 60 分钟。模型具有以下构件:
系统状态 (LQ(t), LS(t)),其中 LQ(t) 是排队线上的顾客数,LS(t) 是时刻 t 正在接受服务的顾客数(0 或 1)。
实体 除通过状态变量体现外,服务台和顾客都不作显式建模。
事件
到达(A); 离开(D); 停止事件(E),安排在时刻 60 发生。
事件通知
(A, t),表示将在未来时刻 t 发生的到达事件; (D, t),表示将在未来时刻 t 发生的顾客离开事件; (E, 60),表示将在未来时刻 60 发生的仿真停止事件。
活动
到达间隔时间,定义见《电子表格中的仿真示例》一章的表 9; 服务时间,定义见《电子表格中的仿真示例》一章的表 10。
延迟 顾客在排队线中花费的时间。
事件通知写作(事件类型, 事件时间)。在本模型中,FEL 将始终包含两条或三条事件通知。到达事件与离开事件的执行效果在图 5 和图 6 中有详细说明。

图 5 到达事件的执行。

图 6 离开事件的执行。
收银台的仿真表见表 1。读者应遮住除一个之外的所有系统快照(从第一个开始),并尝试根据前一个快照以及图 5 和图 6 中的事件逻辑构建出下一个快照。
| 到达间隔时间 | 1 | 1 | 6 | 3 | 7 | 5 | 2 | 4 | 1··· |
|---|---|---|---|---|---|---|---|---|---|
| 服务时间 | 4 | 2 | 5 | 4 | 1 | 5 | 4 | 1 | 4··· |
初始条件为:第一位顾客在时刻 0 到达并开始接受服务。这一点在表 1 中体现为时刻零 的系统快照,其中 ,且 FEL 上有一个离开事件和一个到达事件。此外,仿真安排在时刻 60 停止。只收集两项统计量:服务台利用率和最大队列长度。服务台利用率定义为服务台总忙碌时间(B)除以总时间 。总忙碌时间 B 与最大队列长度 MQ 将随着仿真的推进而累积。表中另设"备注"一栏以帮助读者( 和 分别是生成的到达间隔时间与服务时间)。
时刻 CLOCK 0 的系统快照一完成,仿真即开始。在时刻 0,即时事件为 。CLOCK 被推进到时刻 1, 从 FEL 中移除。由于 对 ,服务台忙碌了 1 分钟),累积忙碌时间由 增加到 。依据图 6 中的事件逻辑,置 (服务台变为忙碌)。FEL 中还剩三个未来事件,(A, 2)、(D, 4) 和 (E, 60)。仿真 CLOCK 接着被推进到时刻 2,并执行一个到达事件。表 1 剩余部分的解读留给读者完成。
表 1 中的仿真覆盖了时间区间 [0,23]。在仿真时刻 23,系统清空,但下一次到达也发生在时刻 23。在所仿真的 23 个时间单位中,服务台忙碌了 21 个,最大队列长度为 2。当然,这次仿真太短,无法得出任何可靠的结论。注意,仿真表给出的是所有时刻的系统状态,而不仅是所列出的那些时刻。例如,从时刻 11 到时刻 15,有一位顾客正在接受服务,另有一位在排队线中。
当事件调度算法在仿真软件中实现时,软件只维护一套系统状态和其他属性值,也就是说,只维护一个快照(当前的或部分更新的那个)。若打算在 Java 或其他通用语言中实现事件调度,则应遵循如下规则:新的快照只能由此前的快照、新生成的随机变量以及事件逻辑(图 5 和图 6)导出。在推进时钟时,应当忽略以往的快照。当前快照必须包含继续仿真所需的全部信息。
表 1 收银台的仿真表
| CLOCK | 系统状态 | 未来事件列表 | 备注 | 累积统计量 | ||
|---|---|---|---|---|---|---|
| B | MQ | |||||
| 0 | 0 | 1 | (A, 1) (D, 4) (E, 60) | 首次 A 发生 安排下一个 A 安排第一个 D | 0 | 0 |
| 1 | 1 | 1 | (A, 2) (D, 4) (E, 60) | 第二次 A 发生:(A, 1) 安排下一个 A(顾客延迟) | 1 | 1 |
| 2 | 2 | 1 | (D, 4) (A, 8) (E, 60) | 第三次 A 发生:(A, 2) 安排下一个 A(两位顾客延迟) | 2 | 2 |
| 4 | 1 | 1 | (D, 6) (A, 8) (E, 60) | 第一次 D 发生:(D, 4) 安排下一个 D(顾客延迟) | 4 | 2 |
| 6 | 0 | 1 | (A, 8) (D, 11) (E, 60) | 第二次 D 发生:(D, 6) 安排下一个 D | 6 | 2 |
| 8 | 1 | 1 | (D, 11) (A, 11) (E, 60) | 第四次 A 发生:(A, 8) 安排下一个 A(顾客延迟) | 8 | 2 |
| 11 | 1 | 1 | (D, 15) (A, 18) (E, 60) | 第五次 A 发生:(A, 11) 安排下一个 A第三次 D 发生:(D, 11) 安排下一个 D(顾客延迟) | 11 | 2 |
| 15 | 0 | 1 | (D, 16) (A, 18) (E, 60) | 第四次 D 发生:(D, 15) 安排下一个 D | 15 | 2 |
| 16 | 0 | 0 | (A, 18) (E, 60) | 第五次 D 发生:(D, 16) | 16 | 2 |
| 18 | 0 | 1 | (D, 23) (A, 23) (E, 60) | 第六次 A 发生 安排下一个 A 安排下一个 D | 16 | 2 |
| 23 | 0 | 1 | (A, 25) (D, 27) (E, 60) | 第七次 A 发生:(A, 23) 安排下一个到达第六次 D 发生:(D, 23) | 21 | 2 |
例 4:收银台仿真(续)
假设在例 3 的收银台仿真中,仿真分析人员希望估计平均响应时间,以及在系统中停留 5 分钟或更久的顾客所占的平均比例。响应时间是指一位顾客在系统中停留的时间长度。为了估计这些顾客平均值,必须扩展例 3 中的模型,以显式表示各个顾客。此外,为了能够在某位顾客离开时计算其响应时间,还必须知道该顾客的到达时间。因此,将在例 3 的模型构件列表中增加一个以到达时间为属性的顾客实体。这些顾客实体将存放在一个称为"CHECKOUT LINE"的列表中;它们将被记为 C1、C2、C3、. . .。最后,FEL 上的事件通知将被扩展,以指明受影响的顾客是哪一位。例如,(D,4,C1) 表示顾客 C1 将在时刻 4 离开。新增的模型构件如下:
实体
(Ci, t),表示在时刻 t 到达的顾客 Ci。
事件通知
(A, t, Ci),顾客 Ci 在未来时刻 t 到达; (D, t, Cj),顾客 Cj 在未来时刻 t 离开。
集合
“CHECKOUT LINE”,当前在收银台处的所有顾客(正在接受服务或等待接受服务),按到达时间排序。
将收集三项新的累积统计量:S,即截至当前时刻已离开的所有顾客的响应时间之和;F,即在收银台停留 5 分钟或更久的顾客总数;以及 ,即截至当前仿真时刻的离开总次数。这三项累积统计量将在离开事件每次发生时更新;收集这些统计量的逻辑应并入图 6 中离开事件的第 5 步。
表 2 例 4 的仿真表
| CLOCK | 系统状态 | CHECKOUT LINE | 未来事件列表 | 累积统计量 | |||
|---|---|---|---|---|---|---|---|
| S | F | ||||||
| 0 | 0 | 1 | (C1,0) | (A,1,C2) (D,4,C1) (E,60) | 0 | 0 | 0 |
| 1 | 1 | 1 | (C1,0) (C2,1) | (A,2,C3) (D,4,C1) (E,60) | 0 | 0 | 0 |
| 2 | 2 | 1 | (C1,0) (C2,1) (C3,2) | (D,4,C1) (A,8,C4) (E,60) | 0 | 0 | 0 |
| 4 | 1 | 1 | (C2,1) (C3,2) | (D,6,C2) (A,8,C4) (E,60) | 4 | 1 | 0 |
| 6 | 0 | 1 | (C3,2) | (A,8,C4) (D,11,C3) (E,60) | 9 | 2 | 1 |
| 8 | 1 | 1 | (C3,2) (C4,8) | (D,11,C3) (A,11,C5) (E,60) | 9 | 2 | 1 |
| 11 | 1 | 1 | (C4,8) (C5,11) | (D,15,C4) (A,18,C6) (E,60) | 18 | 3 | 2 |
| 15 | 0 | 1 | (C5,11) | (D,16,C5) (A,18,C6) (E,60) | 25 | 4 | 3 |
| 16 | 0 | 0 | (A,18,C6) (E,60) | 30 | 5 | 4 | |
| 18 | 0 | 1 | (C6,18) | (D,23,C6) (A,23,C7) (E,60) | 30 | 5 | 4 |
| 23 | 0 | 1 | (C7,23) | (A,25,C8) (D,27,C7) (E,60) | 35 | 6 | 5 |
例 4 的仿真表见表 2。这里再次使用相同的到达间隔时间与服务时间数据;因此表 2 基本上重复了表 1,只不过加进了新的构件(并删去了备注列)。这些新构件是计算累积统计量 S、F 和 所必需的。例如,在时刻 4,顾客 C1 的离开事件发生。顾客实体 C1 从称为"CHECKOUT LINE"的列表中移除;其属性"到达时间"记为 0,因此这位顾客的响应时间为 4 分钟。于是 S 增加 4 分钟。 增加一位顾客,但 F 不增加,因为其在系统中的时间不足 5 分钟。类似地,在时刻 23,当离开事件 (D, 23, C6) 被执行时,顾客 C6 的响应时间按下式计算:
然后 S 增加 5 分钟,F 和 各增加一位顾客。
对于 23 分钟的仿真运行长度,平均响应时间为 分钟,而观察到的在系统中停留 5 分钟或更久的顾客比例为 。同样,这次仿真远为太短,不足以把这些估计值视为具有任何精度。不过,例 4 的目的正是要说明这样一个观念:在许多仿真模型中,仿真所要提供的信息(例如统计量 和 )在一定程度上决定了模型的结构。

图 7 自卸卡车问题。
例 5:自卸卡车问题
使用六辆自卸卡车把煤炭从一座小矿的入口运到铁路。图 7 给出了自卸卡车作业的示意图。每辆卡车由两台装载机之一装货。装货之后,卡车立即驶往地磅,尽可能快地称重。装载机和地磅都有一条先到先服务的排队线(或队列)供卡车等待。从装载机到地磅的行驶时间认为可以忽略。称重之后,卡车开始一段行驶时间(在这段时间内卡车卸货),随后返回装载机队列。
装载时间、称重时间和行驶时间的分布分别见表 3、表 4 和表 5。这些活动时间的生成方式与《电子表格中的仿真示例》一章第 1.5 节例 2 中服务时间的生成方式完全相同,即利用累积概率把单位区间划分为若干子区间,其长度对应于各个取值的概率。随机数取自附录中的表 A.1,或 Excel 的某个随机数发生器。抽取一个随机数,它落入的区间决定了下一个随机的活动时间。
仿真的目的是估计装载机和地磅的利用率(忙碌时间所占百分比)。模型具有以下构件:
系统状态
[LQ(t), L(t), WQ(t), W(t)],其中
LQ(t) 装载机队列中的卡车数; L(t) 正在装货的卡车数(0、1 或 2); WQ(t) = 地磅队列中的卡车数; W(t) 正在称重的卡车数(0 或 1),均为仿真时刻 t 的取值。
实体
六辆自卸卡车(DT1, . . . , DT6)。
事件通知
(ALQ, t, DTi),DTi 在时刻 t 到达装载机队列(ALQ); (EL, t, DTi),DTi 在时刻 t 结束装载(EL); (EW, t, DTi),DTi 在时刻 t 结束称重(EW)。
表 3 自卸卡车装载时间的分布
| 装载时间 | 概率 | 累积概率 | 随机数区间 |
|---|---|---|---|
| 5 | 0.30 | 0.30 | |
| 10 | 0.50 | 0.80 | |
| 15 | 0.20 | 1.00 |
表 4 自卸卡车称重时间的分布
| 称重时间 | 概率 | 累积概率 | 随机数区间 |
|---|---|---|---|
| 12 | 0.70 | 0.70 | |
| 16 | 0.30 | 1.00 |
表 5 自卸卡车行驶时间的分布
| 行驶时间 | 概率 | 累积概率 | 随机数区间 |
|---|---|---|---|
| 40 | 0.40 | 0.40 | |
| 60 | 0.30 | 0.70 | |
| 80 | 0.20 | 0.90 | |
| 100 | 0.10 | 1.00 |
列表
装载机队列,所有等待开始装载的卡车,按先到先服务排序; 地磅队列,所有等待称重的卡车,按先到先服务排序。
活动
装载时间、称重时间和行驶时间。
延迟
在装载机队列的延迟,以及在地磅的延迟。
仿真表见表 6。为初始化该表的第一行,假定在时刻 0 有五辆卡车在装载机处、一辆卡车在地磅处。为简化起见,按需要从下面的列表中取用(随机生成的)活动时间:
| 装载时间 | 10 | 5 | 5 | 10 | 15 | 10 | 10 |
|---|---|---|---|---|---|---|---|
| 称重时间 | 12 | 12 | 12 | 16 | 12 | 16 | |
| 行驶时间 | 60 | 100 | 40 | 40 | 80 |
当结束装载(EL)事件发生时,比如说是自卸卡车 j 在时刻 t 发生该事件,则可能触发其他事件。若地磅空闲 ,则自卸卡车 j 开始称重,并在 FEL 上安排一个结束称重事件(EW);否则,自卸卡车 j 加入地磅队列。若此时另有一辆卡车在等待装载机,则它将从装载机队列中移除,并通过在 FEL 上安排一个结束装载事件(EL)开始装载。结束装载事件的发生逻辑,以及另外两个事件的相应逻辑,都应当绘制成事件图,正如例 3 中的图 5 和图 6。这些事件逻辑图的构造留给读者作为练习(练习 2)。
作为对读者的帮助,在表 6 中,每当安排一个新事件时,其事件时间写作"t(活动时间)"。例如,在时刻 0,即时事件是事件时间为 5 的 EL 事件。时钟被推进到时刻 ,自卸卡车 3 加入地磅队列(因为地磅被占用),自卸卡车 4 开始装货。于是为卡车 4 安排一个在未来时刻 10 发生的 EL 事件,由(当前时间)+(装载时间) 计算而得。为了估计装载机和地磅的利用率,维护两项累积统计量:
B 两台装载机从时刻 0 到时刻 t 的总忙碌时间
两台装载机从时刻 0 到时刻 一直忙碌,因此在时刻 t 20 有 ——但从时刻 20 到时刻 24,只有一台装载机忙碌;因此在时间区间 [20, 24] 上 仅增加 4 分钟。类似地,从时刻 25 到时刻 36,两台装载机都空闲 ,故 不发生变化。对于表 6 中这次相对较短的仿真,利用率估计如下:
这些估计值不能视为装载机和地磅长期"稳态"利用率的准确估计;要得到准确的估计值,需要一次长得多的仿真,以减小时刻 0 所设条件(六辆卡车中有五辆在装载机处)的影响。另一方面,若分析人员感兴趣的是系统在短时间(比如 1 或 2 小时)内的所谓暂态(transient)行为,在给定初始条件的前提下,那么表 6 中的结果可以视为该暂态行为的代表性结果(或构成其一个样本)。通过进行更多仿真可以获得更多样本,每次仿真具有相同的初始条件,但使用不同的随机数流来生成活动时间。
表 6(自卸卡车作业的仿真表)本可以作一些简化,即不把自卸卡车显式建模为实体——事件通知可以写作 等等,状态变量仅用于跟踪系统中各部分的卡车数,而不管具体是哪些卡车参与了。在这种表示方式下,同样可以收集相同的利用率统计量。另一方面,若要估计"系统"的平均响应时间,或在"系统"中停留超过 30 分钟的卡车所占比例,其中"系统"指装载机队列与装载机以及地磅队列与地磅,那么自卸卡车实体(DTi)连同一个等于到达装载机队列时间的属性就是不可或缺的。每当一辆卡车离开地磅时,该卡车的响应时间即可用当前仿真时间(t)减去到达时间属性来计算。这个新的响应时间将用于更新累积统计量:S,即所有经过"系统"的卡车的总响应时间;F,即响应时间超过 30 分钟的卡车数量。这个例子再次说明:模型在一定程度上的复杂度,取决于所要估计的性能度量。
表 6 自卸卡车作业的仿真表
| CLOCK | 系统状态 | 列表 | 未来事件列表 | 累积统计量 | |||||
|---|---|---|---|---|---|---|---|---|---|
| 装载机队列 | 地磅队列 | ||||||||
| LQ(t) | L(t) | WQ(t) | W(t) | ||||||
| 0 | 3 | 2 | 0 | 1 | DT4DT5DT6 | (EL, 5, DT3)(EL, 10, DT2)(EW, 12, DT1) | 0 | 0 | |
| 5 | 2 | 2 | 1 | 1 | DT5DT6 | DT3 | (EL, 10, DT2)(EL, 5 + 5, DT4)(EW, 12, DT1) | 10 | 5 |
| 10 | 1 | 2 | 2 | 1 | DT6 | DT3DT2 | (EL, 10, DT4)(EW, 12, DT1)(EL, 10 + 10, DT5) | 20 | 10 |
| 10 | 0 | 2 | 3 | 1 | DT3DT2DT4 | (EW, 12, DT1)(EL, 20, DT5)(EL, 10 + 15, DT6) | 20 | 10 | |
| 12 | 0 | 2 | 2 | 1 | DT2DT4 | (EL, 20, DT5)(EW, 12 + 12, DT3)(EL, 25, DT6)(ALQ, 12 + 60, DT1) | 24 | 12 | |
| 20 | 0 | 1 | 3 | 1 | DT2DT4DT5 | (EW, 24, DT3)(EL, 25, DT6)(ALQ, 72, DT1) | 40 | 20 | |
| 24 | 0 | 1 | 2 | 1 | DT4DT5 | (EL, 25, DT6)(EW, 24 + 12, DT2)(ALQ, 72, DT1)(ALQ, 24 + 100, DT3) | 44 | 24 | |
| 25 | 0 | 0 | 3 | 1 | DT4DT5DT6 | (EW, 36, DT2)(ALQ, 72, DT1)(ALQ, 124, DT3) | 45 | 25 | |
| 36 | 0 | 0 | 2 | 1 | DT5DT6 | (EW, 36 + 16, DT4)(ALQ, 72, DT1)(ALQ, 36 + 40, DT2)(ALQ, 124, DT3) | 45 | 36 | |
| 52 | 0 | 0 | 1 | 1 | DT6 | (EW, 52 + 12, DT5)(ALQ, 72, DT1)(ALQ, 76, DT2)(ALQ, 52 + 40, DT4)(ALQ, 124, DT3) | 45 | 52 | |
| 64 | 0 | 0 | 0 | 1 | (ALQ, 72, DT1)(ALQ, 76, DT2)(EW, 64 + 16, DT6)(ALQ, 92, DT4)(ALQ, 124, DT3)(ALQ, 64 + 80, DT5) | 45 | 64 | ||
| 72 | 0 | 1 | 0 | 1 | (ALQ, 76, DT2)(EW, 80, DT6)(EL, 72 + 10, DT1)(ALQ, 92, DT4)(ALQ, 124, DT3)(ALQ, 144, DT5) | 45 | 72 | ||
| 76 | 0 | 2 | 0 | 1 | (EW, 80, DT6)(EL, 82, DT1)(EL, 76 + 10, DT2)(ALQ, 92, DT4)(ALQ, 124, DT3)(ALQ, 144, DT5) | 49 | 76 |
例 6:自卸卡车问题(再访)
对于例 5 中的自卸卡车问题,若采用活动扫描方法,则各项活动的开始条件如下:
| 活动 | 条件 |
|---|---|
| 装载时间 | 卡车位于装载机队列的队首,且至少有一台装载机空闲 |
| 称重时间 | 卡车位于地磅队列的队首,且地磅空闲。 |
| 行驶时间 | 卡车刚刚完成称重。 |
若采取过程交互世界观,则应从一辆自卸卡车及其"生命期"的视角来看待该模型。若认为生命期始于装载机队列,则一个自卸卡车过程可如图 8 所示。
自卸卡车过程
| 延迟 | 装载 | 延迟 | 称重 | 行驶时间 | |
|---|---|---|---|---|---|
| ALQ | EL | EW | ALQ |
图 8 自卸卡车过程。
2 列表处理
列表处理讨论的是处理实体列表和未来事件列表的方法。仿真软件包既显式地(供分析人员使用)、又隐式地(在语言背后的仿真机制中)为分析人员或模型本身提供使用列表并执行列表基本操作的功能。
第 2.1 节描述列表的基本性质和在其上执行的操作。第 2.2 节讨论用数组处理列表,以及用数组下标创建链表;相较于第 2.3 节讨论的、更一般化的动态分配链表,数组是一种描述这些基本操作的更简单机制。最后,第 2.4 节简要介绍若干更为高级的列表管理技术。
本节关于列表处理的讨论,其目的并非让读者准备好在 Visual Basic、C、C++ 或 Java 之类通用语言中实现列表及其处理,而是增进读者对列表及其内在概念和操作的理解。
2.1 列表的基本性质和在其上执行的操作
如前所述,列表是一组有序的或经过排名的记录。在仿真中,每条记录代表一个实体或一条事件通知。
列表是有排名的,因此它们有一个顶部或表头(列表上的第一项)、某种遍历列表的方式(用以找到列表上的第二项、第三项等等),以及一个底部或表尾(列表上的最后一项)。头指针(head pointer)是指向或指示列表顶部记录的变量。有些列表的实现还带有尾指针(tail pointer),它指向列表底部的项。
为便于讨论,将一个实体连同其属性、或一条事件通知,统称为一条记录(record)。实体标识符及其属性是实体记录中的字段;事件类型、事件时间以及其他任何与事件相关的数据则是事件通知记录中的字段。列表上的每条记录还会有一个存放"后继指针"(next pointer)的字段,该指针指向列表上的下一条记录,从而提供了遍历列表的方式。有些列表还需要一个"前驱指针"(previous pointer),以便从底部向顶部遍历列表。
无论哪一种类型的列表,列表处理的主要活动都是向列表添加一条记录和从列表移除一条记录。更具体地说,列表上的主要操作如下:
a. 从列表顶部移除一条记录;
b. 从列表上的任意位置移除一条记录;
c. 向列表顶部或底部添加一条记录;
d. 在列表的任意位置添加一条记录,该位置由排名规则指定。
第一和第三种操作,即在列表顶部或底部移除或添加记录,只需调整两个记录指针以及头指针或尾指针,即可用最少的时间完成;另两种操作则至少需要对列表进行部分搜索。使这两种操作高效,正是列表处理技术所要达到的目标。
在事件调度方法中,当时间被推进、即时事件即将被执行时,首先执行的是移除操作——即把 FEL 顶部的事件从 FEL 中移除。如果要取消某个任意事件,或者要基于实体的某些属性(例如其优先级和到期日)把某个实体从列表中移除以开始某项活动,则执行的是第二种移除操作。当一个实体加入以列表实现的先入先出队列的队尾时,执行的是第三种操作,即把实体添加到列表底部。最后,若某队列的排名规则是"最早到期日优先",那么实体到达该队列时,就必须被添加到列表中由到期日排名规则所确定的位置,而不是顶部或底部。
在计算机上进行仿真时,无论是通过通用语言(如 Visual Basic、C、C++ 或 Java)还是通过仿真软件包,每条实体记录和事件通知都存放在计算机内存的某个物理位置。有两种基本可能:(a) 所有记录都存放在数组中。数组在计算机内存的连续位置中存放相继的记录,因此可以通过数组下标来引用它们,该下标可以理解为矩阵中的行号。(b) 所有实体和事件通知都用结构体(如 C 中)或类(如 Java 中)来表示,按需从内存中分配,并通过指向某条记录或结构体的指针来跟踪。
大多数仿真软件包使用动态分配的记录和指针来跟踪项目列表;由于数组在概念上更为简单,第 2.2 节先通过数组和数组下标解释链表的概念,第 2.3 节再将其应用于动态分配的记录和指针。
2.2 用数组进行列表处理
数组式的列表存储可以实现为一个记录数组;也就是说,每个数组元素是一条记录,它包含用于跟踪事件通知或列表中条目属性所需的字段。为方便起见,我们用记号 R(i) 来表示数组中的第 i 条记录,无论它实际存储在所用的哪种语言中。大多数现代仿真软件包不用数组存储列表,而是使用动态分配的记录——即在首次需要时创建、在不再需要时随之销毁的记录。
数组的优点在于,任何指定的记录(比如第 i 条)都能迅速取出,无须搜索,只需引用 R(i) 即可。数组的缺点在于,当项目被添加到列表中部或列表必须重新排列时,就会出现问题。此外,数组的大小通常是固定的,在编译期确定,或在程序首次开始执行时的初始分配中确定。在仿真中,任何一个列表的最大记录数都可能很难(或根本不可能)预测,而且列表中记录的当前数量在仿真运行过程中可能变化很大。更糟的是,大多数仿真需要不止一个列表;若把它们保存在各自独立的数组中,每个数组都得按该列表可能达到的最大规模来定维,这可能会占用过多的计算机内存。
在使用数组存储列表时,追踪列表中记录排名有两种基本方法。一种方法是把第一条记录存入 R(1),第二条存入 R(2),依此类推,最后一条存入 R(tailptr),其中 tailptr 用来引用列表中的最后一项。该方法概念简单、易于理解,但除极短的列表(不到五条左右的记录)之外,效率极低;例如,要在一个含 100 项的列表的第 41 个位置添加一项,就必须把最后 60 条记录在数组中物理下移一个位置,以腾出空间存放新记录。即便该列表是先入先出列表,从列表顶部移除首项也是低效的,因为其余所有项都必须在数组中物理上移一个位置。管理列表的物理重排方法在此不再进一步讨论。所需要的是一种能够追踪并重排列表中项目逻辑顺序的方法,而不必在计算机内存中物理移动记录。
在第二种方法中,一个称为头指针(名为 headptr)的变量指向列表顶部的记录。例如,若位置 R(11) 中的记录是列表顶部的记录,则 headptr 的取值为 11。此外,每条记录都有一个字段,存放列表中下一条记录的索引或指针。为方便起见,令 R(i, next) 表示下一个索引字段。
例 7:地磅队列中自卸卡车的列表
在例 5 的自卸卡车问题中,假设在表 6 的 CLOCK 时刻 10,地磅队列上恰好出现了三辆自卸卡车在等待,具体为依次排列的 DT3、DT2 和 DT4。再假设模型跟踪每辆自卸卡车的一个属性:它到达地磅队列的时间,该属性在每次到达时更新。最后,假设这些实体被存放在一个下标从 1 到 的数组中的记录里,每辆自卸卡车一条记录。每个实体由一条含 3 个字段的记录表示:第一个是实体标识符;第二个是到达地磅队列的时间;最后一个是指针字段,用于"指向"表示地磅队列的列表中的下一条记录(若有),如下:
[DTi, 到达地磅队列的时间, 下一索引]
在首次到达地磅队列之前、在被加入地磅队列列表之前,自卸卡车的第二、第三个字段是没有意义的。在时刻 0,各记录将初始化如下:
然后,在表 6 仿真的 CLOCK 时刻 10,地磅队列中的实体列表定义为:
要遍历该列表,先从头指针出发,转到该记录,取出该记录的后继指针,再继续下去,从而按逻辑顺序得到列表——例如:
R(4) 中后继指针的零值以及 tailptr 4,表明 DT4 位于列表的末端。
对本例中地磅队列这样的先入先出列表使用后继指针,使得随自卸卡车加入和离开地磅队列而添加和移除实体记录的操作变得特别简单。在 CLOCK 时刻 12,自卸卡车 DT3 开始称重,因而离开地磅队列。要把 DT3 实体记录从列表顶部移除,只需更新头指针,把它置为列表顶部记录的后继指针值:
在本例中,我们得到
这意味着 R(2) 中的自卸卡车 DT2 现在位于列表顶部。
类似地,在 CLOCK 时刻 20,自卸卡车 DT5 到达地磅队列并加入队尾。要把 DT5 实体记录添加到列表底部,需要采取以下步骤:
R(tailptr, next) 5(更新此前最后一项的后继指针字段)
tailptr 5(更新尾指针的值)
R(tailptr, next) 0(对新的尾部项,将其后继指针字段置零)
当列表是一个排名列表时,例如未来事件列表,或按实体属性排名的实体列表,上述做法会变得略为复杂。对于排名列表,要在与表头或表尾不同的任何位置添加或移除项目,通常都需要搜索。参见例 8。
注意,在自卸卡车问题中,装载机队列也可以用同样的六条记录、同一个数组来实现为列表,因为每个自卸卡车实体最多只会出现在这两个列表中的一个上,而在装载、称重或行驶期间,自卸卡车两个列表都不在。
2.3 使用动态分配与链表
在 C 和 Java 之类的过程式语言中,以及在大多数仿真语言中,实体记录在实体被创建时动态创建,事件通知记录则在未来事件列表上安排事件时动态创建。语言本身(或它们所运行的操作系统)维护着一条由空闲内存块组成的链表,并在收到请求时,向运行中的程序分配一块所需大小的内存块。(链表的又一个用途!)当一个实体"死亡"——即退出被仿真的系统——以及在一个事件发生、其事件通知不再需要之后,相应的记录被释放,从而使那块内存可供日后重用;语言或操作系统把该内存块加入空闲内存链表。
本书不关心分配和释放计算机内存的细节,因此我们假定所需的操作会按需要发生。采用动态分配时,记录通过指针而非数组下标来引用。当一条记录在 C 或 Java 中被分配时,分配例程返回一个指向所分配记录的指针,该指针必须存入某个变量或另一条记录的字段中,以备后用。指向记录的指针,可以理解为该记录在计算机内存中的物理地址或逻辑地址。
在我们的示例中,将采用与上一节(2.2 节)相同的记录记号:
实体:[ID, 属性, 后继指针]
事件通知:[事件类型, 事件时间, 其他数据, 后继指针]
但我们不再像前面那样用 R(i) 的数组记号来引用它们,因为那会造成误导。若出于某种原因我们想要列表上的第三项,就必须遍历列表、逐项计数,直到到达第三条记录。与数组不同,链表没有办法直接取出第 i 条记录,因为实际的记录可能存放在计算机内存中的任意位置,并不像数组那样连续存放。
例 8:未来事件列表与自卸卡车问题
从表 6 出发,例 5 自卸卡车问题中的事件通知被扩展为包含一个指向未来事件列表中下一条事件通知的指针,可表示为:
[事件类型, 事件时间, DTi, nextptr],
例如,
[EL, 10, DT3, nextptr]
其中 EL 是自卸卡车 DT3 在未来时刻 10 发生的结束装载事件,而字段 nextptr 指向 FEL 上的下一条记录。请记住,这些记录可能存放在计算机内存中的任意位置,特别是不一定连续存放。图 9 表示了取自表 6 的 CLOCK 时刻 10 的未来事件列表。每条记录的第四个字段都是指向未来事件列表中下一条记录的指针值。
C 和 Java 语言以及其他通用语言,在引用指针变量中的数据时使用不同的记号。为便于讨论,若 R 是指向某条记录的指针,则
分别是 R 所指向的那条事件通知的事件类型、事件时间和下一条记录。例如,若在 CLOCK 时刻 10 把 R 置为 FEL 的头指针,则
R next 是指向 FEL 上第二条事件通知的指针,

图 9 作为链表的自卸卡车未来事件列表。
因此
R next eventtype = EL
R next eventtime = 20
R next next 是指向 FEL 上第三条事件通知的指针
若某个指针字段为零(或 null),则该记录是列表中的最后一项,而指针变量 tailptr 指向这最后一条记录,如图 9 所示。
我们上面所描述的这些结构称为单链表(singly-linked list),因为从链表表头到表尾只有单向的链接。尾指针主要是为方便和效率而保留的,对于那些在列表底部添加项目的列表尤其如此。当然,尾指针并非严格必需,因为最后一项总可以通过遍历列表找到,但它确实使某些操作更加高效。
出于某些目的,除表头之外,还希望能够从表尾出发遍历或搜索列表。为此可以使用双向链表(doubly-linked list)。双向链表上的记录有两个指针字段,一个指向下一条记录,另一个指向前一条记录。讨论数组、单链表与双向链表以及列表的搜索与遍历的优秀参考书是 Cormen 等人 [2001] 和 Sedgewick [1998]。
2.4 高级技术
许多现代仿真软件包使用比在双向链表中搜索更高效的列表技术与表示方式。这些主题中大多数对本书而言过于高级。本节的目的只是简要介绍其中较为高级的思想。
加速双向链表处理的一种思路,是在头指针和尾指针之外再使用一个中间指针。采用特殊技术,中间指针将始终指向列表的近似中点。这样,当一条新记录被添加到列表时,算法先检查中间那条记录,以决定是从列表头部开始搜索还是从列表中部开始搜索。从理论上说,除了维护中间指针所带来的少量额外开销之外,这一技术应当能把搜索时间缩短一半。若干更高级的技术使用一个或多个中间指针,具体取决于列表的长度。
一些高级算法使用双向链表之外的列表表示方式,例如堆或树。这些主题超出了本书的范围。优秀的参考书是 Cormen 等人 [2001] 和 Sedgewick [1998]。
3 小结
本章介绍了仿真中的主要概念与基本构件,其中最重要的是实体与属性、事件以及活动。本章讨论了三种主要的世界观——事件调度、过程交互、活动扫描。最后,为理解最重要的底层方法学之一,第 2 节介绍了列表处理的一些基本概念。
参考文献
CORMEN, T. H., C. E. LEISEROON,AND R. L. RIVEST [2001], Introduction toAlgorithms, 2nd ed., McGraw-Hill, New York.
SCHRIBER, T. J., AND D. T. BRUNNER [2003], “Inside Simulation Software: How it Works and Why it Matters,” Proceedings of the 2003 Winter Simulation Conference, S. Chick, P. J. S´anchez, D. Ferrin, and D. J. Morrice, eds., New Orleans, LA, Dec. 7–10, pp. 113–123.
SEDGEWICK, R. [1998], Algorithms in C , 3d ed., Addison-Wesley, Reading, MA.
习题
给读者的说明:对于大多数习题,读者应先通过显式定义以下各项来构建模型:
系统状态;
系统实体及其属性;
集合,以及可能被放入这些集合的实体;
事件与活动;事件通知;
收集累积统计量所需的变量。
其次,读者要么(1)开发事件逻辑(正如例 3 的图 5 和图 6),以便使用事件调度方法,要么(2)开发系统过程(正如图 4),以便使用过程交互方法。
大多数问题都包含在区间 [a, b] 上均匀分布的活动。在进行手工仿真时,假定 是仅有的可能取值;也就是说,活动时间是离散随机变量。离散性假设将使手工仿真得到简化。
(a) 使用事件调度方法,继续例 3 表 1 中的(手工)收银台仿真。使用此前生成并使用的、来自《电子表格中的仿真示例》一章表 11(例 5 的仿真表)中的相同到达间隔时间与服务时间。(这指的是表 11 的 C 列和 E 列。)一直继续到所有到达的顾客都接受完服务为止。使用完最后一个到达间隔时间之后,假定不再有新的到达。
(b) 重新做一遍习题 1(a),并加入估计平均响应时间和在系统中停留 5 分钟或更久的顾客比例所需的模型构件。[提示:参见例 4,表 2。]
(c) 就手工仿真与计算机仿真各自的相对优点发表评论。
为例 5 的自卸卡车问题构建事件逻辑图。
在例 5 的自卸卡车问题中,希望估计平均响应时间以及大于 30 分钟的响应时间所占的比例。一辆卡车的响应时间始于该卡车到达装载机队列之时,止于该卡车完成称重之时。加入估计这两项系统性能度量所需的模型构件和累积统计量。仿真 8 小时。
按表 2 的形式制作一张表,直到 CLOCK 到达时刻 15,使用下面给出的到达间隔时间与服务时间,顺序如示。停止事件发生在时刻 30。
| 到达间隔时间: | 1 | 5 | 6 | 3 | 8 |
|---|---|---|---|---|---|
| 服务时间: | 3 | 5 | 4 | 1 | 5 |
继续表 2,直到呼叫者 C7 离开。
表 2 的数据改为如下:
| 到达间隔时间: | 4 | 5 | 2 | 8 | 3 | 7 |
|---|---|---|---|---|---|---|
| 服务时间: | 5 | 3 | 4 | 6 | 2 | 7 |
按表 2 的形式制作一张表,停止事件设在时刻 25。
用事件调度方法,通过手工仿真重做《电子表格中的仿真示例》一章的例 6(Able–Baker 呼叫中心问题)。
用事件调度方法,通过手工仿真重做《电子表格中的仿真示例》一章的例 8((M, N) 库存系统)。
用事件调度方法,通过手工仿真重做《电子表格中的仿真示例》一章的例 9(轴承更换问题)。
重做例 5,但使用下列数据:
| 装载时间: | 10 | 5 | 10 | 10 | 5 | 10 | 5 |
|---|---|---|---|---|---|---|---|
| 称重时间: | 12 | 16 | 12 | 12 | 16 | 12 | 12 |
| 行驶时间: | 40 | 60 | 40 | 80 | 100 | 40 |
4 仿真软件
本章首先讨论仿真软件的历史,并对其未来作一些推测。仿真软件的历史才刚刚进入中年期。本章所依据的历史,主要来自我们共同的经验、Richard Nance 教授所写的文章、历届冬季仿真会议(Winter Simulation Conference)上的专题小组讨论,以及本书合著者之一近期撰写的一篇文章。
接下来,我们讨论仿真软件的功能与属性。如果你正准备购买仿真软件,你会关心什么?是价格、易学性、易用性,还是对与你所关注的那类系统建模的能力?抑或是动画功能?在讨论完这些功能之后,我们再讨论与仿真软件选择有关的其他问题与顾虑。
用于开发仿真模型的软件可以分为三类。第一类是通用程序设计语言(general-purpose programming languages),例如 C、C++ 和 Java。第二类是仿真程序设计语言(simulation programming languages),例如 GPSS/H 和 SIMAN V®。第三类是仿真环境(simulation environments)。这一类包含许多产品,它们或以价格、或以应用领域、或以动画类型等各具特色,但具有一些共同的特征,例如图形用户界面,以及支持仿真研究全部(或大部分)方面的环境。许多仿真环境内含一种仿真程序设计语言,但也有一些采用类似于过程流程图(process-flow diagram)的图形化方法。
在第一类中,我们讨论用 Java 进行的仿真。Java 是一种通用程序设计语言,并非专为仿真用途而设计。之所以选择 Java,是因为它使用广泛且易于获得。今天,编写离散事件仿真模型的读者中,单独使用程序设计语言的人已经很少;不过在某些应用领域,也有人使用基于 Java 或其他通用语言构造的软件包。了解如何用通用语言开发模型,有助于理解基本概念与算法是如何实现的。
在第二类中,我们讨论 GPSS/H,这是一门高度结构化的过程交互(process-interaction)仿真语言。GPSS 最初是为较方便地仿真排队系统(如作业车间)而设计的,但后来也被用于仿真极为复杂的系统。它最初由 IBM 推出;如今 GPSS 有多种实现版本,其中 GPSS/H 是使用最为广泛的一种。
在第三类中,我们挑选若干仿真软件包进行讨论。目前可供选择的仿真软件包很多;我们选取了少数几个历经多年而依然存续并发展壮大的产品,用以代表建模的不同思路。
仿真环境的重要组成部分之一是输出分析器(output analyzer),它用于开展实验并辅助分析。为展示各项优良特性的范围,我们来看若干仿真环境中所包含的四类工具。这些统计分析工具通常用于计算汇总统计量(summary statistics)、置信区间(confidence intervals)以及其他统计度量。有些还支持预热期判定(warmup determination)、实验设计(design of experiments)和敏感性分析(sensitivity analyses)。如今许多软件包还提供基于遗传算法(genetic algorithms)、进化策略(evolutionary strategies)、禁忌搜索(tabu search)、分散搜索(scatter search)以及其他新近发展起来的启发式方法的优化技术。除了支持统计分析与优化之外,仿真环境还提供数据管理、方案定义(scenario definition)和运行管理(run management)。数据管理为分析与仿真相关的全部输入、输出数据的管理提供支持。
1 仿真软件的历史
我们对仿真软件历史的讨论依据 Nance [1995],他把 1955 年至 1986 年划分为五个时期。补充的历史信息取自 1992 年冬季仿真会议题为「Perspectives of the Founding Fathers」[Wilson et al., 1992] 的专题小组讨论,其中八位早期仿真用户介绍了各自的历史视角。我们补充上第六个、也是最近的一个时期,然后对未来作一些推测:
- 1955–1960 探索时期(The Period of Search)
- 1961–1965 萌芽时期(The Advent)
- 1966–1970 成形时期(The Formative Period)
- 1971–1978 扩展时期(The Expansion Period)
- 1979–1986 巩固与再生时期(The Period of Consolidation and Regeneration)
- 1987–2008 集成环境时期(The Period of Integrated Environments)
- 2009–2011 未来(The Future)
下面各小节简要介绍这段历史。如 Nance [1995] 所指出的,截至 1981 年已有报告的仿真程序设计语言至少有 137 种,此后又有更多。本书这段简要历史远非完整。我们提到的这些语言与软件包,或经受住了时间考验而延续至今,或曾是现今仍在使用的某个软件包的历史前身。
1.1 探索时期(1955–1960)
在早期年代,仿真是在 FORTRAN 或其他通用程序设计语言中进行的,没有仿真专用例程(routines)的支持。在第一个时期,人们投入了大量精力去探索统一的概念,并开发可复用的例程以便利仿真。K.D. Tocher 与 D.G. Owen [1960] 的通用仿真程序(General Simulation Program)被认为是第一次「语言方面的努力」。Tocher 识别并开发出可以在后续仿真项目中重复使用的例程。
1.2 萌芽时期(1961–1965)
今天仍在使用的仿真程序设计语言(simulation programming languages, SPLs)的前身,出现于 1961–1965 年。正如 Harold Hixson 在 Wilson et al. [1992] 中所说,「一开始只有 FORTRAN、ALGOL 和 GPSS」——也就是说,当时有基于 FORTRAN 的软件包(如 SIMSCRIPT 与 GASP)、ALGOL 的衍生语言 SIMULA,以及 GPSS。
第一个过程交互式 SPL——GPSS——由 IBM 的 Geoffrey Gordon 开发,约于 1961 年问世。Gordon 开发 GPSS(General Purpose Simulation System)是为了快速仿真通信系统与计算机系统,但其易用性很快使它流行开来,并蔓延到其他应用领域。GPSS 基于方块图表示(block-diagram representation,类似过程流程图),适用于各种类型的排队模型。如 Reitman 在 Wilson et al. [1992] 中所报道,早在 1965 年,GPSS 就已与一台可中断运行并显示中间结果的交互显示终端相连接——这预示了当今的交互式仿真,但在当时价格过于昂贵,未能广泛普及。
Harry Markowitz(后来因其组合理论(portfolio theory)方面的工作而获得诺贝尔奖)为 SIMSCRIPT 提供了主要的概念指导,该语言最初出现于 1963 年。RAND Corporation 在美国空军的资助下开发了这种语言。SIMSCRIPT 最初深受 FORTRAN 影响,但在后来的版本中,其开发者摆脱了 FORTRAN 的基础,创立了自己的 SPL。最初的几个版本是基于事件调度的。
United States Steel Corporation 应用研究实验室(Applied Research Laboratory)的 Phillip J. Kiviat 于 1961 年开始开发 GASP(General Activity Simulation Program)。它最初基于通用程序设计语言 ALGOL,但后来决定改以 FORTRAN 为基础。GASP 与 GPSS 一样,采用工程师所熟悉的流程图符号。它并非一门真正意义上的语言,而是一组 FORTRAN 例程的集合,用于在 FORTRAN 中便利地开展仿真。
在这一时期还开发了许多其他 SPL。其中值得注意的有:在挪威开发、在欧洲广泛使用的 ALGOL 扩展语言 SIMULA,以及采用活动扫描(activity-scanning)方法的控制与仿真语言(Control and Simulation Language, CSL)。
1.3 成形时期(1966–1970)
在这一时期,人们对各种概念进行审视与提炼,以促成各语言「世界观」更加一致的表达。主要的 SPL 日趋成熟并得到更广泛的使用。
硬件的迅速进步与用户的需求,迫使一些语言(尤其是 GPSS)经历重大修订。GPSS/360 连同对早期 GPSS 版本的扩展,面向 IBM 360 计算机问世。它的流行促使至少六家其他硬件厂商以及其他团体开发出各自的 GPSS 实现或类似产品。
SIMSCRIPT II 代表了 SPL 的一次重大进步。在其自由格式的类英语语言和「宽容」的编译器中,人们试图在语言设计上给予用户充分的考虑。
CSL 的衍生语言 ECSL 得到开发,并在英国广受欢迎。在欧洲,SIMULA 加入了类与继承的概念,从而成为现代面向对象程序设计语言的先驱。
1.4 扩展时期(1971–1978)
这一时期 GPSS 的主要进展来自 IBM 之外。Norden Systems 的 Julian Reitman 主持了 GPSS/NORDEN 的开发,这是一项开创性的工作,提供了交互式、可视化的在线环境。Wolverine Software 的 James O. Henriksen 开发了 GPSS/H,1977 年首先在 IBM 大型机上发布,随后登陆小型计算机与 PC。它以采用编译方式、据称比标准 GPSS 快 5 至 30 倍而著称。随着交互式调试器等新特性的加入,它已成为当今使用最广的 GPSS 版本。
Purdue 大学的 Alan Pritsker 对 GASP 作了重大改动,GASP IV 于 1974 年问世。它在时间事件之外还引入了状态事件(state events),因而在事件调度世界观之外,又增加了对活动扫描世界观的支持。
这一时期人们曾努力简化建模过程。利用 SIMULA,人们尝试从高层用户视角出发开发一种系统定义,并可自动翻译为可执行模型。类似的工作还包括交互式程序生成器、「按问卷编程」(Programming by Questionnaire)、自然语言接口,以及向所选语言的自动映射。正如早期对自动程序设计的过分乐观的信念一样,这些努力在「可建模内容之普遍性」上遭遇了严重的限制——也就是说,它们碰到了真实世界系统不可避免的复杂性。尽管如此,简化仿真建模的努力仍在继续,其中最为成功的见于面向狭窄领域应用而设计的仿真系统。
1.5 巩固与再生时期(1979–1986)
第五个时期见证了为桌面计算机和微型计算机编写、或加以改造的 SPL 的开端。在这一时期,主要的 SPL 在保持其基本结构的同时,把其实现扩展到了许多计算机和微处理器上。
GASP 衍生出两个重要后继:SLAM II 与 SIMAN。由 Pritsker and Associates, Inc. 推出的替代建模仿真语言(Simulation Language for Alternative Modeling, SLAM)力求提供多种建模视角与组合建模能力 [Pritsker and Pegden, 1979]——也就是说,它既有一个基于 GASP 的事件调度视角,有一个网络世界观(过程交互视角的一个变种),还有一个连续部分。借助 SLAM,你可以选择某一种世界观,或把三者混合使用。
SIMAN(SIMulation ANalysis)拥有 GASP IV 等 SPL 所具备的一般建模能力,同时还具有在某些方面类似 SLAM 和 GPSS 的方块图部分。C. Dennis Pegden 用大约两年时间、作为个人的教师科研项目开发了 SIMAN;他后来创办了 Systems Modeling Corporation 来推广 SIMAN。SIMAN 是第一种可以在 IBM PC 上运行、并按 MS-DOS 的约束条件设计的主要仿真语言。与 GASP 类似,SIMAN 允许采用事件调度方法(通过用 FORTRAN 编程并配以一组给定的 FORTRAN 例程)、方块图方法(过程交互世界观的另一个变种,在某些方面与 GPSS 和 SLAM 类似),以及一个连续部分。
1.6 集成环境时期(1987–2008)
这一时期的特点是 SPL 在个人计算机上的成长,以及带有图形用户界面、动画和其他可视化工具的仿真环境的出现。AutoMod 与 Extend 是最早提供集成式仿真环境的两个软件包之一。今天,几乎所有仿真软件包都带有把建模、模型调试、动画与模型的交互式运行整合在一起的环境。这些环境中有很多还包含输入数据分析器与输出分析器。有些软件包试图借助过程流程图或方块图,以及「填空式」(fill-in-the-blank)窗口来简化建模过程,从而免去学习程序设计语法的必要。动画的表现形式从示意图式的表示一直延伸到二维与三维的比例图。
基于网络的仿真方面近来已有进展。仿真已被认为在供应链管理中能够发挥作用。仿真与模拟(emulation)的结合显示出前景。(模拟是指对某种装置的模仿,例如 www.demo3d.com 中所示的那些物料搬运设备。)
1.7 未来(2009–2011)
在 ICS Newsletter 的一篇文章 [Banks, 2008] 中,本书的一位合著者向一个仿真专家小组(其中包括业内知名的权威人士)询问了他们对离散事件仿真未来发展的意见或最佳猜测。第一个问题是:「在不久的将来——比如说三年之内——我们将在仿真软件中看到哪些非凡的成果?」
被提及最多的未来发展方向(包括更多地使用虚拟现实)有:改进的用户界面、更好的动画,以及一次范式转移,例如在离散事件建模中大规模采用基于智能体的建模(agent-based modeling)。尽管迄今为止,基于智能体的建模已被广泛用于对群体行为(社会动乱、战争,甚至判定是哪些要素引发了起立鼓掌)和社会现象(季节性迁徙、污染、疾病传播、有性繁殖等)建模,但它在工业与商业仿真中的应用才刚刚开始。
基于智能体的建模是一种方法,用于仿真网络中自主个体(即智能体)的行为与交互,目的是评估它们对整个系统的影响。智能体可以是人、动物或其他具有能动性(agency)的实体;所谓能动性,是指它们并非被动的,而是主动作出决策、保留对以往情形与决策的记忆,并表现出学习能力。概括地说,智能体是主动的,并可能表现出认知、记忆与学习。它们可以有目标,也可以没有目标。
每个智能体的行为由一组局部规则支配;也就是说,智能体会以规定的方式对局部的、近旁条件作出反应。人们关注的是由智能体群体涌现出来的行为模式,称为涌现行为(emergent behavior)。
一个有趣且广为人知的例子是「群鸟」(boids,即在给定二维或三维区域内飞行的模拟鸟群),其中群集行为会涌现出来。(在互联网上可以找到许多群鸟模型的例子,它们各自基于相似但并不完全相同的假设或规则。可参见 www.navgen.com/3d boids。)群集行为既非脚本编排,也非显式编程,而是从一组相当简单的规则中自然涌现(而且颇为出人意料)。基本规则是:若一只群鸟靠近了一只或多只其他群鸟,它就会调整自己的方向与速度以与那些群鸟保持一致。在互联网上找到的大多数群鸟仿真中,群鸟并非目标导向的;也就是说,它们没有目的地,只是飞行而已。至少有一个群鸟仿真例子中,群鸟确实有目标:那里有两群或更多群鸟,其中一群的成员会攻击并杀死其他群的成员。
用于基于智能体的建模的软件包与工具包包括:
- AnyLogic(www.xjtek.com),见 7.1 节;
- Ascape(www.nutechsolutions.com);
- MASON(cs.gmu.edu/%7Eeclab/projects/mason);
- NetLogo(ccl.northwestern.edu/netlogo);
- StarLogo(education.mit.edu/starlogo);
- Swarm(www.swarm.org);
- RePast(www.repast.sourceforge.net),
仅举此数种。
关于各类软件包的信息见第 7 节,其中也给出了各厂商的网址。从这些网址可以得到当前仿真软件发展动态的一个视图。
2 仿真软件的选择
本章简要介绍了若干仿真软件包。每两年,期刊 OR/MS Today 会刊登一份仿真软件调查 [Swain, 2007]。2007 年那一期共收录 48 种产品,其中包括输入数据分析器之类的仿真支持包。
选择仿真软件时有许多值得关注的功能 [Banks, 1996]。表 1 至表 5 给出了其中一些功能及其简要说明。在评估和选择仿真软件时,我们提出如下建议:
- 不要只关注单一问题,例如易用性。应当考虑可达到的精度与细节水平、易学性、厂商支持,以及对你的应用是否适用。
- 执行速度很重要。不要只从「夜间和周末进行实验运行」的角度来思考问题。速度会影响开发时间。在调试过程中,分析师可能不得不反复等待模型运行到仿真时间中出错的那一点,才能发现错误。
- 对广告宣传与演示要保持警惕。许多广告只利用软件的正面特性。同样,演示程序把测试问题解决得很好,但未必是你自己的问题。
- 请厂商解决你的问题的一个小型版本。
表 1 模型构建特性(Model-Building Features)
| 特性 | 说明 |
|---|---|
| 建模世界观 | 依需要选择过程交互、事件视角与连续建模 |
| 输入数据分析能力 | 从原始数据估计经验分布或统计分布 |
| 图形化建模 | 过程流程、方块图或网络方法 |
| 条件路由 | 依据规定的条件或属性为实体选择路径 |
| 仿真程序设计 | 通过高级而强大的仿真语言添加过程逻辑的能力 |
| 语法 | 易于理解、一致、无歧义、类英语 |
| 输入灵活性 | 接受来自外部文件、数据库、电子表格的数据,或以交互方式输入数据 |
| 建模简洁性 | 功能强大的动作、模块或节点 |
| 随机性 | 常用各分布的随机变量生成器,例如指数分布、三角分布、均匀分布、正态分布 |
| 专用构件与模板 | 物料搬运:车辆、输送带、桥式起重机、AS/RS 等;液体与散装物料的处理;通信系统;计算机系统;呼叫中心;其他 |
| 用户自定义对象 | 可复用的对象、模板与子模型 |
| 连续流 | 储罐与管道,或散料输送带 |
| 与通用程序设计语言的接口 | 链接以 C、C++、Java 或其他通用程序设计语言编写的代码 |
表 2 运行环境(Runtime Environment)
| 特性 | 说明 |
|---|---|
| 执行速度 | 方案与重复实验都需要大量运行。既影响开发,也影响实验 |
| 模型规模;变量与属性数量 | 不应有任何内建限制 |
| 交互式调试器 | 在仿真推进过程中细致地监视仿真。能够中断、捕获、运行至指定点、单步执行;显示状态、属性与变量等 |
| 模型状态与统计量 | 在仿真过程中的任何时刻显示 |
| 运行许可证 | 能够修改参数并运行模型(但不能修改逻辑或构建新模型) |
- 对那些只有「是」和「否」两种条目的「检查表」要保持警惕。例如,许多软件包都声称具有输送带实体。然而,各家实现的差异相当大,保真度也参差不齐。真正重要的是实现与能力。再举一个例子,大多数软件包都提供运行许可证,但它们在价格与功能上差异很大。
表 3 动画与布局特性(Animation and Layout Features)
| 特性 | 说明 |
|---|---|
| 动画类型 | 忠于比例或图标式(如过程流程图) |
| 导入图形与对象文件 | 来自 CAD(矢量格式)图形,或图标(位图或光栅图形) |
| 维数 | 二维、带透视的二维、三维 |
| 运动 | 实体或状态指示器的移动 |
| 运动质量 | 平滑或跳跃 |
| 常用对象库 | 大量预先绘制的图形 |
| 导航 | 平移、缩放、旋转 |
| 视图 | 用户定义并命名 |
| 显示步长 | 对动画速度的控制 |
| 可选择对象 | 选中后显示动态状态与统计量 |
| 硬件要求 | 标准显卡或专用显卡 |
表 4 输出特性(Output Features)
| 特性 | 说明 |
|---|---|
| 方案管理器 | 创建用户自定义的待仿真方案 |
| 运行管理器 | 执行所有运行(方案与重复实验)并保存结果以供日后分析 |
| 预热能力 | 用于稳态分析 |
| 独立重复实验 | 使用不同的随机数集合 |
| 优化 | 遗传算法、禁忌搜索等 |
| 标准化报告 | 含平均值、计数、最小值与最大值等的汇总报告 |
| 定制报告 | 面向管理人员的量身定制的展示 |
| 统计分析 | 置信区间、实验设计等 |
| 商务图表 | 条形图、饼图、时间线等 |
| 成本模块 | 内含基于活动的成本核算 |
| 文件导出 | 输出至电子表格或数据库,以便定制处理与分析 |
| 数据库维护 | 以有组织的方式存储输出 |
表 5 厂商支持与产品文档(Vendor Support and Product Documentation)
| 特性 | 说明 |
|---|---|
| 培训 | 定期开设的高质量课程 |
| 文档 | 质量、完整性、在线可查 |
| 帮助系统 | 通用帮助或上下文相关帮助 |
| 教程 | 用于学习软件包或特定功能 |
| 支持 | 电话、电子邮件、Web |
| 升级与维护 | 新版本与维护版本的发布规律,且能回应客户需求 |
| 历史记录 | 稳定性、历史、与客户的关系 |
仿真用户常问:仿真模型能否链接并使用以外部语言(如 C、C++ 或 Java)编写的代码或例程?这是一项很好的特性,尤其当这些外部例程已经存在且适合当前用途时。但更重要的问题是:仿真软件包及其语言是否足够强大,从而使人无须在任何外部语言中编写逻辑。
图形化建模环境与基于仿真语言的软件包之间可能存在重大的取舍。图形化建模消除了因语言语法而产生的学习曲线,但它并未消除在大多数真实世界模型中对过程逻辑的需要,也并未消除为了把它写对而进行的调试。除非该软件包与你的问题领域几乎完全契合,或者可以用所给的模块、节点或过程流程图完成程序设计(即定制化的过程逻辑)——只有在这种情况下,「无需程序设计」的说法才成立;而此时「无需程序设计」指的仅仅是语法,而非过程逻辑的开发。
3 一个仿真实例
例 1:收银台——一个典型的单服务台队列
该系统是一个杂货店收银台,被建模为单服务台队列。仿真将一直运行到 1000 位顾客得到服务为止。此外,假定顾客的到达间隔时间服从均值为 4.5 分钟的指数分布,服务时间(近似地)服从均值为 3.2 分钟、标准差为 0.6 分钟的正态分布。(这个近似之处在于服务时间总是为正。)当收银员忙碌时,就形成排队,且没有顾客被劝离。本例曾采用事件调度(event-scheduling)的观点手工仿真过。模型包含两个事件:到达事件与离开事件。
接下来的三节分别用 Java、GPSS/H 和 SSF(Scalable Simulation Framework,可扩展仿真框架)说明这个单服务台队列的仿真。虽然本例要比研究复杂系统时出现的模型简单得多,但其仿真包含了所有离散事件仿真的基本组成部分。
4 用 Java 进行仿真
Java 是一种广泛可得、并在仿真中得到广泛使用的程序设计语言。然而它并未提供任何直接面向仿真分析师的设施,因此分析师必须自行编程实现事件调度/时间推进算法的全部细节、统计量收集功能、从指定概率分布中生成样本的功能,以及报告生成器。尽管如此,其运行时类库确实提供了一个随机数发生器(random-number generator)。与 FORTRAN 或 C 不同,Java 的面向对象特性确实支持大型模型的模块化构造。就大部分情况而言,专用仿真语言会隐藏事件调度的细节,而在 Java 中所有细节都必须显式地编程实现。不过在一定程度上,诸如 SSF [Cowie, 1999] 这样的仿真类库确实减轻了开发负担:它们提供了对标准化仿真功能的访问,并隐藏了底层调度的琐碎细节。
学习 Java 有许多在线资源;我们假定读者已具备该语言的工作知识。任何用 Java 编写的离散事件仿真模型都包含第 3 节讨论过的组成部分:系统状态、实体与属性、集合、事件、活动与延迟,以及下面列出的组成部分。为便于开发和调试,最好用方法来把 Java 模型组织成模块化的形式。以下组成部分几乎在所有用 Java 编写的模型中都会出现:
时钟(Clock):定义仿真时间的变量。
初始化方法(Initialization method):定义时刻 0 系统状态的方法。
最小时刻事件方法(Min-time event method):识别即时事件(imminent event)的方法,即未来事件列表(FutureEventList)中时间戳最小的元素。
事件方法(Event methods):对每一种事件类型,配备一个在该事件发生时更新系统状态(以及累积统计量)的方法。
随机变量生成器(Random-variate generators):用于从所需概率分布中生成样本的方法。
主程序(Main program):用于维持对事件调度算法的总体控制。
报告生成器(Report generator):根据累积统计量计算汇总统计量,并在仿真结束时打印报告的方法。

图 1 事件调度仿真程序的总体结构。
Java 仿真程序的总体结构如图 1 所示。
仿真开始时,把仿真时钟置零,把累积统计量初始化为零,生成所有初始事件(总会至少有一个),把它们放入 FutureEventList,并定义时刻 0 的系统状态。随后仿真程序进入循环,反复把当前时间最早的事件传递给相应的事件方法,直到仿真结束。在每一步中,找到即时事件之后、调用事件方法之前,仿真时钟被推进到即时事件发生的时刻。(回顾一下:在两个相继事件发生之间的仿真时间内,系统状态与实体属性的取值并不改变。事实上,这正是离散事件仿真的定义:系统状态仅在事件发生时才改变。)接着,调用相应的事件方法来执行即时事件、更新累积统计量并生成未来事件(放入 FutureEventList)。执行即时事件意味着改变系统状态、实体属性和集合的成员关系,以反映该事件已经发生这一事实。注意,事件方法中的所有动作都发生在仿真的同一瞬间。变量 Clock 的取值在事件方法中并不改变。若仿真尚未结束,控制权再次转回时间推进方法,再转到相应的事件方法,如此继续。当仿真结束时,控制权转给报告生成器,由它根据收集到的累积统计量计算所需的汇总统计量并打印报告。
一个仿真模型在计算机运行时间上的效率,在很大程度上取决于操作 FutureEventList 及其他集合所采用的技术。如第 3 节早先所述,对 FutureEventList 执行的主要操作是从中移除即时事件与添加新事件。Java 提供了通用的、高效的搜索与优先列表数据结构;通常的做法是为这些结构构建定制的接口以适应具体应用。在下面这个例子中,我们用定制的接口来实现事件列表与等待顾客列表。其底层的优先队列组织是高效的,因为其访问代价仅随列表中元素个数的对数而增长。
例 2:用 Java 仿真单服务台队列
例 1 中详细定义的杂货店收银台,现用 Java 进行仿真。
类 Event 表示一个事件。它保存事件类型(到达或离开)的代码以及事件时间戳。它带有若干相关方法(函数),用于创建事件和访问其数据。它还带有一个相关方法 compareTo,把该事件与另一个(作为参数传入的)事件进行比较,并报告前者应被视为比参数事件小、相等还是大。本模型的方法与控制流程如图 2 所示,该图是图 1 针对本问题的改编。表 6 列出了用于系统状态、实体属性与集合、活动持续时间、累积统计量与汇总统计量的变量;用于从指数分布与正态分布中生成样本的函数;以及所需的全部其他方法。
表 6 单服务台队列 Java 模型中变量、函数与方法的定义
| 变量 | 说明 |
|---|---|
| 系统状态 | |
| QueueLength | 当前仿真时刻处于排队中(但未接受服务)的顾客数 |
| NumberInService | 当前仿真时刻正在接受服务的顾客数 |
| 实体属性与集合 | |
| Customers | 系统中顾客的 FCFS 队列 |
| 未来事件列表 | |
| FutureEventList | 按优先级排序的待处理事件列表 |
| 活动持续时间 | |
| MeanInterArrivalTime | 前一位顾客到达与下一次到达之间的到达间隔时间 |
| MeanServiceTime | 最近一位开始接受服务的顾客的服务时间 |
| 输入参数 | |
| MeanInterarrivalTime | 平均到达间隔时间(4.5 分钟) |
| MeanServiceTime | 平均服务时间(3.2 分钟) |
| SIGMA | 服务时间的标准差(0.6 分钟) |
| TotalCustomers | 停止准则——要服务的顾客数(1000) |
| 仿真变量 | |
| Clock | 仿真时间的当前值 |
| 统计量累加器 | |
| LastEventTime | 最后一个事件的发生时刻 |
| TotalBusy | 服务台(迄今)的总忙碌时间 |
| MaxQueueLength | 排队线(迄今)的最大长度 |
| SumResponseTime | 所有已离开顾客(迄今)的顾客响应时间之和 |
| NumberOfDepartures | 离开次数(迄今) |
| LongService | 在收银台停留 4 分钟及以上的顾客数(迄今) |
| 汇总统计量 | |
| RHO =BusyTime/Clock | 服务台忙碌的时间比例(此处 Clock 的值为仿真时间的最终值) |
| AVGR | 平均响应时间(等于 SumResponseTime/TotalCustomers) |
| PC4 | 在收银台停留 4 分钟及以上的顾客所占比例 |
| 函数 | 说明 |
| exponential(mu) | 用于从均值为 mu 的指数分布中生成样本的函数 |
| normal(xmu, SIGMA) | 用于从均值为 xmu、标准差为 SIGMA 的正态分布中生成样本的函数 |
| 方法 | 说明 |
| Initialization | 初始化方法 |
| ProcessArrival | 执行到达事件的事件方法 |
| ProcessDeparture | 执行离开事件的事件方法 |
| ReportGeneration | 报告生成器 |

图 2 单服务台队列 Java 仿真的总体结构。
图 3 单服务台队列仿真的 Java 主程序。
程序的入口以及控制逻辑所在之处是类 Sim,如图 3 所示。类 EventList 与 Queue 的变量被声明为外部类;由于这些类对 Sim 之外的程序同样有用,按照 Java 规则,它们的声明置于其他文件中。同时还声明了 Java 内建类 Random 的一个变量;该类的实例提供随机数流。主方法控制着事件调度/时间推进算法的总体流程。
图 4 单服务台队列仿真的 Java 初始化方法。
主程序方法首先给描述模型参数的变量赋值;它创建随机数发生器、事件列表和顾客队列的实例;然后调用方法 Initialization 来初始化其他变量,例如收集统计量的变量。随后控制进入一个循环,只有在 TotalCustomers 位顾客都接受了服务之后才退出该循环。循环内部,通过调用优先队列的 getMin 方法得到即时事件的一份副本,再通过调用 dequeue 把该事件从事件列表中移除。全局仿真时间 Clock 被设为即时事件中所含的时间戳,然后根据事件类型调用 ProcessArrival 或 ProcessDeparture。仿真最终结束时,调用方法 ReportGeneration 来生成并打印最终报告。
类 Sim 方法 Initialization 的清单见图 4。仿真时钟、系统状态和其他变量在此被初始化。注意,第一个到达事件是通过生成一个局部 Event 变量而创建的,其构造函数接受事件类型与时间。事件时间戳由调用类 Sim 方法 exponential 随机生成,该方法把随机数流与指数分布的均值一起使用以进行抽样。事件通过调用方法 enqueue 插入未来事件列表。这一逻辑假定在仿真时刻 Clock 为 0 时系统是空的,因此没有离开事件需要被调度。若要适应其他初始条件,只需按需向 FutureEventList 与 Customers 中添加事件,代码的修改十分直接。
图 5 给出了类 Sim 方法 ProcessArrival 的清单,该方法用于处理每一个到达事件。单服务台队列到达事件的基本逻辑如下(其中 LQ 对应 QueueLength,LS 对应 NumberInService)。首先,把新到达者加入系统中顾客的队列 Customers。接着,若服务台空闲(NumberInService 为 0),则新顾客立即进入服务,因此调用类 Sim 方法 ScheduleDeparture 来完成这一调度。到达空闲队列不会更新累积统计量,但最大队列长度可能除外。到达忙碌队列不会导致离开事件的调度,但会使总忙碌时间增加「当前事件与紧邻其前一个事件之间」的仿真时间长度(因为若服务台此刻忙碌,那么在处理前一个事件结束之前,服务台必定至少已有一位顾客在接受服务)。无论哪种情况,新到达者都负责为未来某个随机的到达间隔时间之后的下一次到达进行调度。到达事件的仿真时间取当前 Clock 值加上一个指数增量生成,该事件被插入未来事件列表,记录已处理事件时刻的变量 LastEventTime 被设为当前时刻,控制权返回类 Sim 的主方法。
图 5 单服务台队列仿真的 Java 到达事件方法。
执行离开事件的类 Sim 方法 ProcessDeparture 列于图 6 中,方法 ScheduleDeparture 也一并列出。把事件从全体顾客的队列中移除之后,要检查正在接受服务的人数。若有顾客在等待,则为下一位进入服务的顾客调度其离开事件。随后更新记录所有响应时间之和、忙碌时间之和、使用服务时间超过 4 分钟的顾客数以及离开次数的累积统计量。(注意,发生离开事件时最大队列长度的取值不可能改变。)注意,顾客是按 FIFO 顺序从 Customers 中移除的;因此,离队顾客的响应时间可以用当前仿真时间减去离开服务的作业的到达时间(该到达时间由从 Customers 队列中移除的到达事件副本获得)来计算。在离开总数递增并保存本事件时刻之后,控制权返回主程序。
图 6 还给出了方法 ScheduleDeparture 的逻辑,该方法由 ProcessArrival 和 ProcessDeparture 共同调用,用以让下一位顾客进入服务。类 Sim 方法 normal 用于生成服从正态分布的服务时间,它被反复调用直到产生一个非负样本为止。一个类型为 departure 的新事件被创建,其事件时间等于当前仿真时间加上刚刚抽样得到的服务时间。该事件被压入 FutureEventList,
图 6 单服务台队列仿真的 Java 离开事件方法。
正在服务的人数被置为 1,等待人数(QueueLength)减 1,以反映进入服务的顾客不再处于等待状态这一事实。
报告生成器,即类 Sim 方法 ReportGeneration,列于图 7。汇总统计量 RHO、AVGR 和 PC4 由表 6 中的公式计算得出;随后先打印输入参数,再打印汇总统计量。在仿真结束时打印输入参数是个好主意,这样可以核实这些参数的取值是否正确,以及是否在无意中被改动过。
图 8 给出了用于生成随机变量的类 Sim 方法 exponential 与 normal 的清单。这两个函数都调用方法 nextDouble,该方法为 Java 内建类 Random 所定义,生成一个在 (0,1) 区间上均匀分布的随机数。这里使用 Random 仅为简化讲解;更优的随机数发生器是可以自行构造的。生成指数分布与正态分布随机变量的技术,都是以先生成一个 U(0,1) 随机数为基础的。
杂货店收银台仿真的输出如图 9 所示。必须强调,输出统计量是包含随机误差的估计值。所显示的数值受以下因素影响:恰好被用到的那组特定随机数、时刻 0 的初始条件,以及运行长度(此处为 1000 次离开)。
图 7 单服务台队列仿真的 Java 报告生成器。
在某些仿真中,希望在经过一段固定长度的时间后停止仿真,比如 TE 为 12 小时即 720 分钟。在这种情况下,要定义一种额外的事件类型——停止事件(stop event),并通过在仿真初始化时调度一个停止事件来安排它发生。当停止事件真的发生时,累积统计量将被更新,并调用报告生成器。主程序和方法 Initialization 只需做少量修改。习题 1 要求读者完成这些修改。习题 2 考虑再加一项修改:在仿真时刻 Clock 等于 TE 时仍在收银台的顾客应当获准离店,但 TE 之后不再允许新的到达。
图 8 单服务台队列仿真的随机变量生成器。
图 9 Java 单服务台队列仿真的输出。
5 用 GPSS 进行仿真
GPSS 是一门高度结构化的、专用的仿真程序设计语言,它基于过程交互方法,面向排队系统。方块图提供了一条方便的途径来描述被仿真的系统。GPSS 中有 40 多个标准模块。称为事务(transactions)的实体,可以看作在方块图中流动。模块代表影响事务流动的事件、延迟以及其他动作。因此,GPSS 可以用来建模任何这样的情形:事务(实体、顾客、交通流量单位)流经一个系统(例如,一个排队网络,其中各队列位于稀缺资源之前)。方块图被转换为模块语句,再加入控制语句,其结果就是一个 GPSS 模型。
GPSS 的第一个版本由 IBM 于 1961 年发布。它是第一个过程交互式仿真语言,并广受欢迎;自 1961 年以来,许多方面对它重新实现并加以改进,其中 GPSS/H 是今天使用最广的版本。例 3 基于 GPSS/H。
GPSS/H 是 Wolverine Software Corporation 的产品,网址为 www.wolverinesoftware.com [Banks, Carson, and Sy, 1995; Henriksen, 1999]。它是一件灵活而强大的仿真工具。与最初的 IBM 实现不同,GPSS/H 内含文件与屏幕 I/O,允许把算术表达式用作模块操作数,并提供交互式调试器、更快的执行速度、扩展的控制语句、普通变量与数组、浮点时钟、内建数学函数以及内建随机变量生成器。
GPSS/H 的动画工具是 ProofAnimation™,它是 Wolverine Software Corporation 的另一款产品 [Henriksen, 1999]。ProofAnimation 提供二维或三维动画,通常基于比例图。它可以以后处理模式(仿真运行结束之后)运行,也可以与仿真并行运行。在后处理模式下,动画由两个文件驱动:提供静态背景的布局文件,以及包含使对象移动并产生其他动态事件之命令的跟踪文件。它可以与任何能够写出 ASCII 跟踪文件的仿真软件包配合使用。或者,它也可以通过把跟踪文件命令作为消息发送而与仿真并行运行,还可以直接使用它的 DLL(动态链接库)版本来控制。
例 3:用 GPSS/H 仿真单服务台队列
图 10 给出方块图,图 11 给出例 2 中所描述的杂货店收银台模型的 GPSS 程序。注意,程序(图 11)是方块图的翻译,并附加了定义语句与控制语句。(在下面的讨论中,所有非保留字均以斜体表示。)
在图 10 中,GENERATE 模块代表到达事件,其到达间隔时间由 RVEXPO(1,&IAT) 指定。RVEXPO 表示「随机变量,服从指数分布」,其中的 1 表示要使用的随机数流,而 &IAT 表示指数分布的均值时间取自所谓的安培变量(ampervariable)&IAT。安培变量的名字以「&」字符开头;Wolverine 之所以在 GPSS 中引入安培变量,是因为最初的 IBM 实现对普通全局变量的支持很有限,用户在命名它们方面毫无自由。
下一个模块是一个名为 SYSTIME 的 QUEUE 模块。需要指出的是,在 GPSS 中,队列或排队线的形成并不需要 QUEUE 模块。QUEUE 模块的真正目的是与 DEPART 模块配合使用,以收集队列或任何其他子系统的数据。在例 3 中,我们要测量系统响应时间——也就是事务在系统中所耗费的时间。在事务进入系统之处放置一个 QUEUE 模块,并在事务完成处理之处放置与之配对的 DEPART 模块,响应时间就会被自动收集起来。DEPART 模块的用途是标示对单个事务的数据收集结束。QUEUE 与 DEPART 模块的组合对于排队建模并非必需,它只用于统计数据的收集。

图 10 单服务台队列仿真的 GPSS 方块图。

图 11 单服务台队列仿真的 GPSS/H 程序。
下一个 QUEUE 模块(队列名为 LINE)开始为收银员前的排队线收集数据。顾客可能需要等待收银员,也可能不需要。当顾客到达一个空闲的收银台,或在排队线中前进到队首时,该顾客就「占用」收银员,这由资源名为 CHECKOUT 的 SEIZE 模块表示。一旦代表顾客的事务占用了由资源 CHECKOUT 表示的收银员,排队线统计的数据收集即告结束,这由队列名为 LINE 的 DEPART 模块表示。事务在收银员处的服务时间由一个 ADVANCE 模块表示。RVNORM 表示「随机变量,服从正态分布」。这里同样使用随机数流 1,正态分布的均值时间由安培变量 &MEAN 给出,其标准差由安培变量 &STDEV 给出。接下来,顾客通过一个 RELEASE 模块放弃对设施 CHECKOUT 的使用。响应时间数据收集的结束,由队列 SYSTIME 的 DEPART 模块标示。
接下来是一个 TEST 模块,用来检验在系统中的时间 M1 是否大于或等于 4 分钟。(注意,M1 是 GPSS/H 中的保留字;它自动跟踪事务在系统中的总时间。)在 GPSS/H 中,其语义是「若为真,则顺序通过」。因此,若顾客已在系统中停留了 4 分钟或更久,接下来的 BLET 模块(代表 LET 模块)就使计数器 &COUNT 增加 1。若条件不成立,转出的路径通向标号为 TER 的模块。该标号出现在 TERMINATE 模块之前,后者的用途是把事务从系统中移除。TERMINATE 模块的值为「1」,表示向限额值(或称「尚待处理的事务数」)再计入一个事务。
本例中的控制语句,就是图 11 中位于模块段之前或之后的那些行。(模型中从 GENERATE 模块到 TERMINATE 模块共有十一个模块。)以「*」开头的控制语句是注释,其中有些仅用于排版留白。控制语句 SIMULATE 指示 GPSS/H 开展一次仿真;若省略它,GPSS/H 只会编译模型并检查错误。安培变量由 INTEGER 与 REAL 控制语句定义为整数型或实型。安培变量 &COUNT 似乎应当定义为整数;然而,它稍后要除以一个实数值。若它是整数型,则整数除以实数的结果是截断,这在本例中并非所愿。四条赋值语句(LET)为仿真提供数据。这四个值本可直接写入程序;然而,更可取的做法是把它们放在程序顶部的安培变量中,以便于更方便地修改,或者把模型改为从数据文件读取它们。
为确保模型数据正确,也为了管理所仿真的不同方案,把输入数据回显出来是一种良好的做法。这通过 PUTPIC(意为「put picture」)控制语句来完成。PUTPIC 之后的五行提供格式信息,其中的星号是标记(称为图片格式),PUTPIC 执行时四个安培变量的取值就替换掉这些星号。因此,「**.**」表示该值在小数点后可有两位数字、小数点前最多可有两位数字。
| 平均到达间隔时间 | 4.50 分钟 |
|---|---|
| 平均服务时间 | 3.20 分钟 |
| 服务时间的标准差 | 0.60 分钟 |
| 要服务的顾客数 | 1000 |
| 服务台利用率 | 0.676 |
| 排队线最大长度 | 7 |
| 平均响应时间 | 6.33 分钟 |
| 在系统中停留四分钟及以上者所占比例 | 0.646 |
| 仿真运行长度 | 4767.27 分钟 |
| 离开次数 | 1000 |
图 12 单服务台队列仿真的定制 GPSS/H 输出报告。
START 控制语句控制仿真的执行。它启动仿真,建立一个初始值为其操作数(&LIMIT)的「待终止计数」(termination-to-go),并控制仿真的长度。
仿真完成后,用第二条 PUTPIC 控制语句把所需的输出数据写入同一个文件 OUT。所打印的统计量全部由 GPSS 自动收集。括号列表中的第一项输出是服务台利用率。FR(CHECKOUT)/1000 表示打印资源 CHECKOUT 的小数形式的利用率。由于 FR(CHECKOUT) 的单位是千分数,因此提供分母用以计算小数形式的利用率。QM(LINE) 是仿真期间队列 LINE 中的最大值。QT(SYSTIME) 是在队列 SYSTIME 中的平均时间。&COUNT/N(TER) 是响应时间为四分钟及以上的顾客数除以经过标号为 TER 的模块的顾客数,即 N(TER)。AC1 是时钟时间,其最后一个值给出仿真的长度。
定制输出文件 OUT 的内容见图 12。标准 GPSS/H 输出文件见图 13。虽然文件 OUT 中所示的许多相同数据也可以在标准 GPSS/H 输出中找到,但定制文件更为紧凑,并且使用的是问题的语言而非 GPSS 的行话。定制输出文件还有很多其他用处。例如,若要对模型做 50 次重复实验,并希望得到某个响应时间的最小值、最大值和平均值,那么用控制语句即可做到,结果形式非常紧凑,而不必从 50 个标准输出文件中提取所需数值。
6 用 SSF 进行仿真
可扩展仿真框架(Scalable Simulation Framework, SSF)是一个应用程序接口(Application Program Interface, API),它描述了一组面向对象、面向过程视角仿真的能力。该 API 十分稀疏,其设计目的是让各种实现能够达到高性能(例如在并行计算机上)。C++ 与 Java 都有 SSF API 的实现,两种语言中也都有相应的实现。SSF 拥有广泛的用户群——尤其是借助附加框架 SSFNet(www.ssfnet.org)进行网络仿真的用户。本书关于网络仿真的一章就使用了 SSFNet。
| BLOCK CURRENT | TOTAL | BLOCK | CURRENT | TOTAL | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1003 | TER | 1000 | |||||||
| 2 | 1003 | |||||||||
| 3 | 3 | 1003 | ||||||||
| 4 | 1000 | |||||||||
| 5 | 1000 | |||||||||
| 6 | 1000 | |||||||||
| 7 | 1000 | |||||||||
| 8 | 1000 | |||||||||
| 9 | 1000 | |||||||||
| 10 | 646 | |||||||||
| –AVG-UTIL-DURING– | ||||||||||
| FACILITY | TOTAL | AVAIL | UNAVL | ENTRIES | AVERAGE | CURRENT | PERCENT | SEIZING | PREEMPTING | |
| TIME | TIME | TIME | TIME/XACT | STATUS | AVAIL | XACT | XACT | |||
| CHECKOUT | 0.676 | 1000 | 3.224 | AVAIL | ||||||
| QUEUE | MAXIMUM | AVERAGE | TOTAL | ZERO | PERCENT | AVERAGE | $ AVERAGE | QTABLE | CURRENT | |
| CONTENTS | CONTENTS | ENTRIES | ENTRIES | ZEROS | TIME/UNIT | TIME/UNIT | NUMBER | CONTENTS | ||
| SYSTIME | 8 | 1.331 | 1003 | 0 | 6.325 | 6.235 | 3 | |||
| LINE | 7 | 0.655 | 1003 | 334 | 33.3 | 3.111 | 4.665 | 3 | ||
| RANDOM | ANTITHETIC | INITIAL | CURRENT | SAMPLE | CHI-SQUARE | |||||
| STREAM | VARIATES | POSITION | POSITION | COUNT | UNIFORMITY | |||||
| 1 | OFF | 100000 | 103004 | 3004 | 0.83 |
图 13 单服务台队列仿真的标准 GPSS/H 输出报告。
SSF API 定义了五个基类。process 是一个实现控制线程的类;其派生类的 action 方法包含线程的执行体。Entity 类用于描述仿真对象,它包含状态变量、进程以及通信端点。inChannel 与 outChannel 类是通信端点。Event 类定义实体之间发送的消息。一个模型实体通过把一个 Event「写入」某个 outChannel 与另一个实体通信;在稍后的某个时刻,该事件会在一个或多个 inChannel 上可用。期待从某个 inChannel 获得输入的进程可以挂起,等待其上的事件。下面我们在实现单服务台队列的 SSF 模型的过程中,会对这些要点以及其他要点逐一展开。
图 14 中的源代码表达了单服务台队列示例中用 SSF 生成到达的逻辑。该示例建立在两个 SSF 进程之上:其中一个生成作业并把它们加入系统,另一个为排入队列的作业提供服务。类 SSQueue 是一个包含整个仿真实验的类。它使用辅助类 Random(用于随机数生成)和 Queue(以实现一般对象的 FIFO 排队)。SSQueue 定义了实验常量(「public static final」类型),并包含 SSF 通信端点 out 与 in,两个进程通过它们相互通信。SSQueue 还定义了一个内部类 arrival,用于存储每个作业的标识与到达时间。
类 Arrivals 是一个 SSF 进程。它的构造函数存储拥有它的实体的标识,并创建一个以传入种子初始化的随机数发生器。除首次调用之外,方法 action 生成并入队一个新的到达者,然后(通过 SSF 方法 waitFor)阻塞一个到达间隔时间;在首次调用时,它跳过作业生成这一步,阻塞一个初始到达间隔时间。对 waitFor 的调用突出了若干需要解释的细节。SSQueue 对象调用 Arrival 的构造函数,并被保存为「所有者」。该类包含一个辅助方法 exponential,它使用指定的随机数流、按规定均值对指数随机变量进行抽样。它还包含方法 d2t 与 t2d,用在基于离散的「节拍」(tick)的整数时钟与双精度浮点表示之间作转换。在 waitFor 调用中,我们使用前面见过的相同代码以双精度格式对指数分布抽样,然后用 d2t 把它转换成仿真器的整数时钟格式。具体的换算因子作为一个 SSQueue 常量列出,即每单位时间 个节拍。
在本例中,SSF 的进程间通信用得很少。由于服务是不可抢占的,当一个作业的服务完成时,提供服务的进程可以检查等待顾客的列表(位于变量 owner.Waiting 中),看是否需要为另一位顾客提供服务。因此,服务台进程唯一需要被告知「有作业在等待」的时刻,就是有作业到达一个空系统的时候。这一点体现在 Arrivals.action 对其所有者 out 通道的使用上。
最后一点值得关注的是,按 SSF 的术语,Arrivals 是一个「简单」过程。这意味着在 action 中任何可能挂起进程的语句,在正常执行语义下都将是最后一条被执行的语句。Arrivals 类通过重写一个默认方法 isSimple 使其返回 true(而非默认值 false),从而告诉 SSF 它是一个简单过程。使用简单过程的关键理由是性能——它们不需要保存任何状态,只需要保存「该进程应当被重新激活」的条件。而且,当它被重新激活时,从 action 的第一行开始执行。
图 14 作业到达过程的 SSF 模型。
图 15 给出 Server 进程的代码。与过程 Arrival 一样,它的构造函数由 SSQueue 的一个实例调用,并被告知该实例的标识和一个随机数种子。与 Arrival 一样,它也是一个简单过程。它维护状态变量 in_service 以记住正在服务的作业的细节,并维护状态变量 service_time 以记住为正在服务的作业抽样得到的服务时间取值。当 SSF 内核调用 action 时,要么有一个作业完成了服务,要么 Arrival 进程刚刚通过 inChannel 向 Server 发出了信号。我们通过查看变量 in_service 来区分这两种情形:若有一个作业刚刚完成服务而仍在服务中,该变量就非空。在这种情况下,要更新一些统计量。这项任务完成后,就要检查是否有顾客在等待服务。等待列表中的第一位顾客被出队,并被复制到 in_service 变量中;随后该进程抽样一个服务时间,并通过 waitFor 调用挂起。若没有顾客在等待,该进程就挂起在一条 waitOn 语句上,直到来自 Arrival 进程的事件把它唤醒。
图 15 单服务台队列的 SSF 模型:Server。
SSF 弥合了纯用 Java 开发的模型与用专为仿真设计的语言开发的模型之间的鸿沟。它提供了通用程序设计语言所具有的灵活性,同时又具备仿真所必需的支持。
7 仿真环境
以下各小节所介绍的所有仿真软件包都在运行 Microsoft Windows 2000 或 XP 的 PC 上运行,多数也可在 Vista 下运行。虽然就具体细节而言各软件包彼此不同,但总体而言它们有许多共同之处。
共同特征包括图形用户界面、动画,以及自动收集的用于度量系统性能的输出。在几乎所有软件包中,仿真结果都可以以表格或图形形式显示于标准报告中,也可以在仿真运行期间以交互方式显示。不同方案的输出可以图形方式或表格方式加以比较。多数软件包提供统计分析,其中包括针对性能度量与性能比较的置信区间,以及其他各种分析方法。其中一些统计分析模块将在第 8 节中介绍。
此处介绍的所有软件包都采用过程交互世界观。有少数还允许事件调度模型以及离散-连续混合模型。在动画方面,有些强调二维或三维的比例图;另一些强调基于示意图或过程流程图的图标式动画。有少数同时提供比例图和示意图式的动画。几乎所有软件包都以时间线、条形图和饼图的形式提供动态商务图表。
除本章所含信息之外,下面给出的网址也可以进一步查看:
AnyLogic www.anylogic.com
Arena www.arenasimulation.com
AutoMod www.automod.com
Enterprise Dynamics www.incontrol.ne
ExtendSim www.extendsim.com
Flexsim www.flexsim.com
ProModel www.promodel.com
SIMUL8 www.simul8.com
7.1 AnyLogic
AnyLogic 是一种多方法仿真软件,支持离散事件(以过程为中心)建模、基于智能体的建模以及系统动力学。AnyLogic 背后的主要思想是:建模者可以选择最适合问题的方法(或者也许是方法的组合)与抽象层次,从而捕捉制造、物流、业务流程、人力资源或客户行为的复杂性与异质性,以及经济与社会系统的宏观层次动态及它们之间的相互作用。
AnyLogic 包含一个用于过程建模的对象库(Source、Delay、Queue、Resource-Pool 等),支持智能体的空间、移动性、网络、交互以及各种行为定义形式,并为系统动力学模型提供存量-流量图。AnyLogic 仿真引擎支持混合(离散加连续)时间。
AnyLogic 模型(以及模型开发环境)基于 Java,因而是跨平台的。模型可以作为 Java 小程序(applet)发布到 Web 上,使远端用户能够在自己的浏览器中执行它们。模型有许多「扩展点」,用户可以在其中输入 Java 表达式与动作。
动画编辑器是 AnyLogic 模型开发环境的一部分。该编辑器支持大量多种图形形状、控件(滑块、按钮、文本输入框等)、图像、GIS(地理信息系统)地图以及导入的 CAD 图形。可以开发可缩放的、可分层的动画。例如,用户可以创建一个带某些汇总指标的制造流程全局视图,以及特定作业的详细动画,并在这些视图之间切换。
模型的输入数据可以用分布拟合软件 Stat::Fit(www.geerms.com)处理,该软件支持 AnyLogic 的概率分布语法。仿真输出可以在模型内部作统计处理与可视化(提供多种图表与直方图),也可以导出到数据库、文本文件或电子表格中。
AnyLogic 的实验框架包括简单仿真、参数变化、比较运行、敏感性分析、蒙特卡罗(Monte Carlo)、校准(calibration)、优化以及自由形式的自定义实验。OptQuest 优化引擎(见 8.2 节)已完全集成到 AnyLogic 中。
AnyLogic 有两个版本:Advanced 与 Professional。Professional 版允许用户把模型导出为独立的 Java 应用程序、嵌入 GIS 地图与 CAD 图形;它与版本控制软件集成以改善团队协作,包含功能完备的调试器,并允许用户在仿真运行期间保存模型状态并在稍后恢复。它还包含 Pedestrian Library,用于对行人密集区域进行高精度的物理层次建模。
7.2 Arena
Arena Basic 版与 Professional 版由 Rockwell Automation 提供。Arena 是一种可用于仿真离散系统与连续系统的通用仿真软件。
Arena Basic Edition 面向业务流程建模以及满足高层分析需要的其他系统。它用层次化流程图表示过程动态,并把系统信息存储在数据电子表格中。它内含基于活动的成本核算,并与流程图软件 Visio 紧密集成。
Arena Professional Edition(PE)用于构建更为细致的离散与连续系统模型。Arena PE 于 1993 年首次发布,采用基于对象的设计,实现完全图形化的模型开发。仿真模型由称为模块(modules)的图形对象构成,用以定义系统逻辑以及机器、操作员、职员或医生等物理构件。模块由图标加上在对话框窗口中输入的关联数据来表示。这些图标被连接起来以表示实体的流动。模块被组织成称为模板(templates)的集合。模板是提供通用特性、可用于各类应用建模的核心模块集合。除了资源、队列、过程逻辑和系统数据等标准特性之外,Arena 的模板还包含专注于制造、物料搬运和流程式系统之特定方面的模块。借助内建的连续建模能力和专用的流程模板,Arena PE 也可用于建模离散/连续组合系统,例如制药与化工生产。这一版本还赋予用户定制仿真对象的能力,这些对象可映射真实系统的各个组成部分,包括术语、过程逻辑、数据、性能指标与动画。
Arena 家族还包括专门用于建模呼叫中心与高速生产线的产品,即 Arena Contact Center 与 Arena Packaging Edition。这些产品可与 Professional Edition 配合使用。
Arena 的核心是 SIMAN 仿真语言。Arena 的开放架构(包括内嵌的 Visual Basic for Applications(VBA))使它既能与其它应用程序交换数据,也便于开发定制接口。为了给仿真模型制作动画,Arena 的核心建模构件配有显示队列、资源状态和实体流动的标准图形。Arena 的二维动画使用 Arena 内建的绘图工具,并结合剪贴画、AutoCAD、Visio 以及其他图形来制作。Arena 3DPlayer 可用于生成三维图像,以观看 Arena 模型的三维动画。
Arena 的 Input Analyzer 自动化了为已有数据(如处理时间与到达间隔时间)选择适当分布及其参数的过程。OptQuest 优化引擎(第 8.2 节)已完全集成到 Arena 中。Output Analyzer 与 Process Analyzer(第 8.2 节)则自动化了对不同设计备选方案的比较。
7.3 AutoMod
AutoMod Product Suite 由 Applied Materials 提供。它包括 AutoMod 仿真软件包、用于实验与分析的 AutoStat,以及用于制作三维动画 AVI 影片的 AutoView。AutoMod 仿真产品的主要着眼点是制造系统与物料搬运系统。AutoMod 的长处在于用于规划、运行决策支持与控制系统测试的详尽大型模型。
AutoMod 为大多数常见的物料搬运系统内建了模板,包括车辆系统、输送带、自动化存储与检索系统(AS/RS)、桥式起重机、动力式与自由式输送带,以及运动学(机器人)系统。它还包含一个功能强大的模型通信模块,使模型能够与控制系统以及其他仿真模型进行通信。
AutoMod 的 pathmover 车辆系统可用于建模叉车、步行或推车的人、自动导引车、牵引车、列车、空中运输车辆、单轨、卡车与小汽车。所有移动模板都基于三维比例图(绘制而成,或从 CAD 以二维或三维形式导入)。模板的所有构件都高度参数化。例如,输送带模板包含输送带段、驱动各段的电机、用于装载或卸载的站点,以及光电传感器(photo-eyes)。各段由长度、宽度、速度、加速度以及类型(积放式或非积放式)定义,另有其他专用参数。当产品由输送带系统运送时,产品(负载)的尺寸以及各输送带段的属性都得到精确计量,从而为极为精确的仿真结果提供了工具。
除物料搬运模板之外,AutoMod 还包含一门完整的仿真程序设计语言。一个 AutoMod 模型由一个或多个系统组成。系统可以是流程系统(在其中定义流动与控制逻辑),也可以是移动系统(基于某个物料搬运模板)。一个模型可以包含任意数量的系统(没有规模限制),这些系统可被保存并作为对象在别的模型中复用。流程中可以包含复杂逻辑,用于控制制造材料(负载)或控制消息的流动。由负载执行的过程逻辑,可以简单也可以复杂,视实现期望的仿真行为而定。其三维动画可以从任何角度或透视实时观看,也可以按加速的时间尺度观看。用户可以自由地对仿真模型的三维世界进行缩放、平移或旋转。
在 AutoMod 的世界观中,负载(产品、零件等)从一个流程移动到另一个流程,并竞争资源(设备、操作员、车辆、输送带空间以及队列)。负载是主动实体,在每个流程中执行动作语句。负载可以直接从流程发送到流程,也可以借助输送带或车辆移动系统来发送。
第 8.2 节介绍的 AutoStat 与 AutoMod 模型配合工作,为用户提供一个完整的环境,以定义方案、确定预热期、开展包括实验设计在内的实验,并进行分析。它还提供基于进化策略的优化。
7.4 Enterprise Dynamics
Enterprise Dynamics 是由 Incontrol Simulation Software, Inc. 提供的一个仿真平台。Enterprise Dynamics 是一个面向对象、采用事件调度的离散事件仿真器,拥有自己的内建函数式仿真程序设计语言 4DScript。Enterprise Dynamics 随附一个 Atoms 库,可在核心应用领域(制造与物料搬运系统、物流与运输)中快速建模。另有一套独立的 Atoms 与应用,可用于构建机场仿真器,其中包括行李与旅客流。
Enterprise Dynamics 拥有一个基于 OpenGL 的三维可视化引擎,以「虚拟现实」方式提供三维可视化。三维可视化在仿真阶段与建模阶段都可以查看。
当工厂提供的 Atom 库不足以满足特定建模需求时,可以在其仿真语言 4DScript 中,用一千五百多个可用函数定制模型外观与行为的其他方面。模型代码可以「即时」修改,无需重新编译或停止仿真。其他旨在支持模型开发的平台特性包括:CAD 图形导入向导;数据库接口(既有 ODBC 也有 ADO),以便把较大模型的结构与数据存储在 RDBMS(SQL Server、Oracle、MySQL、Access)中;XML 支持,以便与其他系统交换信息;以及 ActiveX 接口,它使用户能够利用 Enterprise Dynamics 的仿真引擎(在幕后不可见)开发定制的仿真解决方案。
Enterprise Dynamics 中较新的一个附加组件是 Emulation 插件,它允许生产系统的仿真模型与管理该系统的物流软件之间建立接口。这样,用户就可以在实际硬件到位之前先行测试物流软件。该模拟接口有多个层次可选,从用于测试 PLC 电路的直接 PLC 通信(使用 OPC),一直到与物流软件的高层接口。
如有必要,结果可导出到 MS Office 应用程序以供进一步分析。OptQuest 优化引擎(见第 8.2 节)已完全集成到 Enterprise Dynamics 中。
7.5 ExtendSim
ExtendSim 产品系列由 Imagine That Inc. 提供 [Krahl, 2008]。ExtendSim OR 用于仿真离散事件系统与离散-连续混合系统。ExtendSim AT 增加了用于基于速率的批处理系统的离散速率模块,ExtendSim Suite 则增加了三维动画。
ExtendSim CP 仅用于连续建模。ExtendSim 把拖放式用户界面与用于创建自定义构件的开发环境结合起来。称为模块(blocks)的图形对象既表示逻辑要素,也表示物理要素。模型可以通过放置并连接模块以图形方式构建,然后在模块的对话框中输入参数。模型也可以利用 ExtendSim 的脚本功能以程序方式创建。
每个 ExtendSim 模块都带有图标、用户界面、动画、预编译代码和在线帮助。基本模块包括 Create、Queue、Activity、Resource Pool 和 Exit。在 ExtendSim 中被称为 items(项)的主动实体,产生于 Create 模块,并通过 item 连接器从一个模块移动到另一个模块。独立的价值连接器(value connectors)允许把一个计算式挂接到模块参数上,或为报告目的而提取统计信息。输入参数可以在模型运行期间以交互方式更改,可以来自内部或外部来源。输出以图形和表格形式动态显示。模块被统一组织成通用构件库,以及面向特定应用(如高速包装线和化工生产)的专用库。第三方开发者已为垂直市场创建了 ExtendSim 库,其中包括供应链动态、通信系统以及纸浆与造纸加工。
ExtendSim 提供方块图的图标式过程流程动画。Suite 产品包含的三维动画独立于逻辑仿真模型但与之集成:三维动画可以并行运行,也可以被缓冲。代表子模型(例如一条分装线或一个功能流程)的模块集合,可以在模型工作表上组合为一个分层模块。ExtendSim 支持多层次的层次结构,分层模块可存入库中以供复用。关键参数的克隆可以组合起来并显示在工作表层面,供用户访问模型仪表板。ExtendSim 还支持基于智能体的建模、基于活动的成本核算,以及带置信区间的输出数据统计分析。ExtendSim 包含一个进化优化器以及一个集成的关系数据库。模块参数与数据表可与 ExtendSim 数据库表动态链接,以实现集中式数据管理。
ExtendSim 支持 Microsoft 组件对象模型(COM/ActiveX)、开放数据库互连(ODBC)以及文件传输协议(FTP),以进行互联网数据交换。新模块既可以分层方式创建,也可以使用基于 C 的编译型程序设计环境来创建。其基于消息的语言包含仿真专用函数与定制接口开发工具。ExtendSim 具有开放的架构——为模块修改与定制开发提供源代码。该架构还支持链接并使用以外部语言编写的代码与例程。
7.6 Flexsim
Flexsim 仿真软件由犹他州 Orem 的 Flexsim Software Products, Inc. 开发并拥有 [Nordgren, 2003]。Flexsim 是一个用 C++ 开发、采用 Open GL 技术的离散事件、面向对象仿真器。动画以三维并以虚拟现实方式呈现。所有视图在模型开发阶段或运行阶段都可以同时显示。Flexsim 把 Microsoft 的 Visual C++ IDE 与编译器集成到一个图形化的三维拖放式仿真环境中。
2007 年,Flexsim 推出了自己的预编译语言 Flexscript,允许在模型运行之前无须编译即可编程。目前 Flexsim 同时提供 Flexscript 与 C++ 两种语言用于建模复杂算法。任何流动系统或流程的仿真模型都可以在 Flexsim 中通过使用拖放式建模对象来创建。Flexsim 提供了按特定需求定制对象的能力。用户可以把修改过的对象加入自己的用户库,该库可以保存并在组织内共享。稳健的默认值使建模者能够迅速让模型运行起来。Flexsim 为离散事件、连续以及基于智能体的建模提供对象库。
2008 年,Flexsim 推出了离散事件仿真(DS)软件,用于在计算机网络或互联网上运行大型模型,模型的处理可分布在任意数量的处理器上。Flexsim DS 可用于借助数百台互联计算机建模大型复杂系统。Flexsim DS 允许多用户协作建模。建模团队可以通过互联网从远程位置协同工作,共同构建模型、分析结果并开展实验。Flexsim DS 支持模型的演进与协作设计,全部在虚拟现实环境中进行。
7.7 ProModel
ProModel 由成立于 1988 年的 ProModel Corporation 提供。它是一款仿真与动画工具,主要为建模制造系统而设计。虽然 ProModel 可以而且常常被用于对非制造系统建模,该公司还提供面向医疗仿真(MedModel)与服务系统仿真(ServiceModel)的类似产品。
ProModel 是 Microsoft Gold Certified Partner,并提供一个名为 Process Simulator 的 Microsoft Visio 插件,用于对任何行业的流程图、价值流图与设施布局进行仿真。它还提供一个 Microsoft Project 插件,用于对各种类型的项目建模,这些项目可能具有可变任务时间与共享资源。
除了提供面向广泛流程与项目的建模方案之外,ProModel 还提供若干针对特定类型规划问题的专门仿真产品。其中包括 Emergency Department Simulator(EDS),用于确定急诊室的资源需求并分析病人流;以及 Portfolio Simulator,用于可视化、分析和优化产品与项目组合。另有更多产品已经开发出来,并成功应用于美国国防部的资源产能规划。
ProModel 提供二维与三维动画,以及在仿真期间更新的动态图表与计数器。动画布局在模型开发过程中自动生成,使用来自预定义库的图形或由用户导入的图形。
模型使用图形用户界面与建模构件构建。ProModel 的能力包括用于对操作员、叉车、输送带、起重机、自动导引车系统以及泵与储罐建模的构件。ProModel 根据用户输入的材料、人工和设备成本自动跟踪成本数据。
ProModel 与 Microsoft Excel 及其他商用数据库程序接口,以开发集成化解决方案。它还提供 COM 接口用于定制并与其他应用建立连接。ProModel 支持协作建模,模型可以分别构建与维护,并在需要时协同运行。
除生成标准与定制输出报告之外,ProModel 还把数据导出到 Excel 以供更深入的分析,也导出到 Minitab 以自动生成六西格玛六联图(six-sigma six-pack charts)和过程能力图。ProModel 的运行时界面允许用户定义多个方案用于实验和并排比较。第 8.2 节讨论的 SimRunner 增加了执行仿真优化的能力。它基于进化策略算法,是遗传算法方法的一个变种。第 8.2 节讨论的 OptQuest 优化引擎已完全集成到 ProModel 中。
7.8 SIMUL8
SIMUL8 由 SIMUL8 Corporation 提供,最早于 1995 年推出。在 SIMUL8 中,模型是用计算机鼠标画出工作流程而创建的,用图标和箭头表示系统中的资源与队列。图标的所有属性都提供了默认值,因此在建模过程的早期就可以观看动画。在属性框中逐层下钻,可展开越来越详细的属性。SIMUL8 的主要着眼点是服务业,在那里人们处理事务,或者他们本身就是事务(例如在银行、呼叫中心或医院中)。
与其他一些软件包一样,SIMUL8 有「模板」(Templates)和「构件」(Components)的概念。模板(即预建的仿真)聚焦于特定的、反复出现的决策类型,可以快速参数化以适应某家公司的具体问题。构件是用户定义的图标,可以在一家公司的各个仿真中复用与共享。这缩短了构建仿真的时间,标准化了整个公司对某些情形的处理方式,并且往往省去了仿真研究中数据收集阶段的许多工作。
SIMUL8 Corporation 的做法是把仿真广泛地推广到各行各业,而不是把它集中在专职且受过高度训练的仿真专业人员手中。这意味着它们的定价与支持政策大不相同,但这也意味着软件必须包含一些能监视产品使用方式的功能,并在可能进行了无效分析时提供帮助。
SIMUL8 以 XML 格式保存其仿真模型与数据,因而易于与其他应用程序之间互相传输。它有一个用于构建定制数据录入「前端」的接口,并支持 COM/ActiveX,因而外部应用程序可以构建和控制 SIMUL8 仿真。
该产品有一个基于 Web 的版本,任何拥有互联网浏览器的人都可以运行模型,并分为 Standard 与 Professional 两个级别。两个级别提供相同的仿真特性,但 Professional 版增加了三维「虚拟现实」视图、与企业数据库的链接、一个优化器、版本跟踪,以及其他可能只有专职仿真建模者才用得上的特性。
8 实验与统计分析工具
8.1 共同特征
几乎所有仿真软件包都以不同程度支持对仿真输出的统计分析。近年来,许多软件包已把优化作为分析工具之一。为支持分析,多数软件包提供方案定义、运行管理能力,以及向电子表格和其他外部应用程序导出数据的功能。
优化用于寻找「近似最优」的解。用户必须定义一个目标函数或适应度函数,通常是一个成本或类似成本的函数,它综合考虑了额外吞吐量与额外资源之间的权衡。直到不久前,可用于优化系统的方法仍难以应对大多数仿真输出所具有的随机性与非线性。元启发式(metaheuristics)领域中的进展为仿真优化提供了新的途径,这些途径基于人工智能、神经网络、遗传算法、进化策略、禁忌搜索与分散搜索。
8.2 产品
本节简要讨论 Arena 的 Output 与 Process Analyzer、用于 AutoMod 的 AutoStat、OptQuest(在若干仿真产品中使用),以及用于 ProModel 的 SimRunner。
Arena 的 Output 与 Process Analyzer
Arena 随附 Output Analyzer 与 Process Analyzer。此外,Arena 使用 OptQuest 进行优化。
Output Analyzer 提供置信区间、多个系统之间的比较,以及用于减少初始条件偏差的预热期判定。它可生成各种图形、图表与直方图,可对响应做平滑处理,并可进行相关性分析。
Process Analyzer 为 Arena 增加了用于综合性实验设计的复杂方案管理能力。它允许用户定义方案、执行所需的运行并分析结果。它允许任意数量的控制变量与响应变量。响应变量可以在运行完成之后再行添加。它可按任一响应变量对方案排序,并给出响应变量的汇总与统计度量。用户可以查看跨重复实验或跨方案的响应取值的二维与三维图表。
AutoStat
AutoStat 是 AutoMod 产品系列中的运行管理器与统计分析产品。AutoStat 提供多种分析,包括用于稳态分析的预热期判定、绝对置信区间与比较置信区间、实验设计、敏感性分析,以及通过进化策略实现的优化。
借助 AutoStat,终端用户可以通过定义因子及其取值范围来定义任意数量的方案。因子包括模型输入参数,例如资源产能、车辆数量或车辆速度。数据文件(可以是某个特定的单元格,也可以是整个文件)同样可以定义为输入因子。通过允许把数据文件用作因子,用户可以针对例如备选生产计划、不同日期的客户订单、不同排班表,或任何其他通常在数据文件中指定的数值输入开展实验。任何标准输出或定制输出都可以指定为响应变量。对于每一个已定义的响应变量,AutoStat 计算描述性统计量(平均值、标准差、最小值与最大值)以及置信区间。由于 AutoStat 会保存并压缩所有运行的标准输出与定制输出,因此在运行完成之后还可以定义新的响应变量。为进行图形比较,还提供了各种图表与图形。
AutoStat 帮助判定哪些结果与哪些备选方案在统计上显著,也就是说,所观察到的结果极有可能并非由随机波动所引起。AutoStat 支持使用公共随机数的相关抽样(correlated sampling)。这种抽样技术把配对样本之间的变异降到最低,从而更好地反映模型变动的真实影响。
AutoStat 能够把仿真运行分布到局域网上,并把所有结果取回用户的计算机。对多台计算机与多个 CPU 的支持,使用户能够通过利用非工作时间的空闲计算机,完成远超常规可能的仿真运行次数。这在多因子分析与优化研究中尤其有用,因为这两类研究都可能需要大量的运行次数。AutoStat 还具有诊断能力,能自动检测「异常」运行,而「异常」的定义由用户确定。
AutoStat 还可与 AutoSched AP 配合使用,后者是半导体行业有限产能排程的基于规则的仿真软件包。
OptQuest
OptQuest 由科罗拉多大学的 Fred Glover、James Kelly 和 Manuel Laguna 开发,他们是 OptTek Systems, Inc. 的联合创始人 [April et al., 2003]。OptQuest 基于多种方法的组合:分散搜索、禁忌搜索、线性/整数规划以及数据挖掘(含神经网络)。分散搜索是一种基于种群的方法,把已有的解组合起来产生新的解。禁忌搜索是一种自适应记忆搜索方法,叠加其上可使方法远离过去的解而奔向更好的解;数据挖掘则进一步筛除那些可能较差的解。这些方法的组合使搜索过程能够摆脱局部最优,以追求最佳解。OptTek 的方法具有以下若干特性:
- 能够处理标准数学规划公式所用的各类方程与公式无法刻画的非线性与不连续关系;
- 能够处理多种类型的约束(线性的与非线性);
- 能够处理多个目标;
- 能够构造解的有效前沿,以支持决策分析;
- 能够求解涉及不确定的供应、需求、价格、成本、流量与排队速率的问题。
OptQuest 的核心技术已被嵌入众多基于仿真的应用中,范围从项目组合管理(Project Portfolio Management)到劳动力优化(Workforce Optimization)。
SimRunner
SimRunner 由 PROMODEL Corporation 依据 Mississippi State University 的 Royce Bowden 关于仿真优化的研究成果开发 [Harrell et al., 2003]。它可用于 ProModel、MedModel 与 ServiceModel。
SimRunner 使用遗传算法与进化策略,它们都是进化算法(evolutionary algorithms)的变种。进化算法以这样的方式操作问题的解种群:劣解逐渐消亡,优解则持续向最优解演化。这些基于种群的直接搜索技术能够避免陷入局部最优解。进化算法已被证明是稳健的:它们已被成功用于求解大量各类困难的真实世界问题,这些问题是非线性的、多峰式的、多维的、不连续的以及随机的。
在 SimRunner 中调用进化算法之前,用户首先要指定由 ProModel 宏构成的输入因子(整数或实值决策变量),然后指定由仿真输出响应构成的目标函数。SimRunner 在用户所规定的约束内操作这些输入因子,力求使目标函数最小化、最大化,或达到用户指定的目标值。优化输出报告包含在优化过程中对每个所求值解的、目标函数均值的置信区间,并显示所求值解的仿真输出响应面的三维图。解可以按目标函数值(默认方式)、按用于定义目标函数的各个仿真输出响应,或按任一决策变量来排序。
除了多变量优化模块之外,SimRunner 还提供若干模块,帮助用户估计稳态仿真的预热阶段(初始化偏差)的结束点,以及为了在给定的百分比误差与置信水平内得到目标函数均值的估计值所需的重复实验次数。这两个模块对于获得目标函数均值的准确估计很有价值,而准确的估计是成功决策与仿真优化所必需的。
参考文献
APRIL, J., F. GLOVER, J. P. KELLY, AND M. LAGUNA [2003], “Practical Introduction to Simulation Optimization,” Proceedings of the 2003 Winter Simulation Conference, eds. S. Chick, P. J. S´anchez, D. Ferrin, and D. J. Morrice, New Orleans, LA, Dec. 7–10, pp. 71–78.
BANKS, J., J. S. CARSON, AND J. N. SY [1995], Getting Started with GPSS/H, 2d ed., Wolverine Software Corporation, Annandale, VA.
BANKS, J. [1996], “Interpreting Software Checklists,” OR/MS Today, Vol. 22, No. 3, pp. 74–78.
BANKS, J. [2008], “Some burning questions about simulation,” ICS Newsletter, Spring.
COWIE, J. [1999], “Scalable Simulation FrameworkAPI Reference Manual,” www.ssfnet.org/SSFdocs /ssfapiManual.pdf.
HARRELL, C. R., B. K. GHOSH, AND R. BOWDEN [2003], Simulation Using ProModel, 2d ed., New York: McGraw-Hill.
HENRIKSEN, J. O. [1999], “General-Purpose Concurrent and Post-Processed Animation with Proof,” Proceed ings ofthe 1999 Winter Simulation Conference, eds. P. A. Farrington, H. B. Nembhard, D. T. Sturrock, G. W. Evans, Phoenix, AZ, Dec. 5–8, pp. 176–181.
KRAHL, D. [2008], “ExtendSim 7” Proceedings of the 2008 Winter Simulation Conference, eds. S.J. Mason, R.R. Hill, L. M¨onch, O. Rose, T. Jefferson, and J.W. Fowler, Miami, FL, Dec. 7–10 pp. 215–221.
NANCE, R. E. [1995], “Simulation Programming Languages: An Abridged History,” Proceedings ofthe 1995 Winter Simulation Conference, eds. C. Alexopoulos, K. Kang, W. R. Lilegdon, and D. Goldsman, Arlington, VA, Dec. 13–16, pp. 1307–1313.
NORDGREN, W. B. [2003], “Flexsim Simulation Environment,” Proceedings of the 2003 Winter Simulation Conference, eds. S. Chick, P. J. S´anchez, D. Ferrin, and D. J. Morrice, New Orleans, LA, Dec. 7–10, pp. 197–200.
PRITSKER, A. A. B., AND C. D. PEGDEN [1979], Introduction to Simulation and SLAM, John Wiley, New York.
SWAIN, J. J. [2007], “New Frontiers in Simulation: Biennial Survey of Discrete-Event Simulation Software Tools,” OR/MS Today, October, Vol.34, No. 5, pp. 23–43.
TOCHER, D. D., AND D. G. OWEN [1960], “The Automatic Programming of Simulations,” Proceedings of the Second International Conference on Operational Research, eds. J. Banbury and J. Maitland, pp. 50–68.
WILSON, J. R., et al. [1992], “The Winter Simulation Conference: Perspectives of the Founding Fathers,” Proceedings of the 1992 Winter Simulation Conference, eds. J. Swain. D. Goldsman. R. C. Crain, and J. R. Wilson, Arlington, VA, Dec. 13–16, pp.37–62.
习题
对于下面的习题,读者应当用通用程序设计语言(如 C、C++ 或 Java)、专用仿真语言(如 GPSS/H),或任何一种自己中意的仿真环境来编写模型。
大多数题目都包含在区间 上均匀分布的活动。假定 a 与 b 之间的所有取值都是可能的;也就是说,活动时间是连续随机变量。
均匀分布记作 ,其中 a 与 b 是该区间的端点;也记作 其中 m 是均值,h 是该分布的「离散度」(spread)。这四个参数之间的关系由下面的方程给出:
有些可用的均匀随机变量生成器要求指定 a 与 而另一些则要求指定 m 与 h。
有些题目的活动假定为服从正态分布,记作 ,其中 是均值, 是方差。(由于活动时间非负,只有在 时正态分布才是合适的,其中 k 至少为 4,且最好为 5 或更大。若生成了负值,则将其舍弃。)另一些题目采用指数分布,其速率为 λ 或均值为 1/λ。所有这些语言都提供了从这些分布中方便地生成样本的设施。对于 C、C++ 或 Java 仿真,学生可以使用第 4 节给出的、用于从正态分布与指数分布中生成样本的函数。
对收银台的 Java 模型(例 2)作必要的修改,使仿真恰好运行 60 小时。
除了习题 1 中的修改外,还要假定在 60 小时时刻仍在收银台处的顾客都会得到服务,但 60 小时之后不再允许新的到达。对 Java 代码作必要的修改并运行模型。
在任意一种仿真软件包中实现习题 1 与习题 2 中的修改。
在一个大都市地区,救护车以每 15 ± 10 分钟一辆的速率派出。有 15% 的呼叫是误报,完成这些呼叫需要 12 ± 2 分钟。其余所有呼叫可以分为两类。第一类归为严重呼叫,它们占非误报呼叫的 15%,完成需要 25 ± 5 分钟。其余呼叫完成需要 分钟。假定可用的救护车数量非常大,任何时刻都可以有任意数量的救护车在出勤。对该系统进行仿真,直到完成 500 次呼叫。
在习题 4 中,估计救护车完成一次呼叫所需的平均时间。
(a) 在习题 4 中,假定只有一辆救护车可用。救护车外出期间到达的任何呼叫都必须等待。一辆救护车能否应付得了这份工作负荷?(b) 用 x 辆救护车进行仿真,其中 或 4,并从呼叫必须等待的时间长度、必须等待的呼叫所占百分比、以及救护车在出勤状态所占时间百分比这三个方面比较各备选方案。
Drafty Airlines 在 Dusty Plains 机场的登机柜台前有四名工作人员。旅客每 秒到达一次办理登机。为一位旅客办理登机需要 秒。Drafty Airlines 打算用自动旅客登机设备(APCID)替换这些工作人员。一个 APCID 为一位旅客办理登机需要 秒。为了使平均等待时间不大于使用四名工作人员时的当前等待时间,需要多少个 APCID?仿真运行 10 小时的仿真时间。
一条超级高速公路连接着两个大都市地区。车辆每 秒离开第一座城市。20% 的车辆载有 1 名乘客,30% 的车辆载有 2 名乘客,10% 载有 3 名乘客,10% 载有 4 名乘客。其余 30% 的车辆是公共汽车,每辆载有 40 人。车辆在两个大都市地区之间行驶需要 分钟。要让 5000 人到达第二座城市需要多长时间?
人们以每 秒一个的速率到达一个肉类柜台。柜台分为两个区:一个卖牛肉,一个卖鸡肉人们对两者的需求比例如下:只要牛肉的占 50%;只要鸡肉的占 30%;两者都要的占 20%。一名肉贩为一位顾客处理一份订单需要 秒。所有顾客都只下一个订单,只有「牛肉和鸡肉都要」的顾客下两个订单。假定在任何时刻都有足够的肉贩来应付所有在场的顾客。要为 200 位顾客服务完毕需要多长时间?
在习题 9 中,仿真过程中最多需要多少名肉贩?这个数量是否总能保证任何顾客都不必等待?
在习题 9 中,用 x 名肉贩进行仿真,其中 。当所有肉贩都忙碌时,就会形成队伍。对 x 的每个取值,估计忙碌肉贩的平均人数。
一家只有一张椅子的男女通用的理发店,顾客到达速率为每 分钟一位。到达的顾客中有一半只要干剪(dry cut),30% 要做造型,20% 只需修剪(trim)。干剪需 分钟,做造型需 分钟,修剪需 分钟。仿真 400 位顾客经过这家理发店。把各类服务请求的给定比例与仿真结果作比较。结果是否合理?
一座机场有两个航站楼。1 号航站楼的旅客到达速率为每 秒一位,2 号航站楼的旅客到达速率为每 秒一位。走完 1 号航站楼需 秒,走完 2 号航站楼需 秒。两个航站楼都通向紧邻行李提取处的主大厅。从主大厅到行李提取区需 秒。只有 60% 的旅客会前往行李提取区。仿真 500 位旅客通过机场系统的过程。其中有多少位旅客经过了行李提取区?在本问题中,经过行李提取区的期望人数可由 计算得到。仿真估计值与期望人数相差多少?如果确有差异,是什么原因?
在一家多阶段筛查诊所中,病人以每 分钟一个的速率到达,进入听力检查区。检查需 分钟。80% 的病人在下一项检查中没有问题而被通过。其余 20% 中,一半需要简单处置,耗时 分钟,然后以同样的不通过概率送去复检。另一半带着药回家。对该系统进行仿真,以估计筛查并通过 200 位病人需要多长时间。(注意:带药回家的病人不算「通过」。)
考虑一家有四名出纳员的银行。3 号和 4 号出纳员只办理对公账户,1 号和 2 号出纳员只办理对私账户。客户以每 分钟一位的速率到达银行。在客户中,33% 为对公账户。客户在每类账户对应的两名出纳员中随机选择。(假定顾客选择队伍时不考虑其长度,也不换队。)对公业务需 分钟办完,对私业务需 分钟办完。对该系统进行仿真,直到完成 500 笔业务。每类出纳员各自有多高比例的时间处于忙碌状态?每类顾客在银行中花费的平均时间是多少?
重复习题 15,但假定顾客会加入办理其账户类型的那名出纳员中队伍最短的一队。
在习题 15 与习题 16 中,估计对公顾客与对私顾客的平均延迟。(延迟是在排队线中花费的时间,不含服务时间。)还要估计排队线的平均长度,以及延迟超过 1 分钟的顾客所占比例的平均值。
有三台不同的机器可供加工某类特殊零件,每台每天各工作 1 小时。加工时间数据如下:
| 机器 | 加工一个零件所需的时间 |
|---|---|
| 1 | 20 ± 4 秒 |
| 2 | 10 ± 3 秒 |
| 3 | 15 ± 5 秒 |
假定每天的头 3 小时内,零件以每 秒一个的速率由输送带送来。机器 1 在第 1 小时可用,机器 2 在第 2 小时可用,机器 3 在第 3 小时可用。需要多大的存储区来存放等待加工的零件?零件是否会在某个特定时刻「堆积」起来?为什么?
人们以每 30 ± 20 秒一个的速率到达一家自助餐厅。40% 的人去三明治柜台,那里有一名工人用 60 ± 30 秒做一个三明治。其余人去主柜台,那里有一名服务人员用 秒把备好的餐食舀到盘中。所有顾客都须到同一个收银台付款,耗时 秒。对所有顾客而言,用餐需 分钟。餐后,10% 的人回去吃甜点,在餐厅中共额外停留 分钟。仿真直到 100 人离开餐厅。仿真停止时,餐厅里还有多少人,他们在做什么?
三十辆运送 C-5N 货机零配件的卡车同时离开亚特兰大前往萨凡纳港。根据以往经验,已知卡车跑完这一趟需要 小时。40% 的司机会停下来喝咖啡,这需要额外 分钟。(a) 按如下方式建模:对每位司机,都有 40% 的概率停下来喝咖啡。最后一辆卡车何时到达萨凡纳?(b) 建模使得恰好 40% 的司机停下来喝咖啡。最后一辆卡车何时到达萨凡纳?
顾客每 40 ± 35 秒到达 Last National Bank 一次。目前顾客随机选择两名出纳员中的一名。一名出纳员为一位顾客服务需 秒。一旦顾客加入某个队伍,他就一直留在该队伍中,直到业务办完。有些顾客希望银行改用 Lotta Trust Bank 所采用的单一队伍方法。哪种方法对顾客来说更快?先仿真一小时再收集任何汇总统计量,然后仿真一个 8 小时的时段。从出纳员利用率(忙碌时间百分比)、顾客平均延迟、以及必须等待(服务开始之前)超过 1 分钟和超过 3 分钟的顾客所占比例这几个方面,比较这两种排队规则。
Loana Tool Company 出租链锯。顾客以每 30 ± 30 分钟一个的速率到达来租链锯。Dave 与 Betty 处理这些顾客。Dave 出租一把链锯需 14 ± 4 分钟,Betty 需 分钟。归还链锯的顾客与租链锯的顾客服从相同的分布。Dave 与 Betty 花费 2 分钟与顾客一起办理归还链锯的登记。服务按先到先服务进行。当没有顾客在场,或只有 Betty 忙碌时,Dave 就把归还的链锯准备好以便再次出租。对每一把链锯,这项维护与清理分别需要他 分钟和 分钟。每当 Dave 空闲时,他就着手下一项维护或清理。完成一项维护或清理之后,若有一位或更多顾客在等待,Dave 就开始为顾客服务。Betty 随时都可以为顾客服务。仿真该系统的运行:店铺于上午 8:00 从空店开始营业,下午 6:00 关门,并继续把链锯准备好以便再次出租直到下午 7:00。从下午 6:00 到 7:00,Dave 与 Betty 两人都做维护与清理。估计租链锯顾客的平均延迟。
在习题 22 中,修改店铺关于「准备链锯以便再次出租」的维护与清理规则:现在由 Betty 做全部这些工作。完成一把链锯的清理之后,若有队伍在等候,她就帮助 Dave。(也就是说,Dave 与 Betty 都为新顾客服务并办理归还链锯的登记,直到只有 Dave 忙碌,或店铺空闲。)然后她再回到自己的维护与清理工作中。(a) 估计租链锯顾客的平均延迟。以此比较两条店铺规则。(b) 估计必须等待超过 5 分钟的顾客所占比例。以此比较两条店铺规则。(c) 讨论 (a) 与 (b) 两部分中用于比较两条店铺规则的判据的利弊,并提出其他判据。
U of LA(University of Lower Altoona)只有一台供学生使用的彩色打印机。学生每 分钟到达彩色打印机处,使用时间 分钟。若彩色打印机正忙,60% 的人会在 10 分钟后回来再试一次。若彩色打印机仍然忙,则这 60% 中的 50% 会在 15 分钟后回来。与实际完成打印的 500 人相比,有多少学生未能使用彩色打印机?需求与服务全天 24 小时发生。
一座仓库可容纳 1000 立方米的纸箱。这些纸箱有三种尺寸:小(1 立方米)、中(2 立方米)和大(3 立方米)。纸箱的到达速率如下:小箱每 分钟一个,中箱每 15 分钟一个,大箱每 分钟一个。若不移走任何纸箱,用仿真确定填满一座空仓库需要多长时间?
Go Ape! 买了一台 Banana II 计算机来处理其全部的网页浏览需求。上网的员工每 分钟到达一次使用计算机。上网需 分钟。操作这台计算机的猴子每 分钟导致一次系统故障。故障持续 分钟。故障发生时,正在进行的上网作业会从中断处继续处理。对该系统 24 小时的运行情况进行仿真。估计平均系统响应时间。(系统响应时间是从到达直到上网完成所经历的时间长度。)还要估计那些在计算机系统故障发生时正在接受服务的上网员工的平均延迟。
Able、Baker 与 Charlie 是 Sonic Drive-In(以光速服务!)的三名 carhop(小车服务员)。汽车每 分钟到达一辆。carhop 以每 分钟一个的速率为顾客服务。然而顾客更偏爱 Able 而非 Baker,更偏爱 Baker 而非 Charlie。若中意的 carhop 忙碌,顾客就选择第一个空闲的 carhop。对该系统进行仿真,直到完成 1000 次服务。估计 Able、Baker 和 Charlie 的利用率(忙碌时间百分比)。
Jiffy Car Wash 是一道五阶段的作业,每个阶段耗时 2 ± 1 分钟。有 6 个车位可供汽车等待开始洗车。洗车设施可容纳 5 辆汽车,它们按顺序在系统中移动,前面的车不动,后面的车就无法移动。汽车每 分钟到达一辆等待洗车。若汽车无法进入系统,它就穿过街道开到 Speedy Car Wash。估计每小时的中途离去率(balking rate)。也就是说,每小时有多少辆车开走?仿真一个 12 小时的营业日。
工人以每 10 ± 4 分钟一个的速率到达内部供应商店。他们的请领单由三名办事员之一办理;一名办事员处理一张请领单需 分钟。所有请领单随后都交给一名收银员,他每张请领单花费 分钟。对该系统仿真 120 小时。(a) 根据这 120 小时的仿真,估计每名办事员的利用率。(b) 有多少工人被完全服务?三名办事员服务了多少人?共到达了多少工人?三名办事员是否曾经同时忙碌?忙碌办事员的平均人数是多少?
人们以每 4.5 分钟一个的速率到达一家理发店。若店里已满(总共可容纳五人),30% 的潜在顾客离开并在 分钟后回来。其余人离开且不再回来。一名理发师理发需 分钟;第二位很爱讲话,理发需 12 ± 4 分钟。若两名理发师都空闲,顾客偏好第一位理发师。(把试图重新进店的顾客当作新顾客对待。)对该系统进行仿真,直到 300 位顾客理完发。(a) 估计中途离去率,也就是每分钟被劝离的人数。(b) 估计每分钟被劝离且不再回来的人数。(c) 在店内花费的平均时间是多少?(d) 理发本身所花的平均时间是多少(不含延迟)?(e) 店内顾客的平均人数是多少?
人们以每 8 ± 2 分钟一个的速率到达一个显微镜展览。一次只能有一个人参观,参观需 5 ± 2 分钟。一人可以花 $1 购买一张「特权票」(privilege ticket),从而在队伍中优先于那些舍不得花这一块钱的人。约 50% 的参观者愿意这样做,但他们只有在到达时队伍中已有一人或多人时才会作出这一决定。展览从上午 10:00 到下午 4:00 连续开放。对该系统整整一天的运行情况进行仿真。出售特权票共产生多少收入?
有两台机器可供钻孔加工零件(A 型与 B 型)。A 型零件的到达速率为每 分钟一个,B 型零件为每 分钟一个。对于 B 型零件,工人选择一台空闲的机器;若两台钻床(Dewey 与 Truman)都忙碌,则随机选择一台并一直使用它。A 型零件必须尽快钻孔;因此若有机台可用,优先使用 Dewey;若不可用,该零件就排到 Dewey 钻床的队首。所有作业完成需 分钟。对 100 个 A 型零件的完成情况进行仿真。估计等待钻孔的 A 型零件的平均数量。
一个计算中心有两台彩色打印机。学生以每 8 ± 2 分钟一个的速率到达使用彩色打印机。他们可能被打断,打断他们的是教授,教授以每 分钟一个的速率到达。有一名系统分析员可以打断任何人,但学生先于教授被打断。系统分析员使用彩色打印机 分钟,然后隔 分钟回来。教授与学生使用彩色打印机 分钟。若某人被打断,他就排到队首,并尽快恢复服务。对 50 个「教授或分析员」作业进行仿真。估计每小时的打断率,以及学生排队线的平均长度。
零件在钻床上加工。到达速率为每 分钟一个,加工需 分钟。每 分钟会有一个加急作业到达,完成它需 分钟。加急作业会打断任何非加急作业。当常规作业回到机台时,它只保留自己剩余的加工时间。对 10 个加急作业的加工情况进行仿真。估计每类零件的平均系统响应时间。(响应时间是一个零件在系统中所耗费的总时间。)
电子邮件消息以每 秒一个的速率产生,一次传输一条。传输需 秒。每隔 分钟,会有传输时间为 秒的加急电子邮件抢占传输线路。任何正在进行中的电子邮件消息都必须重新处理 2 分钟,才能重新提交传输。重新提交时,它排到队首。仿真 90 分钟。估计线路被普通电子邮件消息占用的时间百分比。
一名工人包装箱子,箱子以每 分钟一个的速率到达。包装一个箱子需 分钟。每小时一次,该工人会中断手头的包装,去包装特制订单,耗时 分钟。完成特制订单后,工人再完成被打断的订单。仿真 40 小时。估计「等待包装的箱子数超过五个」这一状态所占时间的平均比例,以及等待包装的箱子的平均数量。
一位病人以约 分钟的速率到达 Hello Hospital 的急诊室。每位病人将由 Doctor Slipup 或 Doctor Gutcut 之一治疗。20% 的病人被归类为 NIA(需要立即处理),其余为 CW(可以等待)。NIA 病人享有最高优先级(3),尽快见到医生并接受 分钟的治疗,随后其优先级降为 2,他们等待直到有医生空闲,再接受 分钟的进一步治疗,然后出院。CW 病人初始优先级为 1,在轮到他们时接受 分钟的治疗;随后其优先级升为 2,他们再次等待直到有医生空闲,并接受 分钟的最后治疗,然后出院。对连续运行 20 天(每天 24 小时)的系统进行仿真。此前先用 2 天的初始化期来把系统载入病人。报告在 0 天、2 天和 22 天时刻的状态。2 天的初始化期是否足够长,能把系统载入到相当接近稳态的水平?(a) 测量 NIA 病人从到达到首次见到医生这一过程的平均与最大排队长度。有百分之多少完全不必等待?还要列表并绘制 NIA 病人这一初始等待时间的分布。有百分之多少在见到医生之前等待不足 5 分钟?(b) 列表并绘制所有病人在系统中总时间的分布。估计 90% 分位数——也就是说,90% 的病人在系统中停留的时间少于某个量。估计该量。(c) 列表并绘制所有病人从首次治疗结束到出院这段时间在系统中剩余时间的分布。估计 90% 分位数。(注意:大多数仿真软件包都提供了自动列表统计任一指定变量分布的功能。)
人们以均值为 0.5 分钟的指数分布到达间隔时间到达一个报摊。其中 55% 的人只买晨报,25% 的人买晨报加一份《华尔街日报》(Wall Street Journal)。其余的人只买《华尔街日报》。一名售货员负责《华尔街日报》的销售,另一名售货员负责晨报的销售。既买两份的人去找《华尔街日报》的售货员。所有交易的顾客服务时间服从均值为 40 秒、标准差为 4 秒的正态分布。收集各类交易对应队列的统计量。提出使该系统更有效率的办法。仿真 4 小时。
Bernie 改造房屋并加盖房间。完成一项作业所需时间服从均值为 17 个日历日、标准差为 3 天的正态分布。房主签订作业合同的间隔时间服从均值为 20 天的指数分布。Bernie 只有一个班组。估计那些发生等待的作业的平均等待时间(从签订合同到开工)。还要估计班组空闲的时间百分比。仿真直到完成 100 项作业。
零件以随机方式到达一台机器,到达间隔时间服从均值为 60 秒的指数分布。所有零件都需要 5 秒的准备与校准以便加工。零件有三种类型,其比例如下。加工每类零件所需时间服从正态分布,其均值与标准差如下:
| 零件类型 | 百分比 | 均值(秒) | σ(秒) |
|---|---|---|---|
| 1 | 50 | 48 | 8 |
| 2 | 30 | 55 | 9 |
| 3 | 20 | 85 | 12 |
求所有类型零件的加工完成总时间的分布。有多大比例的零件完成加工所需时间超过 60 秒?零件平均需要等待多久?仿真一个 8 小时的班次。
- 经查明,某百货商店的购物时间具有如下分布:
| 购物时间(分钟) | 顾客人数 |
|---|---|
| 0–10 | 90 |
| 10–20 | 120 |
| 20–30 | 270 |
| 30–40 | 145 |
| 40–50 | 88 |
| 50–60 | 28 |
购物之后,顾客从六个收银台中任选一个。结账时间服从均值为 5.1 分钟、标准差为 0.7 分钟的正态分布。到达间隔时间服从均值为 1 分钟的指数分布。为每个收银台收集统计量(包括等待结账的时间)。列表给出完成购物所需时间的分布,以及完成购物与结账全过程所需时间的分布。有多大比例的顾客在商店停留超过 45 分钟?仿真一个 16 小时的营业日。
- 需要加工的零件,其到达间隔时间如下:
| 到达间隔时间(秒) | 比例 |
|---|---|
| 10–20 | 0.20 |
| 20–30 | 0.30 |
| 30–40 | 0.50 |
零件有三种类型:A、B 和 C。各类零件所占比例,以及服从正态分布的加工时间的均值与标准差如下:
| 零件类型 | 比例 | 均值 | 标准差 |
|---|---|---|---|
| A | 0.5 | 30 秒 | 3 秒 |
| B | 0.3 | 40 秒 | 4 秒 |
| C | 0.2 | 50 秒 | 7 秒 |
每台机器一次只能加工一个零件,且可加工任何类型的零件。用仿真比较一台机器与两台机器并行工作,以及两台机器与三台机器并行工作。对于这样的比较,采用什么判据才合适?
- 订单分为四类零件之一下达。订单之间的到达间隔时间服从均值为 10 分钟的指数分布。下表给出各类零件所占比例,以及由唯一一名办事员完成各类订单所需的时间。
| 零件类型 | 百分比 | 服务时间(分钟) |
|---|---|---|
| A | 40 | N(6.1, 1.3) |
| B | 30 | N(9.1, 2.9) |
| C | 20 | N(11.8, 4.1) |
| D | 10 | N(15.1, 4.5) |
A 类与 B 类订单一填好就被取走,而 C 类与 D 类订单必须等 分钟才能取走。列表给出所有订单合并后的完成交付时间分布。有多大比例的时间少于 15 分钟?多大比例少于 25 分钟?先仿真一个 8 小时的初始化期,随后运行 40 小时。8 小时初始化期内收集到的数据不得使用。
三台独立生产小装置(widget)的机器都需要同一种关键零件,该零件需要频繁维护。为了提高产量,决定手头保留两个备用零件(总数为 个零件)。一个零件使用 2 小时后被从机器上拆下,送往一名技术员处,他完成所需维护需 分钟。维护之后,零件被放入备用零件池,供最先需要它的机器使用。这名技术员还有其他职责,即修理其他优先级更高的物件,这些物件每 分钟到达一次,修理需 分钟。此外,技术员在每个 2 小时时段中休息 15 分钟。也就是说,技术员工作 1 小时 45 分钟,休息 15 分钟,再工作 1 小时 45 分钟,休息 15 分钟,如此往复。(a) 该模型的初始条件是什么——也就是说,时刻 0 零件在何处、其状况如何?这些条件是否具有「稳态」的代表性?(b) 令本实验的每次重复实验都由 8 小时的初始化阶段加上 40 小时的数据收集阶段构成。在一次计算机运行中完成本实验的四次统计上独立的重复实验(即做四次运行,每次使用一组不同的随机数)。(c) 估计忙碌机器的平均数量以及技术员忙碌的时间比例。(d) 据估计,每个零件每个 8 小时工作日使公司付出 $50 的成本(无论其实际使用程度如何)。技术员的成本为每小时 $20。一台运转中的机器每小时生产价值 $100 的小装置。推导一个表达式,表示可归属于小装置生产的每小时总成本(也就是说,技术员的时间并非全部用于小装置生产)。根据仿真结果求值该表达式。
Wee Willy Widget Shop 对所有类型的小装置进行翻修与修理。店铺由五个工作站组成,作业在店内的流动如下图所示:

习题 45 图 1 Wee Willy Widget Shop 中作业的流动。
常规作业以每 分钟一个的速率到达 A 站。加急作业每 小时到达一次,并享有更高优先级,但在 C 站例外:在那里它们被放上传送带,与其他所有作业一起送去进行清洗与脱脂作业。作业第一次通过某个工作站时,其加工与修理时间如下:
| 工作站 | 机器或工人数量 | 加工和/或修理时间(分钟) | 说明 |
|---|---|---|---|
| A | 1 | 收货职员 | |
| B | 3 | 拆卸与零件更换 | |
| C | 1 | 20 | 脱脂机 |
| D | 4 | 重新装配与调整 | |
| E | 3 | 包装与发运 |
上表所列时间适用于所有遵循两条路径之一的作业:A B C D E 或 A B D E。然而,从 D 站出来的作业中约有 10% 被退回 B 站作进一步加工(耗时 分钟),然后再送到 D 站,最后送到 E 站。这些作业的路径如下:

习题 45 图 2 退回作业的路径。
每 2 小时一次(从开店后 1 小时开始),脱脂站 C 停机进行例行维护,需 10 ± 1 分钟。不过,这项例行维护要等到当前的工件(若有)完成加工之后才开始。(a) 对该仿真模型作三次统计上独立的重复实验,每次重复实验等于一次 8 小时的仿真运行,之前先作一次 2 小时的初始化运行。这三组输出代表三个典型的日子。主要感兴趣的性能度量是每项作业的平均响应时间,其中响应时间是一项作业在店内所耗费的总时间。上午店里从来不会空,但若不作初始化阶段,模型将是空的。因此,运行模型 2 小时的初始化期,并从 2 小时时刻到 10 小时时刻收集统计量。这段「预热」期会减小平均响应时间估计中的向下偏差。请注意,2 小时的预热是一种手段,用以把仿真模型载入某个比「空」更贴近现实的水平。从三次统计上独立的重复实验中分别得到平均响应时间的一个估计值。同时还要得到一个总体估计,即这三个估计值的样本平均值。
(b) 管理层正在考虑在最忙碌的工作站(A、B、D 或 E)增配一名工人。这会显著改善平均响应时间吗?(c) 作为 (b) 的替代方案,管理层正在考虑用一台只需 14 分钟就能加工一个工件的更快机器替换 C 站机器。这会显著改善平均响应时间吗?
一家建材公司用两台装载机拖拉机为卡车装货。已查明卡车装载时间的分布为指数分布,平均装载时间为 6 分钟。卡车的到达间隔时间服从指数分布,到达速率为每小时 16 辆。一辆卡车及其司机的等待时间估计成本为每小时 $50。如果安装一套高架料斗系统,能以恒定的 2 分钟装满任何一辆卡车,那么该公司每个 10 小时工作日(若确有节省)能节省多少?(假定现有的拖拉机能够并且会充分地为料斗装料的输送机服务。)
一个铣床车间有 10 台机器。机器发生故障前的运行时间服从均值为 20 小时的指数分布。修理时间在 3 至 7 小时之间均匀分布。选择适当的运行长度与适当的初始条件。(a) 需要多少名修理人员,才能保证运行中的机器平均数量大于 8 台?(b) 若有两名修理人员,估计处于运行状态或正在被维修的机器数量。
40 个人要通过一个闸机,通过需 秒。对该系统进行 10 次彼此独立的仿真,确定 40 个人全部通过所花时间的范围与平均值。
人们从当地图书馆借阅《乱世佳人》(Gone with the Wind),借期为 天。图书馆中只有该书的一本副本。你是预约名单上的第六个人(前有五人)。仿真 50 个独立的借阅周期,确定你在 100 天内拿到这本书的概率。
作业每 秒到达一个由四道工序组成的流程:OP10 需 秒,OP20 需 秒,OP30 需 秒,OP40 需 秒。对该流程进行仿真直到完成 250 项作业;然后把作业的四道工序合并为一道,其分布为 秒,再用这一分布仿真该流程。这两种方案下,作业在系统中的平均时间是否发生变化?
两类作业到达同一台机器上进行加工。1 类作业每 秒到达,加工需 秒。2 类作业每 秒到达,加工需 秒。在 8 小时的仿真中,等待加工的作业平均有多少个?
两类作业到达同一台机器上进行加工。1 类作业每 秒到达,加工需 35 ± 20 秒。2 类作业每 秒到达,加工需 20 ± 15 秒。工程部门判断该机台有富余产能。对于该系统 8 小时运行的仿真,求 3 类作业的 X 值:3 类作业每 秒到达,在机台上占用 30 秒,使得等待加工的作业平均数不超过两个。
使用电子表格软件,生成 1000 个均值为 10、离散度为 2 的均匀分布随机值。以 0.5 为区间宽度,在 8 与 12 之间绘制这些值的直方图。所生成的这组值与各区间内的期望数量接近程度如何?
使用电子表格,生成 1000 个均值为 10 的指数分布随机值。所生成这些值的最大值是多少?所生成的值中小于均值 10 的比例是多少?绘制这些值的直方图。[提示:若在你所用的电子表格中找不到指数分布生成器,可使用公式 , 其中 R 是 0 到 1 之间均匀分布的随机数,LOG 是自然对数。]
互联网上有许多「群鸟」(boids)仿真。在互联网上查找两个群鸟仿真的例子。对每一个例子,找出每个群鸟所遵循规则的描述。比较并对照这两组规则。至少要回答下列关于每个模型的问题。(a) 群鸟是在二维还是三维空间中飞行?它们飞行的世界是有边界的还是无边界的?[提示:它们在边缘或墙处转向吗?还是从另一侧重新出现?若是后者,这意味着两个看似边界的地方被粘合在一起,实际上根本不是边界。]描述群鸟飞行所处的世界或宇宙。(b) 该模型是否有用户可调的参数?这些参数可能包括群鸟的数量、接近因子(一个群鸟必须靠近其他群鸟到何种程度才会受其行为影响)、速度等等。列出所有这类参数。(c) 群集行为需要多长时间才会涌现出来?
www.bcnn.net 上提供的资料清单
基于程序设计语言的仿真的基类
5 仿真中的统计模型
在对现实世界现象建模时,很少有情形能够完全预测所研究系统中实体的行为。建模者所看到的世界是概率性的,而不是确定性的。变异的来源有很多。修理人员修复一台故障机器所需的时间,取决于故障的复杂程度、修理人员是否带了合适的替换零件和工具到现场、修理过程中是否有另一位修理人员请求协助、机器操作员是否接受了预防性维护的培训,等等。对建模者而言,这些变异似乎是由偶然因素造成的,无法预测。然而,某个统计模型很可能恰当地描述完成一次修理所需的时间。
通过抽样调查所关注的现象,可以建立适当的模型。随后,建模者凭经验作出合理猜测(或使用专门的软件),选择一个已知的分布形式,对该分布的参数作出估计,再检验所获得的拟合效果究竟如何。通过在选择合适分布形式上的持续努力,所假设的模型可以被接受。
第 1 节回顾概率术语与概念。第 2 节给出统计模型(即分布形式)的一些典型应用。第 3 节和第 4 节讨论若干选定的离散分布和连续分布。所选定的分布是那些能够描述多种多样概率事件的分布。关于本章出现的分布形式,以及提及但未作描述的分布形式,可参阅许多文献 [Devore, 1999; Hines and Montgomery, 1990; Law and Kelton, 2000; Papoulis, 1990; Ross, 2002; Walpole and Myers, 2002]。第 5 节描述泊松过程及其与指数分布的关系。第 6 节讨论经验分布。
1 术语与概念回顾
1.1 离散随机变量
设 X 为随机变量。如果 X 的可能取值个数是有限的,或为可数无穷的,则称 X 为离散随机变量。X 的可能取值可以列为 。在有限的情形下,该列表是有终止的;在可数无穷的情形下,该列表无限延续。
例 1
观测某作业车间每周到达的作业数。所关注的随机变量是 X,其中
X 的可能取值由 X 的值域给出,记作 。此处 设 X 为离散随机变量。对于 中的每一个可能结果 ,数值 给出该随机变量等于 x 的取值的概率。数值 必须满足以下两个条件:
a. ,对所有 i
b.
数对 的集合称为 X 的概率分布(probability distribution),而 称为 X 的概率质量函数(pmf)。
例 2
考虑掷一颗骰子的试验。定义 X 为骰子掷出后朝上那一面上的点数。于是 。假定这颗骰子是灌铅的,即某个面朝上的概率与该面所示的点数成正比。这一随机试验的离散概率分布如下
| 1 | 2 | 3 | 4 | 5 | 6 | |
|---|---|---|---|---|---|---|
| 1/21 | 2/21 | 3/21 | 4/21 | 5/21 | 6/21 |
前面所陈述的条件得到了满足——也就是说,对 有 ,并且 。该分布的图形表示见图 1。

图 1 灌铅骰子示例的概率质量函数。
1.2 连续随机变量
如果随机变量 X 的值域 是一个区间或若干区间的集合,则称 X 为连续随机变量。对于连续随机变量 X,X 落在区间 [a, b] 内的概率由下式给出
函数 称为随机变量 X 的概率密度函数(pdf)。该 pdf 满足以下条件:
a. 对 中的所有 x,
b.
c. 若 x 不在 中,则
由式 (1) 可知,对于任何给定的值 ,因为

图 2 的图解解释。
还意味着下列等式成立:
式 (1) 的图解解释见图 2。阴影部分表示 X 落在区间 [a, b] 内的概率。
例 3
某台用于检查飞机机翼裂纹的设备,其寿命由 X 给出,X 是一个连续随机变量,取遍 范围内的所有值。该设备寿命(以年为单位)的 pdf 如下:
该 pdf 的图形表示见图 3。称随机变量 X 服从均值为 2 年的指数分布。
设备寿命在 2 年到 3 年之间的概率计算如下

图 3 检测设备寿命的 pdf。
1.3 累积分布函数
累积分布函数(cdf)记作 ,它度量随机变量 X 取值小于或等于 x 的概率,即 。
如果 X 是离散的,则
如果 X 是连续的,则
cdf 具有以下一些性质:
a. F 是非减函数。如果 ,则 。
b.
c.
关于 X 的所有概率问题都可以用 cdf 来回答。例如,
对于连续分布,不仅式 (5) 成立,而且式 (2) 中的各概率也都等于 。
例 4
例 2 中所描述的掷骰子试验,其 cdf 如下:
| x | |||||||
|---|---|---|---|---|---|---|---|
| F(x) | 0 | 1/21 | 3/21 | 6/21 | 10/21 | 15/21 | 21/21 |
其中 [a, 。本例的 cdf 图形表示见图 4。
如果 X 是离散随机变量,其可能取值为 ,其中 ,则 cdf 是一个阶梯函数。cdf 的值在区间 上保持常数,然后在 处跳变一步,跃度大小为 。因此,在例 4 中,,即 处台阶的高度。

图 4 灌铅骰子示例的 cdf。
例 5
例 3 中所描述设备的 cdf 为
设备寿命短于 2 年的概率为
设备寿命在 2 年到 3 年之间的概率计算如下
与例 3 中所得结果相同。
1.4 期望
概率论中的一个重要概念是随机变量的期望。若 X 是随机变量,记作 的 X 的期望值,对离散变量和连续变量分别定义如下:
以及
随机变量 X 的期望值 E(X) 也称为均值(mean),或者称为 X 的一阶矩。量 称为 X 的 n 阶矩,计算如下:
以及
记作 V(X) 或 var(X) 或 的随机变量 X 的方差定义为
计算 V(X) 时一个有用的恒等式为
均值 是随机变量集中趋势的度量。X 的方差度量的是随机变量与其均值之差的平方的期望值。因此,方差 是 X 的可能取值围绕均值 的离散程度或变异程度的度量。标准差 σ 定义为方差 的平方根。均值 与标准差 采用相同的单位表示。
例 6
例 2 中所描述的掷骰子试验,其均值和方差计算如下:
要用式 (10) 计算 ,先按式 (8) 计算 :
因此,
以及
例 7
例 3 中所描述设备的寿命,其均值和方差计算如下:
要用式 (10) 计算 ,先按式 (9) 计算 :
因此,
从而
以及
平均寿命为 2 年、标准差为 2 年,大多数分析人员会得出结论:实际寿命 X 具有相当大的变异性。
1.5 众数
众数用于描述本章中出现的若干统计模型。在离散情形下,众数是出现最频繁的随机变量取值。在连续情形下,众数是 pdf 取最大值的那个取值。众数可能不唯一;如果众数取值出现在随机变量的两个取值上,则称该分布是双峰的(bimodal)。
2 常用统计模型
在仿真的实施过程中会出现许多这样的情形:研究人员可能选择引入概率性事件。在排队系统中,到达间隔时间和服务时间常常是概率性的。在库存模型中,需求之间的间隔时间以及提前期(从下单到收到货物之间的时间)都可能是概率性的。在可靠性模型中,故障时间也可能是概率性的。在上述每一种情形下,仿真分析人员都希望生成随机事件,并且如果能够找到潜在的分布,就使用一个已知的统计模型。在下面几段中,将讨论适合这些应用领域的统计模型。此外,还将提及在数据有限的情形下有用的统计模型。
2.1 排队系统
在排队示例中,到达间隔时间模式和服务时间模式,即到达之间的时间和服务时间,常常是概率性的。不过,也可能有恒定的到达间隔时间(例如汽车装配线上以恒定速度移动的生产线),或者恒定的服务时间(例如同一条装配线上的机器人点焊)。下面的例子说明概率性的到达间隔时间可能如何产生。
例 8
如表 1 所示,机械师陆续到达一个集中的工具室。工具室的管理员为机械师办理所请求工具的领用与归还。数据采集从上午 10:00 开始,直到记录到 20 个不同的到达间隔时间为止。与其记录每日的实际时刻,也可以从某个给定的原点计算绝对时间。于是,第一位机械师可能在时刻 到达,第二位在时刻 7:13(7 分 13 秒)到达,依此类推。
表 1 机械师的到达数据
| 到达序号 | 到达时刻(时:分::秒) | 到达间隔时间(分::秒) |
|---|---|---|
| 1 | 10:05::03 | — |
| 2 | 10:12::16 | 7::13 |
| 3 | 10:15::48 | 3::32 |
| 4 | 10:24::27 | 8::39 |
| 5 | 10:32::19 | 7::52 |
| 6 | 10:35::43 | 3::24 |
| 7 | 10:39::51 | 4::08 |
| 8 | 10:40::30 | 0::39 |
| 9 | 10:41::17 | 0::47 |
| 10 | 10:44::12 | 2::55 |
| 11 | 10:45::47 | 1::35 |
| 12 | 10:50::47 | 5::00 |
| 13 | 11:00::05 | 9::18 |
| 14 | 11:04::58 | 4::53 |
| 15 | 11:06::12 | 1::14 |
| 16 | 11:11::23 | 5::11 |
| 17 | 11:16::31 | 5::08 |
| 18 | 11:17::18 | 0::47 |
| 19 | 11:21::26 | 4::08 |
| 20 | 11:24::43 | 3::17 |
| 21 | 11:31::19 | 6::36 |
例 9
呈现到达间隔数据的另一种方式,是求出每个时段内的到达数。这里,此类到达发生在大约 1.5 小时之内;把前 20 位机械师按 10 分钟的时间间隔来考察是方便的。也就是说,在第一个 10 分钟时段内有 1 次到达,发生在 10:05::03。在第二个时段内有 2 位机械师到达,依此类推。结果汇总于表 2。这批数据随后可以绘制成直方图,如图 5 所示。
表 2 各连续时段内的到达数
| 时段 | 到达数 | 时段 | 到达数 |
|---|---|---|---|
| 1 | 1 | 6 | 1 |
| 2 | 2 | 7 | 3 |
| 3 | 1 | 8 | 3 |
| 4 | 3 | 9 | 2 |
| 5 | 4 | — | — |
到达之间时间的分布,以及每个时段内到达数的分布,在排队线系统的仿真中都是重要的。“到达"有多种多样的形式:机器故障、进入作业车间的作业、装配线上组装的单元、发往仓库的订单、到达计算机系统的数据包、打到呼叫中心的电话,等等。
服务时间可以是恒定的,也可以是概率性的。如果服务时间完全随机,为仿真目的通常采用指数分布;不过还存在若干其他可能。服务时间也可能是恒定的,但某种随机波动会以正向或负向的方式引起起伏。例如,车床走完一根 10 厘米轴所需的时间本应总是相同的。然而,材料的硬度可能略有差异,刀具也可能磨损;这两种情况中的任何一种都可能导致不同的加工时间。在这些情况下,正态分布也许能描述服务时间。
当所关注的现象似乎服从正态概率分布、但随机变量却被限制为大于或小于某个特定值时,会出现一种特殊情形。在这种情形下,可以采用截断正态分布。
伽马分布和 Weibull 分布也被用于对到达间隔时间和服务时间建模。(实际上,指数分布是伽马分布和 Weibull 分布二者的特例。)指数分布、伽马分布和 Weibull 分布之间的差别,涉及 pdf 众数的位置,以及它们在时间很大和很小时尾部的形状。指数分布的众数位于原点,而伽马分布和 Weibull 分布的众数位于某一点 ,该点由所选的参数值决定。伽马分布的尾部与指数分布一样长;Weibull 分布的尾部可能比指数分布的尾部下降得更快,也可能更慢。在实践中这意味着:如果实际出现的大服务时间比指数分布所能解释的要多,那么 Weibull 分布可能为这些服务时间提供更好的模型。

图 5 各时段到达数的直方图(横轴:10 分钟时段内的到达数)。
2.2 库存与供应链系统
在现实的库存和供应链系统中,至少存在三个随机变量:(1) 每笔订单或每个时段的需求件数,(2) 两次需求之间的间隔时间,(3) 提前期。(提前期定义为:为补充库存系统而下达订单的时刻与收到该订单的时刻之间的时间。)在非常简单的库存系统数学模型中,需求随时间保持恒定,而提前期为 0 或某个常数。然而,在大多数现实情形中,因而也在仿真模型中,需求在时间上是随机发生的,而且每次需求发生时的需求件数也是随机的,如图 6 所示。
库存理论教材中关于需求和提前期的分布假设,通常是基于数学上的可处理性,但在现实背景下这些假设可能并不成立。在实践中,提前期分布往往可以由伽马分布较好地拟合 [Hadley and Whitin, 1963]。与解析模型不同,仿真模型可以容纳任何看起来最合理的假设。
几何分布、泊松分布和负二项分布提供了能够满足各种需求模式的多种分布形状。几何分布是负二项分布的一个特例,在至少发生过一次需求的前提下,其众数位于 1。如果需求数据以长尾为特征,负二项分布可能是合适的。泊松分布常用于对需求建模,因为它简单、有详尽的表格数据、而且人们非常熟悉。泊松分布的尾部一般比负二项分布的尾部短,这意味着在两种模型具有相同平均需求的前提下,采用泊松模型时出现的大额需求要比采用负二项分布时少。

图 6 随机需求随时间的变化。
2.3 可靠性与可维护性
故障时间已用许多分布来建模,包括指数分布、伽马分布和 Weibull 分布。如果只发生随机故障,故障时间分布可以建模为指数分布。伽马分布源于对备用冗余的建模,其中每个部件的故障时间都服从指数分布。Weibull 分布被广泛用于表示故障时间,其性质使得它可以被调整以逼近许多观察到的现象 [Hines and Montgomery, 1990]。当一个系统中有若干部件,而故障是由于大量缺陷(或潜在缺陷)中最严重的一个所引起时,Weibull 分布似乎特别适合作为模型。在大多数故障源于磨损的情形下,正态分布也许非常合适 [Hines and Montgomery, 1990]。对数正态分布已被发现适用于描述某些类型部件的故障时间。
2.4 数据有限的情形
在许多实例中,仿真在数据收集完成之前就开始了。有三个分布适用于不完整或有限的数据,它们是均匀分布、三角分布和贝塔分布。当已知某个到达间隔时间或服务时间是随机的,但暂时无法获得关于该分布的任何信息时,可以采用均匀分布 [Gordon, 1975]。不过,也有人不赞成使用均匀分布,称它为"最大无知之分布”,因为除了随机变量可能出现的那段连续区间之外,不必再指定任何别的东西。当对随机变量的最小值、最大值和众数作出假设时,可以采用三角分布。最后,贝塔分布在单位区间上提供了多种分布形式,只需适当修改即可将其平移到任意所需的区间。均匀分布是贝塔分布的一个特例。Pegden、Shannon 和 Sadowski [1995] 对有限数据这一主题有较为详细的讨论。
2.5 其他分布
其他若干分布在离散系统仿真中可能是有用的。伯努利分布和二项分布是两种可以描述所关注现象的离散分布。超指数分布与指数分布相似,但它更大的变异性在某些场合可能使之有用。
3 离散分布
离散随机变量用于描述只可能取整数值的随机现象。第 2 节给出了大量例子——例如对库存物品的需求。以下各小节描述四个分布。
3.1 伯努利试验与伯努利分布
考虑一个由 n 次试验构成的试验,每次试验的结果非成功即失败。若第 j 次试验的结果为成功,则令 ;若第 j 次试验的结果为失败,则令 。
如果各次试验相互独立、每次试验只有两种可能结果(成功或失败),且成功的概率在试验之间保持不变,则称这 n 次伯努利试验构成一个伯努利过程。于是,
并且
对于单次试验,式 (11) 给出的分布称为伯努利分布。 的均值和方差计算如下:
以及
3.2 二项分布
表示 n 次伯努利试验中成功次数的随机变量 X 服从二项分布,其概率质量函数为 ,其中
式 (12) 的由来,是通过计算某一种特定结果出现的概率而得到的,即所有成功(各记作 S)出现在前 x 次试验中,随后是 次失败(各记作 F)——也就是说,
其中 。具有所需数目 和 的结果共有
种。于是便得到式 (12)。计算二项分布均值和方差的一种简便方法,是把 X 看作 n 个相互独立、各自均值为 、方差为 的伯努利随机变量之和。于是,
均值 E(X) 为
方差 V(X) 为
例 10
某生产工艺平均制造出 的不合格计算机芯片。每天从该生产过程中随机抽取一个容量为 50 的样本。如果样本中含有两片以上不合格芯片,该工艺将被停机。计算由该抽样方案导致工艺停机的概率。
把抽样过程看作 次伯努利试验,每次的 ;则样本中不合格芯片的总数 X 服从二项分布,其概率质量函数为
计算样本中发现两片以上不合格芯片的概率,用下面这个恒等式要容易得多:
概率 计算如下
因此,根据抽样过程,该生产工艺在任意一天停机的概率约为 0.08。容量为 50 的随机样本中不合格芯片数的均值为
方差为
二项分布的 cdf 已由 Banks 和 Heikes [1984] 等人制成了表格。这些表格能大大减少计算诸如 之类概率所需的工作。在对 n 和 有一定限制的条件下,泊松分布和正态分布都可用于逼近二项分布 [Hines and Montgomery, 1990]。
3.3 几何分布与负二项分布
几何分布与一串伯努利试验有关;所关注的随机变量 X 定义为取得第一次成功所需的试验次数。X 的分布为
事件 发生在先有 次失败、随后出现一次成功的时候。每次失败对应的概率为 ,每次成功对应的概率为 。于是,
均值和方差为
以及
更一般地,负二项分布是直到第 k 次成功为止所需试验次数的分布,其中 。若 Y 服从参数为 p 和 k 的负二项分布,则 Y 的分布为
因为我们可以把负二项随机变量 Y 看作 k 个相互独立的几何随机变量之和,所以很容易看出 和 。
例 11
装配好的喷墨打印机中有 40% 在检验工位被拒收。求所检验的第三台喷墨打印机是第一台合格品的概率。把每次检验看作一次伯努利试验,其中 、,则
因此,从任意起始点算起,第一台合格打印机恰好是第三台的情形只占大约 10%。要确定所检验的第三台打印机是第二台合格品的概率,则使用负二项分布式 (18):
3.4 泊松分布
泊松分布能很好地描述许多随机过程,而且数学上相当简单。泊松分布由 S. D. Poisson 于 1837 年在一本论述刑法与民法问题的著作中提出。(这本相当古老的著作名为 Recherches sur la probabilit´e des jugements en mati`ere criminelle et en mati`ere civile。显然,在概率论教授们代代相传的关于泊松分布起源的传闻并不属实。据说泊松分布最初是用来为普鲁士军队中因马蹄踢击而致死的情况建模的。)
泊松概率质量函数为
其中 α 。泊松分布的一项重要性质是均值与方差相等,均为 α,即
累积分布函数为
参数为 的泊松分布,其 pmf 与 cdf 见图 7。cdf 的数值表见附录中的表 A.4。


图 7 泊松分布的 pmf 与 cdf。
例 12
每当有服务来电时,一位计算机修理人员就会收到一次"蜂鸣"提示。已知每小时的蜂鸣次数服从均值为每小时 的泊松分布。下一小时内出现三次蜂鸣的概率由式 (19) 在 时给出:
同一结果也可以从图 7 的左侧读出,或从表 A.4 中由
算出。
例 13
在例 12 中,求 1 小时内出现两次或更多次蜂鸣的概率。
累积概率 可以从图 7 的右侧读出,或从表 A.4 中查得。
例 14
库存系统中的提前期需求,是某项物品从下单时刻起直至收到订单为止这段时间内需求量的累积,即
其中 是提前期需求, 是第 i 个时段内的需求,T 是提前期内的时间段数。 和 都可以是随机变量。
库存管理者希望提前期内发生缺货的概率不超过某个给定比例。例如,可以规定提前期内出现短缺的概率不超过 5%。
如果提前期需求服从泊松分布,再订货点的确定就大大简化了。再订货点是下达新订单时的库存水平。
设提前期需求服从均值为 件的泊松分布,并希望获得 95% 的防缺货保护。因此,需要找出这样的最小 x,使得提前期需求不超过 x 的概率大于或等于 0.95。利用式 (20),需要找出满足下式的最小 x:
所求结果在 处取得,可以通过查表 A.4 或计算 得到。
4 连续分布
连续随机变量用于描述这样一类随机现象:所关注的变量可以在某个区间内取任意值——例如故障时间或杆件的长度。以下各小节描述九个分布。
4.1 均匀分布
如果随机变量 X 的 pdf 为下式,则称 X 在区间 [a, b] 上服从均匀分布:
其 cdf 为


图 8 均匀分布的 pdf 与 cdf。
注意,对于所有满足 的 和 ,
与区间的长度成正比。该分布的均值和方差为
以及
当 和 时的 pdf 与 cdf 见图 8。
均匀分布在仿真中起着至关重要的作用。在 0 与 1 之间均匀分布的随机数,为生成随机事件提供了手段。已经设计出许多生成均匀分布随机数的方法。随后,均匀分布的随机数被用于从所有其他分布中生成随机变量样本。
例 15
正在开发一项仓库作业的仿真。大约每 3 分钟就会有一个电话,要求叉车司机开到某个指定位置。最初作出的假设是:电话之间的时间(到达间隔时间)服从均值为 3 分钟的均匀分布。由式 (25),均值为 3 且具有最大可能变异性的均匀分布,其参数值为 和 分钟。在数据非常有限(例如只知道均值约为 3 分钟)的情况下,再加上知道所关注的量以随机方式变化,至少在获得更多数据之前,可以假定采用具有最大方差的均匀分布。
例 16
一辆公共汽车从上午 6:40 开始到上午 8:40,每隔 20 分钟到达某个指定站点。某位乘客不了解时刻表,但每天早晨在上午 7:00 到 7:30 之间随机(均匀分布)到达。求该乘客等待公交超过 5 分钟的概率。
只有当到达时刻在上午 7:00 到 7:15 之间,或在上午 7:20 到 7:30 之间时,该乘客才需等待 5 分钟以上。若 X 是表示乘客在上午 7:00 之后多少分钟到达的随机变量,则所求概率为
现在,X 是在 (0, 30) 上均匀分布的随机变量。因此所求概率为
4.2 指数分布
如果随机变量 X 的 pdf 为下式,其中 ,则称 X 服从参数为 的指数分布:
密度函数见图 9 和图 3。图 9 还给出了其 cdf。
当到达完全随机时,指数分布已被用于对到达间隔时间建模;它也被用于对变异很大的服务时间建模。在这些场合中,λ 是一个速率:每小时到达数或每分钟服务数。指数分布还已被用于对发生灾难性(瞬间)故障的部件寿命建模,例如灯泡;此时 λ 是故障率。
图 10 给出了若干不同的指数 pdf。纵轴上的截距值总是等于 λ 的值。还要注意,所有 pdf 最终都会相交。(为什么?)


图 9 指数密度函数与累积分布函数。

图 10 若干指数分布的 pdf。
指数分布的均值和方差为
因此,均值与标准差相等。对式 (26) 积分即得 cdf:
例 17
假设一盏工业灯的寿命(以千小时计)服从故障率为 的指数分布(即平均每 3000 小时故障一次)。该灯寿命长于其平均寿命 3000 小时的概率由 给出。利用式 (28) 计算 F(3),得
无论 取何值,这一结果总是相同的!也就是说,指数随机变量大于其均值的概率对 的任意取值都是 0.368。工业灯寿命在 2000 小时到 3000 小时之间的概率计算如下:
同样由式 (28) 给出的 cdf,
指数分布最重要的性质之一是它具有"无记忆性",即对所有 和 ,
设 X 表示某个部件(一节电池、一个灯泡、一片计算机芯片、一台激光器等)的寿命,并假定 X 服从指数分布。式 (29) 表明:已知该部件已存活 s 小时的条件下,它至少再存活 小时的概率,与它最初至少存活 t 小时的概率相同。如果该部件在时刻 s 仍然存活(即 ),那么其剩余存活时间 的分布与全新部件的原分布相同。也就是说,该部件并不"记得"它已经使用了 s 小时。用过的部件与新的一样好。
式 (29) 成立,可以通过考察条件概率来证明:
利用式 (28) 可以求出式 (30) 的分子和分母,从而得到
例 18
求例 17 中的工业灯在运行了 2500 小时之后还能再使用 1000 小时的概率。利用式 (29) 和式 (28) 可以求得:
例 18 说明了无记忆性质——即服从指数分布的用过的部件与新部件一样好。一个全新部件寿命大于 1000 小时的概率同样等于 0.717。一般地说,假设观测到某个寿命服从参数为 λ 的指数分布的部件,并发现在任意时刻它仍在运行,那么其剩余寿命的分布也是参数为 λ 的指数分布。指数分布是唯一具有无记忆性的连续分布。(几何分布是唯一具有无记忆性的离散分布。)
4.3 伽马分布
用于定义伽马分布的函数之一是伽马函数,它对所有 定义为
对式 (31) 分部积分,可以证明
如果 是整数,那么利用 并反复应用式 (32),可以看出
伽马函数可以看作是把阶乘概念推广到所有正数(而不仅仅是整数)上。
如果随机变量 X 的 pdf 为下式,则称 X 服从参数为 和 θ 的伽马分布:
称为形状参数,θ 称为尺度参数。图 11 给出了 且 取若干值时的伽马分布。
伽马分布的均值和方差为
以及
X 的 cdf 为

图 11 θ = 1 时若干伽马分布的 pdf。
当 是整数时,伽马分布与指数分布有如下关系:如果随机变量 X 是 个相互独立、服从指数分布的随机变量之和,且每个的参数均为 ,则 X 服从参数为 和 θ 的伽马分布。即
其中 的 pdf 为
并且各 相互独立,则 X 具有式 (34) 所给的 pdf。注意,当 时,结果是指数分布。这一结论既可由式 (38) 得出,也可由在式 (34) 中令 得出。
4.4 厄兰分布
当 (k 为整数)时,式 (34) 所给的 pdf 通常称为 k 阶(或 k 相)厄兰分布。Erlang 是丹麦的一位电话工程师,是排队理论的早期开发者之一。厄兰分布可能出现于如下情境:考虑一串 k 个工位,完成一位顾客的服务必须依次通过这些工位。在正在处理的顾客通过所有工位之前,新的顾客不能进入第一个工位。每个工位的服务时间都服从参数为 kθ 的指数分布。给出伽马分布均值和方差的式 (35) 和式 (36),无论 取何值都成立。然而,当 (k 为整数)时,可以相当直接地用式 (38) 推导出该分布的均值。随机变量之和的期望值等于各随机变量期望值之和。因此,
每个服从指数分布的 的期望值为 。因此,
如果各随机变量 相互独立,则它们之和的方差等于各方差之和,即
当 (k 为正整数)时,式 (37) 所给的 cdf 可以用分部积分求出,得到
它是均值为 的泊松项之和。当形状参数为整数时,可以用泊松累积分布表来计算 cdf。
例 19
某大学电气工程专业的教授暑假要离开家,但他希望始终有一盏灯亮着以吓退窃贼。教授装配了一个可装两个灯泡的装置。当第一个灯泡失效时,该装置会把电流切换到第二个灯泡上。灯泡包装盒上写着:“平均寿命 1000 小时,服从指数分布。“教授将外出 90 天(2160 小时)。问夏季结束、教授返回时仍有一盏灯亮着的概率是多少?
系统至少工作 x 小时的概率称为可靠度函数(reliability function):
本例中,整个系统的总寿命由式 (38) 给出,其中 个灯泡,且 每小时,故 每小时。于是 可由式 (39) 求得:
因此,教授返回时仍有一盏灯亮着的概率约为 36%。
例 20
一位医生给病人做体检,共分三个阶段。每个阶段都服从均值为 20 分钟的指数分布。求体检在 50 分钟或以内完成的概率。同时,计算体检时间的期望长度。本例中, 个阶段,,故 每分钟。于是 可由式 (39) 计算:
利用表 A.4 所示的泊松累积分布,可以计算出
体检在 50 分钟或以内完成的概率为 0.457。体检时间的期望长度由式 (35) 求得:
此外,X 的方差为 分钟²——顺便提一下,厄兰分布的众数由下式给出:
因此,本例中的众数值为
4.5 正态分布
具有均值 和方差 的随机变量 X,若其 pdf 为
则称 X 服从正态分布。

图 12 正态分布的 pdf。
正态分布使用得如此频繁,以至于许多作者采用记号 来表示随机变量 X 服从均值为 、方差为 的正态分布。正态 pdf 见图 12。
这里列出正态分布的若干特殊性质:
a. 且 ;即当 x 趋近负无穷时 f(x) 的值趋近于零,同样地,当 x 趋近正无穷时也趋近于零。
b. ;该 pdf 关于 对称。
c. pdf 的最大值出现在 处;均值与众数相等。
正态分布的 cdf 为
式 (42) 无法用闭式求值。可以采用数值方法,但似乎必须对每一对 都重新计算该积分。不过,通过变量变换 ,可以使其求值与 和 无关。若 ,令 ,则得到

图 13 标准正态分布的 pdf。
是均值为 0、方差为 1 的正态分布的 pdf。于是 ,称 服从标准正态分布。标准正态分布见图 13。标准正态分布的 cdf 为
式 (45) 已被广泛地制成数值表。 时的概率 见表 A.3。下面给出若干例子,说明式 (43) 和表 A.3 的用法。
例 21
假设已知 。计算 。利用式 (43),由表 A.3 得
其直观解释见图 14。图 14(a) 给出了 的 pdf,并标出了具体的值 。阴影部分就是所求概率。图 14(b) 给出了标准正态分布 并标出了值 2; 比均值大 2σ(其中 )。像图 14 那样把两种示意图都画出来,有助于避免在求取所需概率时产生混淆。


图 14 变换到标准正态分布。
例 22
装载一艘远洋船舶所需的时间(以小时计)X 服从 分布。船舶在 10 小时内完成装载的概率由 给出,其中
利用正态分布的对称性,可在表 A.3 中查得 。注意 。0.8413 的补数,即 0.1587,位于尾部,也就是图 15(a) 所示标准正态分布的阴影部分。在图 15(b) 中,利用对称性求出阴影区域为 。[按同样的推理,可以看出 ,而 。一般地,。] 需要 12 小时或更多时间才能装完船的概率,也可以像图 16 那样通过观察正态 pdf 的对称性并利用均值直接求得。图 16(a) 的阴影部分表示最初提出的问题[即求 ]。现在,。图 16(b) 中的标准化正态分布用于求取 。因此,。(图 16(a) 和 (b) 中的阴影部分都包含正态 pdf 下面积的 0.50。)


图 15 利用正态分布的对称性。


图 16 通过观察求概率。


图 17 船舶装载问题的标准正态变换。
装载一条船所需时间在 10 小时到 12 小时之间的概率,利用本例前面给出的结果:
所求面积显示在图 17(a) 的阴影部分。以标准化正态分布表示的等价问题见图 17(b)。概率式为 0.3413,数值由表 A.3 查得。
例 23
在某自助餐厅排队后开始自助服务所需的时间被发现服从 分布。到达顾客等待 14 分钟到 17 分钟之间的概率计算如下:
图 18(a) 中所示的阴影面积表示概率 。图 18(b) 中所示的阴影面积表示标准化正态分布下的等价概率 。由表 A.3,。现在,。因此,。顾客在 14 分钟到 17 分钟之间通过队列的概率为 0.3780。


图 18 自助餐厅问题的标准正态变换。
例 24
某项物品的提前期需求 X 近似服从均值为 25、方差为 9 的正态分布。希望计算提前期数值,使得超出该值的概率仅为 5%。因此,问题就是求 使得 ,如图 19(a) 的阴影部分所示。等价的问题见图 19(b) 的阴影部分。现在,
或者等价地,
由表 A.3 可以看出 (1.645) 对应 0.95。于是, 可由求解
得到
因此,如果当库存水平降到 30 时发出采购订单,则提前期内需求超出可用库存的情形仅占 5%。


图 19 求提前期需求问题中的 。
4.6 Weibull 分布
如果随机变量 X 的 pdf 具有下述形式,则称 X 服从 Weibull 分布:
Weibull 分布的三个参数为:ν,即位置参数;α,即尺度参数;以及 ,即形状参数。当 时,Weibull pdf 化为

图 20 ν = 0;α = 1;β = 1/2, 1, 2, 4 时的 Weibull pdf。
图 20 给出了 且 时的若干 Weibull 密度。当 时,Weibull 分布退化为
这就是参数为 的指数分布。Weibull 分布的均值和方差由下列式子给出:
其中 由式 (31) 定义。因此,位置参数 ν 对方差没有影响;不过均值会随 ν 的增大或减小而增大或减小。Weibull 分布的 cdf 为
例 25
已知某部件的故障时间服从 Weibull 分布,其中 ,。平均故障时间由式 (48) 给出:
某个单元在 2000 小时之前发生故障的概率由式 (50) 计算:
例 26
某大型国际机场中,飞机着陆并脱离跑道所需的时间服从 Weibull 分布,其中 分钟, 分钟,。求一架进港飞机着陆并脱离跑道所需时间超过 1.5 分钟的概率。本例中 计算如下:
因此,飞机着陆并脱离跑道需要 1.5 分钟以上的概率为 0.135。
4.7 三角分布
如果随机变量 X 的 pdf 为下式,则称 X 服从三角分布:
其中 。众数出现在 处。三角分布的 pdf 见图 21。参数 可以与其他度量(例如均值和众数)建立如下关系:

图 21 三角分布的 pdf。
由式 (52) 可以确定众数:
因为 ,
在刻画三角分布时,众数比均值用得更多。如图 21 所示,其在 x 轴之上的高度为 。三角分布的方差 留给读者作为练习。三角分布的 cdf 为
例 27
将要执行的程序对中央处理器(CPU)时间的需求服从三角分布,其中 毫秒, 毫秒, 毫秒。求随机程序对 CPU 的需求为 2.5 毫秒或更小的概率。F(2.5) 的值由 cdf 在区间 [0.05, 1.1] 上的那一部分加上区间 [1.1, 2.5] 上的那一部分得到。利用式 (54),两部分可以一次性处理,结果为
因此,CPU 需求为 2.5 毫秒或更小的概率为 0.541。
例 28
某电子传感器用于评估存储芯片的质量,对不合格品予以剔除。应要求时,该传感器会给出过去 24 小时内每生产小时内的最少和最多剔除数,同时也给出均值。在没有进一步信息的情况下,质量控制部门假定被剔除芯片的数量可用三角分布近似。当前数据导出表明,任意小时内被剔除芯片的最少数为 0,最多数为 10,均值为 4。已知 ,且 ,则 b 可由式 (53) 求得:
众数处的高度为 。于是可以画出图 22。
中位数是这样的点:其左侧面积为 0.5,右侧面积也为 0.5。本例中的中位数为 3.7,也标在图 22 上。求三角分布的中位数,需要先确定该值位于众数的左侧还是右侧。众数左侧的面积由式 (54) 算得:
因此,中位数位于 b 与 c 之间。在式 (54) 中令 并解出中位数 x,得
其中
本例清楚地表明,均值、众数和中位数并不一定相等。

图 22 三角分布的众数、中位数与均值。
4.8 对数正态分布
如果随机变量 X 的 pdf 为下式,则称 X 服从对数正态分布:
其中 。对数正态随机变量的均值和方差为
图 23 给出了三个对数正态 pdf,它们的均值均为 1,方差分别为 1 和 2。
注意,参数 和 并不是对数正态分布的均值和方差。这一点源于:若 Y 服从 分布,则 服从参数为 和 的对数正态分布。如果已知对数正态分布的均值和方差分别为 和 ,则参数 和 由下式给出:

图 23 对数正态分布的 pdf。
例 29
某项高风险投资的收益率建模为服从对数正态分布,均值 20%,标准差 5%。计算该对数正态分布的参数。由已知信息, 且 。于是,由式 (58) 和式 (59),
4.9 贝塔分布
如果随机变量 X 的 pdf 为下式,其中参数 和 ,则称 X 服从贝塔分布:
其中 。一般来说,贝塔分布的 cdf 没有闭式解。
贝塔分布非常灵活,取值范围有限,为 0 到 1,如图 24 所示。在实践中,我们常常需要一个定义在另一个范围(例如 ,其中 )上的贝塔分布,而不是 (0, 1)。只要定义新的随机变量即可轻松实现:
Y 的均值和方差为
以及

图 24 若干贝塔分布的 pdf。
5 泊松过程
考虑诸如作业到达作业车间、电子邮件到达邮件服务器、船只到达码头、来电到达呼叫中心、大型工厂中机器故障等随机事件。这些事件可以用对所有 定义的计数函数 来描述。该计数函数表示在 [0, t] 内发生的事件数。时刻零是观察开始的时点,不论该瞬间是否发生了到达。对于每个区间 ,值 是一个随机变量的观测值,N(t) 唯一可能的取值为整数 。计数过程 若满足以下假设,则称其为准均率为 λ 的泊松过程:
a. 到达一次一个地发生。
b. 具有平稳增量:t 与 之间到达数的分布只取决于区间长度 s,而与起点 t 无关。因此,到达是完全随机的,既不急促也不迟滞。
c. 具有独立增量:互不重叠的时间区间内的到达数是相互独立的随机变量。因此,某个时间区间内到达数的多或少,对随后各时间区间内的到达数没有影响。未来的到达完全随机地发生,与过去各时间区间内的到达数无关。
如果到达按照满足上述三个假设的泊松过程发生,可以证明 等于 n 的概率为
将式 (63) 与式 (19) 比较可以看出, 服从参数为 的泊松分布。因此,其均值和方差为
对于任何满足 的时刻 s 和 t,平稳增量假设意味着表示 s 到 t 区间内到达数的随机变量 也服从均值为 的泊松分布。于是,
以及
现在,考虑泊松过程中到达发生的时间。设第一次到达发生在时刻 ,第二次发生在时刻 ,依此类推,如图 25 所示。

图 25 到达过程。
于是,. 是逐次到达间隔时间。第一次到达发生在时刻 t 之后,当且仅当区间 [0, t] 内没有到达,因此可以看出
因此,
最后一个等号由式 (63) 得出。于是,第一次到达发生在 [0, t] 内的概率为
这正是参数为 λ 的指数分布的 cdf。因此, 服从均值为 的指数分布。还可以证明,所有到达间隔时间 都服从均值为 的指数分布且相互独立。作为泊松过程的另一种定义,可以证明:若到达间隔时间相互独立地服从指数分布,则截至时刻 t 的到达数(记作 )满足先前提到的三个假设,因而是一个泊松过程。
回顾一下,指数分布具有无记忆性——即在长度为 s 的时间区间内发生未来到达的概率与上一次到达的时刻无关。到达的概率只取决于时间区间长度 s。因此,无记忆性与泊松过程的独立增量和平稳增量性质是相关的。
关于泊松过程的更多阅读材料可从许多来源获得,包括 Parzen [1999]、Feller [1968] 和 Ross [2002]。
例 30
某机械加工车间的作业按照均值为每小时 件作业的泊松过程到达。因此,到达间隔时间服从指数分布,到达之间的期望时间为
小时。
5.1 泊松过程的性质
Ross [2002] 等人讨论的泊松过程的若干性质,在离散系统仿真中很有用。其中第一个性质涉及随机分裂。考虑一个具有速率 λ 的泊松过程 ,如图 26 左侧所示。
假设每次事件发生时,都把它归类为 I 型事件或 II 型事件。再假设每个事件被归类为 I 型事件的概率为 ,被归类为 II 型事件的概率为 ,且与其他所有事件相互独立。
设 和 分别为表示在 [0, t] 内发生的 I 型事件数和 II 型事件数的随机变量。注意 。可以证明 和 都是泊松过程,其速率分别为 和 ,如图 26 所示。此外,还可以证明这两个过程是相互独立的。

图 26 随机分裂。
例 31:随机分裂
假设作业按照速率为 λ 的泊松过程到达某车间。再假设每次到达以 1/3 的概率被标记为"高优先级”,以 2/3 的概率被标记为"低优先级”。那么 I 型事件对应高优先级到达,II 型事件对应低优先级到达。若 和 如上所定义,则两个变量都服从泊松过程,其速率分别为 和 。
例 32
例 31 中的速率为每小时 。2 小时内没有高优先级作业到达的概率由参数为 的泊松分布给出。于是,
现在考虑与随机分裂相反的情形,即两股到达流的合并。所关注的过程见图 27。可以证明,若 是表示速率为 ( 和 2)的相互独立泊松过程的随机变量,则 是速率为 的泊松过程。

图 27 合并过程。
例 33:合并过程
一个速率为每小时 次到达的泊松到达流,与一个速率为每小时 次到达的泊松到达流合并(或合流)。合并后的过程是速率为每小时 次到达的泊松过程。
5.2 非平稳泊松过程
如果保留泊松假设 1 和 3(第 5 节),但去掉假设 2(平稳增量),就得到非平稳泊松过程(NSPP),它由 ,即时刻 t 的到达率来刻画。NSPP 适用于那些在所关注时段内到达率发生变化的情形,包括餐厅的用餐时段、工作时间内的电话、晚上 6 点前后的比萨饼外卖订单等。
处理 NSPP 的关键在于截至时刻 t 的期望到达数,记作
要能作为到达率函数,λ(t) 必须非负且可积。对于速率为 λ 的平稳泊松过程,我们有 ,与预期一致。
设 . 为速率 的平稳泊松过程 的到达时刻,设 . 为到达率为 的 NSPP 的到达时刻。处理 NSPP 的基本关系如下:
换句话说,NSPP 可以被变换为到达率为 1 的平稳泊松过程,而到达率为 1 的平稳泊松过程也可以被变换为到达率为 λ(t) 的 NSPP,两种情形下的变换都与 有关。
例 34
假设某邮局从上午 8 点到中午 12 点的到达率为每分钟 2 件,此后降到每 2 分钟 1 件,直到当天下午 4 点结束营业。求上午 11 点到下午 2 点之间到达件数的概率分布。
令时刻 对应上午 8 点。则该情形可建模为 NSPP ,其速率函数为
因此,截至时刻 t 的期望到达数为
注意,计算 时的期望到达数,需要把积分分两段来做:
由于下午 2 点和上午 11 点分别对应时刻 6 和时刻 3,故有
其中 是到达率为 1 的平稳泊松过程。
6 经验分布
经验分布(可以是离散形式,也可以是连续形式)是一种分布,其参数就是数据样本中的观测值。这与参数分布族(如指数分布、正态分布或泊松分布)形成对照,后者只需指定少数几个参数(如均值和方差)即可刻画。当不可能或没有必要确立某个随机变量具有特定的参数分布时,可以使用经验分布。经验分布的一个优点是,除样本中的观测值之外不作任何假设;但这同时也是一个缺点,因为样本可能并未覆盖全部可能的取值范围。
例 35:离散型
某本地餐厅的顾客在午餐时段以 1 至 8 人的小组形式到达。已经观测了最近 300 组中每组的人数;结果汇总于表 3。相对频数见表 3,也见图 28,该图给出了所收集数据的直方图。图 29 给出了数据的 cdf。图 29 中的 cdf 称为给定数据的经验分布。
表 3 每桌到达人数分布
| 每桌到达人数 | 频数 | 相对频数 | 累积相对频数 |
|---|---|---|---|
| 1 | 30 | 0.10 | 0.10 |
| 2 | 110 | 0.37 | 0.47 |
| 3 | 45 | 0.15 | 0.62 |
| 4 | 71 | 0.24 | 0.86 |
| 5 | 12 | 0.04 | 0.90 |
| 6 | 13 | 0.04 | 0.94 |
| 7 | 7 | 0.02 | 0.96 |
| 8 | 12 | 0.04 | 1.00 |

图 28 每桌人数的直方图。

图 29 每桌人数的经验 cdf。
例 36:连续型
已经收集了最近 100 次输送系统发生故障后所需的修理时间;结果见表 4。其中有 21 次修理时间在 0 到 0.5 小时之间,依此类推。经验 cdf 见图 30。由形如 [x, F(x)] 的各点相连形成一条分段线性曲线。这些点以直线相连。第一对相连点是 (0, 0) 和 (0.5, 0.21);然后把点 (0.5, 0.21) 和 (1.0, 0.33) 相连;依此类推。
表 4 输送带的修理时间
| 区间(小时) | 频数 | 相对频数 | 累积频数 |
|---|---|---|---|
| 0 < x ≤ 0.5 | 21 | 0.21 | 0.21 |
| 0.5 < x ≤ 1.0 | 12 | 0.12 | 0.33 |
| 1.0 < x ≤ 1.5 | 29 | 0.29 | 0.62 |
| 1.5 < x ≤ 2.0 | 19 | 0.19 | 0.81 |
| 2.0 < x ≤ 2.5 | 8 | 0.08 | 0.89 |
| 2.5 < x ≤ 3.0 | 11 | 0.11 | 1.00 |

图 30 修理时间的经验 cdf。
7 小结
在许多情形下,仿真分析人员所看到的世界是概率性的,而不是确定性的。本章的目的在于回顾若干重要的概率分布,使读者熟悉本书其余部分所用的记号,并展示概率分布在仿真情境下的应用。
仿真中的一项主要任务是输入数据的收集与分析。这项任务的首要步骤之一,是为输入数据假设一种分布形式。做法是把概率密度函数或概率质量函数的形状与数据的直方图作比较,并理解某些物理过程会产生特定的分布。(有专门的计算机软件可用来协助完成这项工作。)本章旨在强化对各种分布性质的理解,并加深对这些分布在实践中如何产生的认识。此外,输入数据的概率模型还用于在仿真中生成随机事件。
以下若干特征应当给读者留下深刻印象:离散分布、连续分布与经验分布之间的差异;泊松过程及其性质;以及伽马分布和 Weibull 分布的多才多艺。
参考文献
BANKS, J., AND R. G. HEIKES [1984], Handbook of Tables and Graphs for the Industrial Engineer and Manager, Reston Publishing, Reston, VA.
DEVORE, J. L. [1999], Probability and Statistics for Engineers and the Sciences, 5th ed., Brooks/Cole, Pacific Grove, CA.
FELLER, W. [1968], An Introduction to Probability Theory and Its Applications, Vol. I, 3d ed., Wiley, New York.
GORDON, G. [1975], The Application of GPSS V to Discrete System Simulation, Prentice-Hall, Englewood Cliffs, NJ.
HADLEY, G., AND T. M. WHITIN [1963], Analysis of Inventory Systems, Prentice-Hall, Englewood Cliffs, NJ.
HINES, W. W., AND D. C. MONTGOMERY [1990], Probability and Statistics in Engineering and Management Science, 3d ed., Wiley, New York.
LAW, A. M., AND W. D. KELTON [2000], Simulation Modeling & Analysis, 3d ed., McGraw-Hill, New York.
PAPOULIS, A. [1990], Probability and Statistics, Prentice Hall, Englewood Cliffs, NJ.
PARZEN, E. [1999], Stochastic Process, Classics in Applied Mathematics, 24, Society for Industrial & Applied Mathematics, Philadelphia, PA.
PEGDEN, C. D., R. E. SHANNON, AND R. P. SADOWSKI [1995], Introduction to Simulation Using SIMAN, 2d ed., McGraw-Hill, New York
ROSS, S. M. [2002], Introduction to Probability Models, 8th ed., Academic Press, New York.
WALPOLE, R. E., AND R. H. MYERS [2002], Probability and Statistics for Engineers and Scientists, 7th ed., Prentice Hall, Upper Saddle River, NJ.
习题
某生产工艺制造用于休闲船用舷外发动机的交流发电机。平均而言,在发动机总装厂检验时,有 1% 的交流发电机达不到所要求的标准。当工厂收到一大批交流发电机时,抽取 100 台进行检验;如果其中有两台以上不合格,则该批货物退回交流发电机制造商。求退货批次的概率。
已开发出一种能够延缓油漆火灾蔓延的工业化学品。当地销售代表根据以往经验估计,48% 的销售拜访会带来订单。
(a) 当天第一次订单出现在第四次销售拜访时的概率是多少?
(b) 如果一天进行八次销售拜访,恰好收到六份订单的概率是多少?
(c) 如果午餐前进行四次销售拜访,其中一次或更少带来订单的概率是多少?
最近的一项调查表明,82% 的 25 岁单身女性将在其一生中结婚。利用二项分布,求 20 人样本中有两名或三名女性终身未婚的概率。
Hawks 队目前胜率为 0.55。未来两周内有 5 场比赛。求他们胜场多于负场的概率。
Joe Coledge 是 Lower Alatoona 大学的第三替补四分卫。Joe 参加任何一场比赛的概率为 0.40。
(a) Joe 参加的第一场比赛是赛季第四场比赛的概率是多少?
(b) Joe 在前五场比赛中参加不超过两场的概率是多少?
对参数 的指数分布随机变量 和 ,计算 。
证明几何分布具有无记忆性。
每年袭击佛罗里达海岸的飓风数量服从均值为 0.8 的泊松分布。
(a) 一年内有两场以上飓风袭击佛罗里达海岸的概率是多少?
(b) 一年内恰好有一场飓风袭击佛罗里达海岸的概率是多少?
银行柜员机(drive-through)窗口的到达服从速率为每分钟 1.2 的泊松分布。
(a) 下一分钟内零到达的概率是多少?
(b) 未来 2 分钟内零到达的概率是多少?
记录表明,某大型州立大学入学的学生中有 1.8% 在学期中退学。求从 200 名入学学生中随机抽取一组,其中三人或更少退学的概率。
Lane Braintwain 是一位相当受欢迎的学生。Lane 平均每晚接到四个电话(服从泊松分布)。求明晚接到的电话数比平均值超出超过一个标准差的概率。
冷凝机组(condenser units)的提前期需求服从均值为 6 台的泊松分布。为库存管理者编制一张表,列出达到以下保护水平所需的订货水平:50%、80%、90%、95%、97%、97.5%、99%、99.5% 和 99.9%。
若随机变量 X 在范围 上的 pmf 为 ,则称 X 服从离散均匀分布。
(a) 求该分布的均值和方差。提示:
(b) 若 \(R_{X} = \{a , a + 1 , a + 2 , \ldots , b \}\),计算 X 的均值和方差。
- 一颗被送入轨道的卫星,其寿命(以年计)的 pdf 如下:
(a) 这颗卫星在 5 年后仍"存活"的概率是多少?
(b) 该卫星在送入轨道后 3 年到 6 年之间失效的概率是多少?
一台大型计算机按照泊松过程发生崩溃,平均速率为每 36 小时崩溃一次。求在最后一次崩溃后 24 小时到 48 小时之间发生下一次崩溃的概率。
(当 n 很大而 p 很小时(例如 p 小于 0.1),可以用泊松分布来逼近二项分布。在使用泊松逼近时,令 。)在滚珠轴承的生产中会出现气泡或凹陷,使滚珠轴承不适于销售。已经注意到,平均每 800 个滚珠轴承中就有 1 个带有此类缺陷。求随机抽取 4000 个滚珠轴承,其中有气泡或凹陷的少于三个的概率。
对指数分布的随机变量 X,求满足下列关系的 λ 值:
某工业场地的意外事故一次一个地、相互独立且完全随机地发生,平均速率为每周一起。求未来三周内没有意外事故发生的概率。
某部件的故障时间服从均值为 10,000 小时的指数分布。
(a) 该部件已运行了相当于其平均寿命的时间。它在 15,000 小时前失效的概率是多少?
(b) 在 15,000 小时时,该部件仍在运行。它还能再运行 5000 小时的概率是多少?
假设某种"永不停歇"(Die-Hardly-Ever)电池的故障时间服从均值为 48 个月的指数分布。在 60 个月时,该电池仍在运行。
(a) 该电池将在未来 12 个月内失效的概率是多少?
(b) 该电池在其寿命的奇数年份失效的概率是多少?
(c) 若电池在 60 个月时仍在运行,计算其剩余寿命的期望月数。
银行柜员机(drive-through)窗口为顾客服务的时间服从均值为 50 秒的指数分布。
(a) 排在某位到达顾客前面的两位顾客各自用不到 60 秒完成业务的概率是多少?
(b) 前面的两位顾客完成业务,从而使得到达的顾客能在 2 分钟内到达柜员窗口的概率是多少?
确定三角分布的方差 V(X)。
Hardscrabble 工具与模具厂每日用水量(以千升计)服从形状参数为 2、尺度参数为 1/4 的伽马分布。求任意一天需求超过 4000 升的概率。
伯德海军上将前往北极时,穿着电池供电的保暖内衣。这些电池是瞬间而非渐进失效的。电池寿命服从均值为 12 天的指数分布。行程历时 30 天。伯德海军上将装了三块电池。求三块电池足以使这位上将保持温暖的概率。
远程计算机访问某网页的时间间隔服从均值为 15 秒的指数分布。求第三次连接命中发生在 30 秒之后的概率。
亚特兰大机场的机场列车车厢采用双电力制动系统。如果第一套系统失效,车厢会自动切换到备用系统。如果两套系统都失效,就会发生碰撞!假定单套电力制动系统的寿命服从均值为 4000 运行小时的指数分布。如果系统每 5000 运行小时检查一次,求车厢在该时刻之前不发生碰撞的概率。
假设到达收费亭的汽车服从平均到达间隔时间为 15 秒的泊松过程。求直到有三辆车到达为止经过不超过一分钟的概率。
假设按照泊松过程,平均每小时有 30 位顾客到达 Sticky Donut Shop。求在接下来的两位顾客走进店门之前经过时间超过 5 分钟的概率。
Dipsy Doodle 教授每次考试出六道题。每道题给全班 15 名学生评分平均需要 30 分钟。每道题的评分时间服从指数分布,且各题之间相互独立。
(a) 求教授在 2.5 小时或更短时间内完成评分的概率。
(b) 最可能的评分时间是多少?
(c) 期望的评分时间是多少?
某飞机装有双液压系统。如果第一套系统失效,飞机会自动切换到备用系统。如果两套系统都失效,飞机就会坠毁。假定一套液压系统的寿命服从均值为 2000 飞行小时的指数分布。
(a) 若液压系统每 2500 小时检查一次,求飞机在该时刻之前坠毁的概率。
(b) 把检查点移到 3000 小时会带来什么危险?
若随机变量 X 的 pdf 为
则称 X 服从贝塔分布。证明当 \(\beta_{1} = \beta_{2} = 1\) 时,贝塔分布成为单位区间上的均匀分布。
提前期(以百个单位计)服从形状参数为 3、尺度参数为 1 的伽马分布。求在即将到来的一个周期内提前期超过 2(百)个单位的概率。
PC 用廉价显示卡的寿命(以月计)记为随机变量 X,服从 、 的伽马分布。求该显示卡至少能用 2 年的概率。
许多州的车牌遵循如下格式:
letter letter letter number number number
数字是随机的,取值范围为 100 到 999。
(a) 求(随机看到的)接下来两块车牌号码均不低于 500 的概率。
(b) 求(随机看到的)接下来两块车牌号码之和不低于 1000 的概率。[提示:用连续均匀分布逼近离散均匀分布。两个独立均匀分布之和为三角分布。]
设 X 是服从正态分布的随机变量,均值为 10,方差为 4。求 a 和 b 的值,使得 $ P ( a < X < b ) = 0 . 90 {\mathrm{~ a n d ~}} | \mu - a | = | \mu - b |$。
给定下列分布:
Normal (10, 4)
Triangular (4, 10, 16)
Uniform (4, 16)
求各分布下 的概率。
某项物品的提前期近似服从均值为 20 天、方差为 4 天² 的正态分布。求提前期仅被超出 1%、5% 和 10% 的提前期数值。
社会上的 IQ 分数服从正态分布,均值为 100,标准差为 15。
(a) IQ 不低于 140 的人被称为"天才"。社会中处于天才类别的比例是多少?
(b) 社会中有多大比例的人会因相差 5 分或更少而未达到天才类别?
(c) 假设要进入经认可的学院或大学需要 IQ 不低于 110。由于 IQ 分数偏低而可能被排除在高等教育之外的社会比例是多少?
制造三根轴并装配成一套连杆机构。每根轴的长度(以厘米计)分布如下:
Shaft 1: N(60, 0.09)
Shaft 2: N(40, 0.05)
Shaft 3: N(50, 0.11)
(a) 该连杆机构长度的分布是什么?
(b) 该连杆机构长度超过 150.2 厘米的概率是多少?
(c) 该装配的公差限为 (149.83, 150.21)。有多大比例的装配落在公差限内?[提示:若 是 n 个相互独立的正态随机变量,且 的均值为 、方差为 ,则其和
服从正态分布,均值为 \(\textstyle \sum_{i = 1} ^ {n} \mu_{i}\),方差为 \(\textstyle \sum_{i = 1} ^ {n} \sigma_{i} ^ {2} .\)]
镍镉电池的电池柱周长服从 Weibull 分布,其中 厘米, 厘米,。
(a) 求随机选取的一根电池柱周长大于 3.40 厘米的概率。
(b) 若电池柱大于 3.50 厘米,它们将无法穿过所提供的孔;若小于 3.30 厘米,夹具就无法充分夹紧。有多大比例的电池柱因上述原因之一而必须报废?
镍镉电池的故障时间服从参数为 ν = 0、α = 1/2 年、 的 Weibull 分布。
(a) 求预期在 1.5 年之前失效的电池比例。
(b) 预期寿命长于平均寿命的电池比例是多少?
(c) 预期在 1.5 年到 2.5 年之间失效的电池比例是多少?
Gipgip Pig Farm 在欢乐的 5 月份的用电需求服从三角分布,其中 a = 100 千瓦时,c = 1800 千瓦时。千瓦时的中位数为 1425。计算该月份千瓦时的众数值。
某电子子组件的故障时间可用 Weibull 分布建模,其位置参数为 0,α = 1000 小时,。
(a) 平均故障时间是多少?
(b) 这些子组件中有多大比例在 3000 小时前失效?
在 85 号州际公路 Hahira 检查站接受检查的三轴卡车的总重量,服从参数为 ν = 6.8 吨、α = 1/2 吨、β = 1.5 的 Weibull 分布。确定适当的载重限值,使得有 0.01 的卡车会因超重而被处罚。
Sag Reva 的燃油里程表当前读数为平均每加仑 25.3 英里。假定 Sag 的汽车的燃油里程服从三角分布,最小值为零,最大值为每加仑 50 英里。中位数的值是多少?
某邮递员有一条由五段组成的投递路线,完成每一段所需的时间(以分钟计)服从正态分布,其均值和方差如下:
| Tennyson Place | N(38, 16) |
|---|---|
| Windsor Parkway | N(99, 29) |
| Knob Hill Apartments | N(85, 25) |
| Evergreen Drive | N(73, 20) |
| Chastain Shopping Center | N(52, 12) |
除了上述时间之外,邮递员还必须在中心邮局整理邮件,该活动所需时间服从 N(90, 25)。驾车前往路线起点所需时间服从 N(10, 4)。从路线返回所需时间服从 N(15, 4)。随后邮递员从事行政事务,所需时间服从 N(30, 9)。
(a) 邮递员工作日长度的期望是多少?
(b) 某一天工作满八小时后开始加班。求任意一天该邮递员需要加班的概率。
(c) 求在六天工作周中,该邮递员有两天或更多天需要加班的概率。
(d) 求任意一天该路线会在 8 小时上下 24 分钟之内完成(即在 8 小时 ±24 分钟之内完成)的概率。[提示:参见习题 39。]
已知 WD-1 计算机芯片的故障时间服从参数为 、 的 Weibull 分布。求预期能存活 600 天的比例。
Schocker 百货商店展出的电视机采用这样的接线方式:当一台失效时,会有一台完全相同的机型接替开机。三台这样的电视以这种串联方式接在一起。这些电视的寿命彼此独立。每台电视的寿命服从均值为 10,000 小时的指数分布。求系统组合寿命大于 32,000 小时的概率。
密西西比州比洛克西(Biloxi)7 月 21 日的最高气温记为随机变量 X,其概率密度函数如下,其中 X 以华氏度为单位。
(a) 气温的方差 V(X) 是多少?[提示:如果你做过了习题 22,这题相当容易。]
(b) 气温的中位数是多少?
(c) 气温的众数是多少?
Eastinghome 灯泡的故障时间服从 Weibull 分布,其中 小时, 小时,。
(a) 预期寿命长于平均寿命的灯泡比例是多少?
(b) 灯泡寿命的中位数是多少?
提前期需求(以百个单位计)服从形状参数为 2、尺度参数为 1/4 的伽马分布。求在即将到来的一个周期内提前期超过 4(百)个单位的概率。
令时刻 对应上午 6 点,并假设某家上午 6 点至 9 点营业的早餐餐厅的顾客到达率(以每小时到达数计)为
假定 NSPP 模型是合适的,完成下列各项:(a) 推导 \(\Lambda (t)\)。(b) 计算上午 6:30 到 8:30 之间的期望到达数。(c) 计算上午 6:30 到 8:30 之间到达数少于 60 的概率。
6 排队模型
仿真常用于排队模型(queueing model)的分析。在图 1 所示的那个简单但典型的排队模型中,顾客不时到来并加入排队线(queue,waiting line),最终接受服务,最后离开系统。术语顾客(customer)指的是任何可被视为向系统请求服务的实体。因此,许多服务设施、生产系统、修理与维护设施、通信与计算机系统,以及运输和物料搬运系统都可以被视为排队系统。
排队模型——无论是用数学方法求解,还是通过仿真进行分析——都为分析人员提供了强有力的工具,用以设计和评价排队系统(queueing system)的性能。典型的系统性能度量包括服务台利用率(server utilization,服务台忙碌时间所占的百分比)、排队线的长度,以及顾客的延误(delay)。在设计或试图改进一个排队系统时,分析人员(或决策者)相当经常地需要在服务台利用率与顾客满意度(以队伍长度和延误来衡量)之间进行权衡。排队论与仿真分析被用来把这些系统性能度量预测为输入参数的函数。输入参数包括顾客的到达率、顾客的服务需求、服务台的工作速率,以及服务台的数量与布置方式。在一定程度上,某些输入参数处在管理层的直接控制之下。因此,只要对给定系统而言性能度量与输入参数之间的关系已经有充分的理解,性能度量也就处在他们的间接控制之下。
对于相对简单的系统,这些性能度量可以用数学方法算出——与采用仿真模型相比,这在时间和费用上都节省很多——但是,对于复杂系统的切合实际的模型,通常必须使用仿真。尽管如此,解析上可处理的模型虽然往往需要许多简化假设,但对于粗略估计系统性能仍然很有价值。这些粗略估计随后可借助一个详细而更真实的仿真模型加以细化,同时也提供了一种途径,用以检验仿真模型是否已被正确地编程。简单模型对于建立对排队系统动态行为以及各种性能度量之间关系的理解也很有用。本章不去发展排队的数学理论,而是转而讨论若干众所周知的模型。关于排队论的入门性论述,建议读者参阅 Hillier 与 Lieberman [2005] 或 Winston [2004] 中的综述性章节。更广泛且着眼于应用的论述,由 Cooper [1990]、Gross 与 Harris [1997]、Hall [1991] 以及 Nelson [1995] 给出。后两本著作尤其强调工程与管理方面的应用。
本章讨论排队的一般特征、重要性能度量的含义与相互关系、如何由仿真估计性能的均值度量、改变输入参数所产生的影响,以及少数几个重要且基本的排队模型的数学解。

图 1 简单的排队模型。
1 排队系统的特征
排队系统的关键要素是顾客与服务台。术语"顾客"可以指人、机器、卡车、修理人员、病人、托盘、飞机、电子邮件、箱子、订单或脏衣服——任何到达某一设施并需要服务的东西。术语"服务台"可能指接待员、修理人员、机械师、医务人员、自动存取机器(例如起重机)、机场跑道、自动包装机、订单拣选员、计算机中的 CPU,或者洗衣机——任何提供所请求服务的资源(人、机器等)。尽管本书所用的术语是一位顾客到达一座服务设施,但有时却是服务台移动到顾客那里;例如,修理人员移动到一台出了故障的机器处。这绝不会使模型失效,而仅仅是一个术语上的问题。表 1 列举了若干不同系统,连同由到达的顾客和一个或多个服务台所构成的子系统。本节的其余部分将更详细地描述排队系统的各个组成要素。
表 1 排队系统示例
| 系统 | 顾客 | 服务台 |
|---|---|---|
| 接待处 | 人 | 接待员 |
| 修理设施 | 机器 | 修理人员 |
| 汽车修理厂 | 卡车 | 机械师 |
| 机场安检 | 旅客 | 行李 X 光机 |
| 医院 | 病人 | 护士 |
| 仓库 | 托盘 | 叉车 |
| 机场 | 飞机 | 跑道 |
| 生产线 | 箱子 | 装箱机 |
| 仓库 | 订单 | 订单拣选员 |
| 道路网络 | 汽车 | 交通信号灯 |
| 杂货店 | 购物者 | 收银台 |
| 洗衣房 | 脏衣物 | 洗衣机/烘干机 |
| 作业车间 | 工件 | 机器/工人 |
| 木材堆场 | 卡车 | 高架起重机 |
| 锯木厂 | 原木 | 锯机 |
| 计算机 | 电子邮件 | CPU、磁盘 |
| 电话 | 呼叫 | 交换机 |
| 售票处 | 足球迷 | 售票员 |
| 公共交通 | 乘客 | 公共汽车、列车 |
1.1 呼叫总体
潜在顾客的总体被称为呼叫总体(calling population),可以假定为有限的或无限的。例如,考虑一家小型公司的员工个人电脑,由三名技术人员组成的 IT 小组提供支持。当某台电脑出现故障、需要新软件等情形时,就由 IT 小组中的一名成员来处理。这些电脑就是顾客,它们在需要关注的那一刻到达。IT 小组成员则是提供服务,即进行修理、软件更新等工作的服务台。这里的呼叫总体是有限的,由公司的这些个人电脑构成。
在潜在顾客数量庞大的系统中,呼叫总体通常被假定为无限的。对此类系统而言,这一假定通常是无害的,而且还可能简化模型。无限总体的例子包括一家餐馆、银行或其他类似服务设施的潜在顾客,也包括一家超大型公司员工的个人电脑。尽管实际的总体可能是有限的但很大,但只要任意时刻正在接受服务或等待服务的顾客人数只占潜在顾客总体的很小比例,使用无限总体模型一般而言就是安全的。
有限总体模型与无限总体模型之间的主要差别在于到达率是如何定义的。在无限总体模型中,到达率(即单位时间内的平均到达数)不受已经离开呼叫总体并加入排队系统的顾客人数的影响。当到达过程在时间上是齐次的(例如没有高峰时段),到达率通常被假定为常数。另一方面,对于有限呼叫总体模型,进入排队系统的到达率确实取决于正在接受服务和正在等待的顾客人数。举一个极端的情形,假定呼叫总体只有一名成员,例如一架公务机。当这架公务机正由一天 24 小时值班的机械师小组进行维修时,到达率为零,因为不存在其他可能到达该服务设施(机械师小组)的潜在顾客(飞机)。一个更典型的例子是分配给一名护士的五名住院病人。当所有病人都在休息且护士空闲时,到达率达到最大,因为下一瞬间任何一名病人都可能呼叫护士请求帮助。而在五名病人都已呼叫过护士的那些时刻(四人在等待护士,一人正在接受服务),到达率为零;也就是说,在护士完成对某位病人的服务之前,不可能有到达发生——此时该病人返回呼叫总体,重新成为一名潜在到达者。当五名病人都在休息时到达率最大,这看起来也许有些奇怪。但到达率的定义是下一单位时间内的期望到达数,因此当所有病人在下一单位时间内都可能呼叫护士时,这一期望值最大。
1.2 系统容量
在许多排队系统中,允许处在排队线或系统中的顾客数量是有限制的。例如,一座自动洗车房可能只允许排 10 辆车等待进入洗车机构。让汽车在街道上排队可能过于危险(或是违法的)。一位到达时发现系统已满的顾客并不进入系统,而是立即返回呼叫总体。有些系统,例如面向学生的演唱会门票现场销售,可被视为具有无限容量,因为对被允许等待购票的学生人数没有任何限制。后面将会看到,当系统容量有限时,需要在到达率(arrival rate,即单位时间内的到达数)与有效到达率(effective arrival rate,即单位时间内到达并进入系统的顾客数)之间作出区分。
1.3 到达过程
对于无限总体模型,到达过程通常用相继顾客的到达间隔时间(interarrival time)来刻画。到达可能发生在预定时刻,也可能发生在随机时刻。当发生在随机时刻时,到达间隔时间通常用一个概率分布来刻画。此外,顾客可能一次到达一位,也可能成批到达。批量可以是固定大小,也可以是随机大小。
随机到达最重要的模型是泊松到达过程(Poisson arrival process)。若 表示顾客 n − 1 与顾客 n 之间的到达间隔时间( 是第一位顾客的实际到达时刻),那么,对于泊松到达过程, 服从均值为 时间单位的指数分布。到达率为每时间单位 λ 位顾客。在长度为 t 的时间区间内的到达数,记为 ,服从均值为 λt 位顾客的泊松分布。
泊松到达过程已经被成功地用作以下情形的模型:人们到达餐馆、免下车银行以及其他服务设施;呼叫到达呼叫中心;需求(或对某项服务、某件产品的订单)的到达;失效零部件或机器到达修理设施。典型地,泊松到达过程被用来描述一个庞大的呼叫总体,顾客从中独立地作出关于何时到达的决定。
第二类重要的到达是计划到达(scheduled arrival),例如到达医生办公室的病人,或到达机场的定期航班。在这种情形下,通常更容易对相对计划到达时刻的正、负偏差建模,而不是对到达间隔时间本身建模。
第三种情形是假定队列中至少总有一位顾客在场,因而服务台绝不会因为缺少顾客而空闲。例如,顾客可以代表某种产品的原材料,并且假定总有充足的原材料可供使用。
对于有限总体模型,到达过程以一种完全不同的方式来刻画。当某位顾客处在排队系统之外、并且是潜在呼叫总体的成员时,就把该顾客定义为待服务的(pending)。例如,一位住院病人在休息时是待服务的,而在其呼叫护士的那一刻起就不再是待服务的。把某位给定顾客的运行时间(runtime)定义为:从离开排队系统起、到该顾客下一次到达排队系统为止的这段时间的长度。令 . 为顾客 i 的相继运行时间;令 . 为相应的相继服务时间;令 . 为每次访问排队系统时相应的、开始服务前的等待时间。于是, 是顾客 i 在第 n 次访问期间在系统中度过的总时间。图 2 针对医院例子中的 3 号病人说明了这些概念。总的到达过程是全体顾客到达时刻的叠加。图 2 显示了 3 号病人的第一次和第二次到达,但这两个时刻未必是系统的两次相继到达。例如,若假定所有病人在时刻 0 都是待服务的,则系统的第一次到达发生在时刻 , 那么 2 号病人就是时刻 0 之后的第一个到达者(即第一个呼叫护士的人)。如前面所讨论的,到达率不是常数,而是待服务顾客人数的函数。
有限总体模型的一项重要应用是机器修理问题。机器是顾客,运行时间也称为故障前时间(time to failure)。当一台机器发生故障时,它到达排队系统(修理设施),并在那里停留到它被服务(修好)为止。某一类机器的故障前时间已用指数分布、Weibull 分布和伽马分布加以刻画。具有指数运行时间的模型有时在解析上是可处理的;第 5 节给出了一个例子。相继的故障前时间通常假定在统计上相互独立,但它们也可能依赖于其他因素,例如一台机器自上次大修以来的使用年限。
3 号病人的状态:

图 2 有限总体模型的到达过程。
1.4 排队行为与排队规则
排队行为(queue behavior)指的是顾客在排队等待服务开始期间的行为。在某些情形下,到来的顾客有可能止步(balk,看到队伍太长就离开)、中途退出(renege,在排队过程中看到队伍移动太慢而离开),或者转队(jockey,如果认为自己所排的队伍较慢就从一条队移到另一条队)。
排队规则(queue discipline)指的是队列中顾客的逻辑排序,它决定当某个服务台空闲时将选择哪一位顾客接受服务。常见的排队规则包括先进先出(FIFO)、后进先出(LIFO)、随机顺序服务(SIRO)、最短加工时间优先(SPT),以及按优先级服务(PR)。在制造系统中,排队规则有时基于交货期,以及某一给定类型工件的预计加工时间。注意,FIFO 排队规则意味着服务开始的顺序与到达的顺序相同,但由于服务时间长短不同,顾客离开系统的顺序却可能不同。
1.5 服务时间与服务机构
相继到达者的服务时间记为 。它们可以是常数,也可以是随机时长。在后一种情形下, 通常被刻画为一列独立同分布的随机变量。指数分布、Weibull 分布、伽马分布、对数正态分布和截断正态分布,都已被成功地用作不同情形下服务时间的模型。有时,对某一给定类型、类别或优先级的所有顾客,服务是同分布的,而不同类型的顾客却可能具有完全不同的服务时间分布。此外,在某些系统中,服务时间取决于一天中的时段,或者取决于排队线的长度。例如,当排队线很长时,服务提供者可能工作得比平常更快,从而有效地缩短了服务时间。
一个排队系统由若干服务中心(service center)以及相互连接的队列构成。每个服务中心由若干并行工作的服务台组成,其个数记为 c;也就是说,一旦到达队首,顾客就占用第一个可用的服务台。并行服务机构分为单服务台 、多服务台 ,或无限服务台(c )。自助服务设施通常被刻画为具有无限多个服务台。
例 1
考虑一家折扣仓储店,顾客或者自助购物,或者等待三名店员中的一位提供服务,最后在向唯一的收银员付款后离开。该系统由图 3 中的流程图表示。由队列 2 和服务中心 2 构成的子系统在图 4 中给出了更详细的展示。服务机构的其他变型包括批量服务(一个服务台同时为若干位顾客服务),以及一位顾客同时需要若干个服务台。在这家折扣仓储店中,一名店员可能同时拣取若干份小额订单,但搬动一件重物却可能需要两名店员。

图 3 具有三个服务中心的折扣仓储店。

图 4 服务中心 2,其中有 c = 3 个并行服务台。
例 2
某糖果制造商有一条生产线,由三台机器组成,机器之间由在制品库存缓冲区隔开。第一台机器制作并包装单块糖果,第二台机器把 50 块糖装入一个盒子,第三台机器封合并包裹这个盒子。两个库存缓冲区的容量各为 1000 盒。如图 5 所示,该系统被建模为具有三个服务中心,每个中心有 c = 1 个服务台(一台机器),机器之间带有队列容量约束。假定在第一个队列处总有充足的原材料供应。由于存在队列容量约束,机器 1 在其库存缓冲区(队列 2)被装满时停机,而机器 2 在其缓冲区被排空时停机。简而言之,该系统由三个串联的单服务台队列构成,带有队列容量约束,并在第一个队列处有一个连续的到达流。

图 5 糖果生产线。
2 排队记号
鉴于排队系统的多样性,Kendall [1953] 提出了一套用于并行服务台系统的记号体系,并已被广泛采用。这一约定的简化版本基于 的格式。这些字母代表如下系统特征:
A 表示到达间隔时间的分布。
B 表示服务时间的分布。
c 表示并行服务台的个数。
N 表示系统容量。
K 表示呼叫总体的规模。
A 与 B 的常用符号包括 M(指数分布或马尔可夫的)、D(常数或确定性的)、(k 阶厄兰分布)、PH(相位型)、H(超指数分布)、G(任意分布或一般分布),以及 GI(一般独立分布)。
例如, 表示一个单服务台系统,它具有无限的排队容量和无限的潜在到达者总体。其到达间隔时间与服务时间均服从指数分布。当 N 与 K 为无穷时,可以从记号中省略。例如, 常被缩写为 。照料 5 名住院病人的那位护士可以表示为 。本章其余各处对并行服务台系统所使用的附加记号列于表 2。这些记号的含义可能因系统不同而略有差异。所有系统都将假定采用 FIFO 排队规则。
表 2 并行服务台系统的排队记号
| 稳态下系统中有 n 位顾客的概率 | |
|---|---|
| 时刻 t 系统中有 n 位顾客的概率 | |
| 到达率 | |
| 有效到达率 | |
| 单个服务台的服务率 | |
| 服务台利用率 | |
| 顾客 n − 1 与顾客 n 之间的到达间隔时间 | |
| 第 n 位到达顾客的服务时间 | |
| 第 n 位到达顾客在系统中度过的总时间 | |
| 顾客 n 在队列中等待度过的总时间 | |
| 时刻 t 系统中的顾客数 | |
| 时刻 t 队列中的顾客数 | |
| L | 系统中顾客的长期按时间平均数 |
| 队列中顾客的长期按时间平均数 | |
| w | 每位顾客在系统中度过的长期平均时间 |
| 每位顾客在队列中度过的长期平均时间 |
3 排队系统的长期性能度量
排队系统主要的长期性能度量是:系统中与队列中顾客的长期按时间平均数(L)与(、每位顾客在系统中与队列中度过的长期平均时间(w)与(,以及服务台利用率,即一个服务台忙碌时间所占的比例(ρ)。术语"系统"通常指排队线加上服务机构,但一般而言可以指排队系统的任意子系统;另一方面,术语"队列"仅指排队线本身。其他值得关注的性能度量包括:在队列中被延误超过 时间单位的顾客所占的长期比例、因容量限制而被拒之门外的顾客所占的长期比例,以及排队线中顾客数多于 位的时间所占的长期比例。
本节针对一般的 排队系统定义主要的各项性能度量,讨论它们之间的相互关系,并说明如何由一次仿真运行来估计它们。估计量有两类:普通样本平均,以及按时间积分(或按时间加权)的样本平均。
3.1 系统中顾客的按时间平均数 L
考虑一个排队系统在一段时间 上的情形,令 表示时刻 t 系统中的顾客数。图 6 给出了这样一个系统的一次仿真。令 表示在 [0, T] 期间系统内恰有 i 位顾客的总时间。

图 6 时刻 t 系统中的顾客数 。
由图 可见,, 以及 。(那些长度合计为 的线段在图 6 中被标注为 ,等等。)一般地,。系统中按时间加权平均的顾客数定义为
对于图 位顾客。注意, 正是系统内恰有 i 位顾客的时间所占的比例。估计量 是时间加权平均的一个例子。
通过考察图 可以看出,函数 下方的总面积可以分解成若干个高为 i、长为 的矩形。例如,面积为 的那个矩形,其底边从 (因此 然而,多数矩形被拆成了若干段,例如面积为 的那个矩形,其底边的一段位于 与 之间,其余部分位于 与 之间(因此 。由此可知,总面积由 给出,从而
式 (1) 与式 (2) 中的这两个表达式对任意排队系统恒等成立,而与服务台个数、排队规则或任何其他特殊情况无关。式 (2) 也印证了"按时间积分平均"这一术语。
许多排队系统就其平均性能而言表现出某种长期稳定性。对此类系统,随着时间 增大,所观测到的系统中按时间平均的顾客数 趋近于一个极限值,记为 称之为系统中顾客的长期按时间平均数——即,以概率 1,
估计量 被称为对 L 强相合的(strongly consistent)。若仿真运行长度 T 足够长,估计量 就会任意地接近 L。遗憾的是,当 时, 依赖于时刻 0 的初始条件。
式 (2) 与式 (3) 既可应用于整个排队系统,也可应用于排队系统的任意子系统。若 表示队列中等待的顾客数, 表示在 期间恰有 i 位顾客在队列中等待的总时间,则
其中 是从时刻 0 到时刻 T 期间所观测到的按时间平均的队列中等待顾客数,而 是队列中等待顾客的长期按时间平均数。
例 3
假定图 6 表示一个单服务台队列——即一个 排队系统 。那么队列中等待的顾客数由 给出,定义为
并如图 7 所示。因此,, 且 。于是,
3.2 平均每位顾客在系统中度过的时间 w
如果把某个排队系统仿真一段时间,比如说 T,那么我们可以记录在 [0, T] 期间每位顾客在系统中度过的时间,记为 ,其中 N 是 [0, T] 期间的到达数。平均每位顾客在系统中度过的时间称为平均系统时间(average system time),由普通样本平均给出
对于稳定系统,当 时
以概率 1 成立,其中 w 称为长期平均系统时间(long-run average system time)。

图 7 时刻 t 队列中等待的顾客数 。
若所考虑的系统只是队列本身,则式 (5) 与式 (6) 写作
其中 是顾客 i 在队列中等待的总时间, 是所观测到的平均在队列中等待的时间(称为延误,delay),而 是长期平均的每位顾客延误。与 类似,估计量 与 也受到时刻 0 的初始条件以及运行长度 T 的影响。
例 4
对于图 6 所示的系统历史, 位顾客到达,,且 但除非对系统了解更多,否则无法算出 与 。假定系统有一个服务台并采用 FIFO 排队规则。这意味着顾客离开系统的顺序与到达的顺序相同。图 6 中 的每一次向上跳跃代表一次到达。到达发生在时刻 0、3、5、7 和 16。类似地,离开发生在时刻 2、8、10 和 14。(在时刻 20 可能发生过、也可能没有发生过一次离开。)在这些假定下,显然有 ,因此
于是,平均而言,这些顾客在系统中度过了 4.6 个时间单位。至于在排队线中度过的时间,可以算出 , 以及 于是,
3.3 守恒方程:±b L = λ ±b w
对于图 6 所展示的系统,在 个时间单位内有 次到达,因此所观测到的到达率为 位顾客每时间单位。回顾 且 因此可得
与 w 之间的这一关系并非巧合;它对几乎所有排队系统或子系统都成立,而与服务台个数、排队规则或任何其他特殊情况无关。令 且 ,式 (8) 变为
其中 ,而 λ 是长期平均到达率。式 (9) 称为守恒方程(conservation equation),通常归功于 Little [1961]。它表明:在任意时刻系统中顾客的平均数,等于每时间单位的平均到达数乘以平均在系统中度过的时间。对于图 6,平均每 4 个时间单位有一次到达,且每次到达平均在系统中度过 4.6 个时间单位,因此在任意时刻平均会有 位顾客在场。
式 (8) 也可以按如下方式重新考察图 6 而导出:图 8 给出的系统历史 与图 6 完全一样,其中每位顾客在系统中的时间 用一个矩形来表示。这一表示同样假定是单服务台、FIFO 排队规则的系统。第三位与第四位顾客的矩形分别被分成了两段和三段。对每个 ,第 i 个矩形的高为 1、长为 。由此可知,全体顾客的系统时间总和由"系统中顾客数"函数 L(t) 下方的总面积给出,即
因此,把式 (2) 与式 (5) 相结合,并代入 ,可得
这就是 Little 的式 (8)。此处给出的直观而非形式化的推导依赖于单服务台 FIFO 的假定,但这些假定并非必要。事实上,作为推导关键的式 (10) 在极大的范围内(至少近似地)成立,因此式 (8) 与式 (9) 同样如此。习题 14 与习题 15 要求读者在不同假定下推导式 (10) 与式 (8)。

图 8 单服务台 FIFO 系统的系统时间 。
技术性说明:若 是顾客 i 在 [0, T] 期间的系统时间,则式 (10) 从而式 (8) 精确成立。有些作者选择把 定义为顾客 i 的总系统时间;这一改动只会影响那些在时刻 T 之前到达、却直到时刻 T 之后才离开的顾客 i(图 8 中的第 5 位顾客可能就是如此)的 值。作了这一定义上的改变之后,式 (10) 与式 (8) 只近似成立。尽管如此,随着 ,式 (8) 中的误差趋于零,因此针对长期性能度量的守恒方程 (9)——即 ——仍然精确成立。
3.4 服务台利用率
服务台利用率(server utilization)定义为一个服务台忙碌时间所占的比例。所观测到的服务台利用率记为 是在一个指定的时间区间 [0, T] 上定义的。长期服务台利用率记为 对于表现出长期稳定性的系统,
例 5
由图 6 或图 8,并假定系统有一个服务台,可以看出服务台利用率为 (总忙碌时间)
G/G/1/∞/∞ 队列中的服务台利用率
考虑任意一个单服务台排队系统,其平均到达率为每时间单位 λ 位顾客,平均服务时间为 个时间单位,且排队容量与呼叫总体均无限。注意, 意味着:当服务台忙碌时,它平均以每时间单位 位顾客的速率工作; 称为服务率。服务台自身是一个子系统,可以被当作一个排队系统来看待;因此,守恒方程 (9) 可以应用于该服务台。对于稳定系统,到达服务台的平均到达率,记为 ,必须与到达系统的平均到达率 λ 相同(当然 ——顾客被服务的速度不可能快于他们到达的速度——但是,若 ,则排队线的长度将趋于以每时间单位 位顾客的平均速率增长,于是我们将得到一个不稳定系统)。对于服务台子系统,平均系统时间为 。服务台子系统中的实际顾客数为 0 或 1,如图 9 所示(针对图 6 所代表的系统)。因此,服务台子系统中的平均顾客数 由下式给出
在此情形下, 一般地,对于一个单服务台队列,在任意时刻正在接受服务的平均顾客数等于服务台利用率。当 时,。把这些结果代入服务台子系统的 ,得到

图 9 时刻 t 正在接受服务的顾客数 。
也就是说,单服务台队列中的长期服务台利用率等于平均到达率除以平均服务率。要使一个单服务台队列稳定,到达率 λ 必须小于服务率
或
如果到达率大于服务率 ,服务台最终将落后得越来越远。过一段时间之后,服务台将始终处于忙碌状态,且排队线的长度将趋于以每时间单位 位顾客的平均速率增长,因为离开将以每时间单位 的速率发生。对于稳定的单服务台系统 ,诸如平均队长 (以及 , 和 这类长期性能度量有良好定义且具有意义。对于不稳定系统 ,长期服务台利用率为 1,而长期平均队长为无穷大;即
类似地,。因此,这些长期性能度量对于不稳定队列是没有意义的。量 也称为提供负载(offered load),它是对施加于系统之上的工作负载的一种度量。
G/G/c/∞/∞ 队列中的服务台利用率
考虑一个有 c 个相同服务台并行工作的排队系统。如果一位到达的顾客发现不止一个服务台空闲,那么该顾客在选择服务台时并不偏向任何一个特定的服务台。(例如,服务台的选择可以随机作出。)到达以速率 λ 从一个无限呼叫总体发生,且每个服务台以每时间单位 位顾客的速率工作。由式 (9) 单独应用于服务台子系统,通过与单服务台情形类似的论证可得如下结果:对于处于统计平衡的系统,平均忙碌服务台数(记为 )由下式给出
显然,。长期平均服务台利用率定义为
因而 。利用率 可以解释为:从长期看,任意一个服务台忙碌时间所占的比例。
系统的最大服务率为 ,它出现在所有服务台都忙碌之时。为使系统稳定,平均到达率 λ 必须小于最大服务率 也就是说,系统稳定当且仅当
或等价地说,当且仅当提供负载 小于服务台个数 c。若 ,则到达平均而言发生得比系统能够处理的更快,所有服务台将持续忙碌,且排队线的长度将以每时间单位 位顾客的平均速率增长。这样的系统是不稳定的,长期性能度量 , 以及 对于这类系统同样没有意义。
注意,条件 (15) 推广了条件 (12),而稳定系统利用率的公式——式 (14)——则推广了式 (11)。
当某些服务台比其他服务台工作得更多时,式 (13) 与式 (14) 也同样适用;例如,当顾客偏向某一个服务台而不选其他服务台时,或者当某些服务台仅在其他所有服务台都忙碌时才服务顾客时。在这种情形下,由式 (13) 给出的 仍然是平均忙碌服务台数,但由式 (14) 给出的 却不能应用于单个服务台。此时, 必须解释为所有服务台的平均利用率。
例 6
顾客以 位顾客每小时的速率随机到达一个执照办理处。目前有 20 名办事员,每人平均服务 位顾客每小时。因此,由式 (14) 给出的、一名服务台的长期(或稳态)平均利用率为
而平均忙碌服务台数为
因此,从长期看,一名典型办事员只有 50% 的时间在忙着服务顾客。办公室主任问是否可以减少服务台数量。由式 (15) 可知,为使系统稳定,服务台个数必须满足
或 。因此,可供这位主任考虑的方案包括 或 。注意, 只是在这样的意义上保证长期稳定:当所有服务台都忙碌时,它们平均能够处理到来的工作负载 。由于顾客延误、排队线长度等其他因素,这位办公室主任很可能希望服务台数多于最少的服务台数 。一个稳定的队列平均而言仍然可能有很长的队伍。

图 10 确定性队列
服务台利用率与系统性能
正如此处以及后面几节将要说明的,对于给定的利用率 ,系统性能可能差异极大。考虑一个 队列,即一个到达率为 、服务率为 、利用率为 的单服务台队列。考察一个极端情形: 队列,它具有确定性的到达时间与服务时间。于是所有到达间隔时间 都等于 ,而所有服务时间 都等于 。假定一位顾客在时刻 0 到达了一个空系统,则系统以一种完全确定的、可预测的方式演化,如图 10 所示。可以看到 , 且 。通过改变 与 ,服务台利用率可以取 0 与 1 之间的任意值,然而却从不出现任何队伍。那么,如果不是高的服务台利用率,究竟是什么导致队伍形成呢?一般而言,正是到达间隔时间与服务时间的变异性(variability)导致队伍长度发生波动。
例 7
考虑一位医生,他每隔 10 分钟预约一位病人,并与第 i 位病人相处 分钟,其中
因此,到达是确定性的 ,但服务是随机的(或概率性的),其均值与方差由下式给出

图 11 时刻 t 医生办公室中的病人数。
以及
此处,,系统是稳定的,且这位医生从长期看将有 93% 的时间处于忙碌状态。在短期内,只要病人只需要 9 分钟的服务,队伍就不会形成;但由于服务时间的变异性,有 10% 的病人将需要 12 分钟,这转而又会造成一条临时队伍的形成。
假定对该系统进行仿真,服务时间为 9, . . . . 。假定在时刻 0 一位病人到达并发现医生空闲,其后的病人精确地在时刻 10、20、30, . . . 到达,则系统按图 11 所示的方式演化。队列中的延误为 。一个相对较长的服务时间(此处为 的出现导致了一条排队线临时形成。一般而言,由于到达间隔分布与服务分布的变异性,相对较小的到达间隔时间与相对较大的服务时间偶尔确实会出现,这些转而导致队伍变长。反之,一次大的到达间隔时间或一次小的服务时间的出现,则倾向于缩短一条已经存在的排队线。利用率、服务与到达间隔的变异性以及系统性能之间的关系,将在第 4 节中作更详细的探讨。
3.5 排队问题中的成本
在许多排队情形中,成本可以与排队线或服务台的各个方面相联系。假定系统为队列中的每位顾客承担成本,比如说按每位顾客每小时 10 美元的费率计。如果顾客 j 在队列中度过 小时,那么 就是在仿真期间到达的 N 位顾客的总成本。于是,平均每位顾客的成本为
这里用到了式 (7)。若平均每小时有 位顾客到达,则平均每小时的成本为
最后一个等式由式 (8) 得到。推导平均每小时成本的另一种途径是考虑式 (2)。若 是在区间 [0, T] 上系统内恰有 i 位顾客的总时间,则 $10 就是系统在恰有 i 位顾客在场的那段时间内所发生的成本。因此,总成本为 ,而平均每小时的成本为
这里用到了式 (2)。在这些成本表达式中, 可以由 代替(若已知队列中顾客的长期数),或者由 L 或 代替(若顾客在受到延误之外,其在接受服务期间也会发生成本)。
服务台也可能给系统带来成本。若一组 c 个并行服务台 的利用率为 且每个服务台在忙碌时每小时带来 5 美元的成本,则每小时的总服务台成本为
因为 是平均忙碌服务台数。若服务台成本只在服务台空闲时才发生,则每小时的服务台成本为
因为 是平均空闲服务台数。在许多问题中,会把这些不同成本中的两项或更多项合并成一个总成本。习题 1、, 和 19 说明了这类问题。在大多数情形下,目标是通过改变那些处在管理层控制之下的参数——例如服务台个数、到达率、服务率和系统容量——来使总成本最小(在给定某些约束的条件之下)。
4 无限总体马尔可夫模型的稳态行为
本节给出若干可用数学方法求解的排队模型的稳态结果。对于无限总体模型,假定到达服从速率为每时间单位 λ 次到达的泊松过程——即,假定到达间隔时间服从均值为 的指数分布。服务时间可以是指数分布的(M)或任意分布的(G)。排队规则将是 FIFO。由于对到达过程所作的指数分布假定,这些模型被称为马尔可夫模型(Markovian model)。
如果一个排队系统处在某一给定状态的概率不随时间变化,即
与时间 t 无关,则称该系统处于统计平衡(statistical equilibrium)或稳态(steady state)。两条性质——从任意起始状态趋近于统计平衡,以及一旦达到统计平衡便保持在其中——是许多随机模型的特征,尤其是下面各小节所研究的所有系统的特征。另一方面,如果一位分析人员关心的是一个队列在相对较短时期内的暂态(transient)行为,并且被给定了某些特定的初始条件(例如空闲且为空),那么这里将要给出的结果就不合适了。此时,一次暂态的数学分析,或者更有可能地,一个仿真模型,将是被选用的分析工具。
下面各小节给出其解的那些数学模型,即使在该模型的假定并不严格成立时,也可用来获得近似结果。这些结果可以被看作是对系统行为的一种粗略指引。随后便可以用仿真进行更精细的分析。然而应当记住:数学分析(当它适用时)给出的是模型参数的真值(例如 L),而仿真分析给出的则是该参数的一个统计估计值 。另一方面,对于复杂系统,仿真模型往往比数学模型是更为忠实的表示。
对于此处研究的这些简单模型,稳态参数 L(系统中顾客数的按时间平均数)可以按下式计算:
其中 是发现系统中有 n 位顾客的稳态概率(如表 2 中所定义)。正如第 3 节所讨论并由式 (3) 所表达的那样,L 也可以被解释为系统的一种长期性能度量。一旦给定 L,其他的稳态参数便可以方便地由 Little 方程 (9)——分别应用于整个系统和单独应用于队列——算出:
其中 λ 是到达率,μ 是每个服务台的服务率。
对于本节所考察的 队列而言,要存在统计平衡,一个必要且充分的条件是 ,其中 λ 是到达率, 是单个服务台的服务率,c 是并行服务台的个数。对于这些容量无限、呼叫总体无限的模型,假定理论上的服务台利用率 满足 。对于系统容量有限或呼叫总体有限的模型,量 可以取任意正值。
4.1 具有泊松到达与无限容量的单服务台队列:M/G/1
假定服务时间的均值为 、方差为 ,并且只有一个服务台。若 1,则 队列具有稳态概率分布,其稳态特征如表 3 所示。一般地,稳态概率 没有简单的表达式。当 ,量 就是服务台利用率,或者说服务台忙碌时间的长期比例。由表 也可以看出,它还能解释为系统中含有一位或多位顾客的稳态概率。还要注意, 是正在接受服务的顾客的按时间平均数。
表 3 队列的稳态参数
例 8
顾客到达一家免预约的修鞋店,看上去是随机的。假定到达按速率 每小时的泊松过程发生。经过几个月的观察发现,唯一一位工人的修鞋时间平均为 30 分钟,标准差为 20 分钟。因此平均服务时间 小时,服务率为每小时 ,且 minutes^2 1/9 hour^2。这里的"顾客"是需要修鞋的人,而恰当的模型是 队列,因为只知道服务时间的均值与方差,并不知道它们的分布。这位工人忙碌的时间比例为 ,并且由表 3,店内顾客的稳态按时间平均数为
因此,一位在任意时刻记录该修鞋系统状态的观察者会发现平均有 2.375 位顾客(从长期看)。
更仔细地考察表 3 中的公式,可以揭示 队列中排队线与延误的来源。例如, 可以改写为
第一项只涉及平均到达率 λ 与平均服务率 之比。正如第二项所示,若 λ 与 保持不变,则排队线的平均长度 取决于服务时间的变异性 。如果两个系统具有相同的平均服务时间与平均到达间隔时间,那么,服务时间变异性更大( 更大)的那个系统,平均而言往往会有更长的队伍。直观地看,如果服务时间高度可变,那么出现一次很大的服务时间(比如说远大于平均服务时间)的概率就很高,而当大的服务时间确实发生时,队伍形成以及顾客延误增加的倾向就高于平常。(读者不应把"稳态"与低变异性或短队伍混为一谈;一个处于稳态或统计平衡的系统,可能高度可变,也可能有很长的排队线。)
例 9
有两位工人竞争一份工作。Able 声称自己的平均服务时间比 Baker 的更快,但 Baker 声称自己更加稳定,尽管没有那么快。到达按速率 每小时(每分钟 1/30)的泊松过程发生。Able 的服务统计量是:平均服务时间 24 分钟,标准差 20 分钟。Baker 的服务统计量是:平均服务时间 25 分钟,但标准差只有 2 分钟。如果以队列的平均长度作为录用标准,应当录用哪一位工人?对于 Able, 每分钟, 分钟, minutes^2,,平均队长计算如下:
对于 Baker, 每分钟, 分钟, minutes^2,,平均队长为
尽管 Able 的平均工作速度更快,但其更大的服务变异性导致平均队长比 Baker 的大约 30%。以平均队长 为准,Baker 胜出。另一方面,到达时发现 Able 空闲从而毫无延误的到达者比例为 , 而发现 Baker 空闲从而毫无延误的到达者比例为 。
队列中有一种特别值得注意的情形,即服务时间服从指数分布时,这将在下面加以描述。
M/M/1 队列。 假定一个 队列中的服务时间服从均值为 的指数分布,那么由方程 与 所给出的方差为 。指数分布的均值与标准差相等,因此当服务时间的标准差近似等于其均值时, 队列常常是一个有用的近似模型。表 4 中给出的稳态参数,可以通过把 代入表 3 中的公式而算出。另一种方法是,用式 (16) 从表 4 给出的稳态概率 算出 L,然后再由式 (17) 中的方程算出 w、 与 。读者可以证明:把 代入表 4 中每个方程的右端,即可得到每个参数的两个表达式彼此等价。
表 4 队列的稳态参数
例 10
假定某家只有一张座椅的男女通用美发店的到达间隔时间与服务时间都已被证明服从指数分布。λ 与 的值分别为每小时 2 位与每小时 3 位——也就是说,到达之间的时间平均为 小时、且服从指数分布,而服务时间平均为 20 分钟、同样服从指数分布。服务台利用率以及店内有 位和 4 位或更多顾客的概率计算如下:
由这些计算可知,美发师忙碌的概率为 ;因此,美发师空闲的概率为 0.33。系统中顾客的按时间平均数由表 4 给出为
一位到达者在系统中度过的平均时间可由表 4 或式 (17) 得到:
顾客在队列中度过的平均时间可由式 (17) 得到:
由表 4,队列中的按时间平均数为
最后,注意:把 整体乘以 ,并利用 Little 方程 (9),得到
例 11
对于服务率为每小时 位顾客的 队列,考虑当到达率 λ 以 20% 的步长从 5 增加到 8.64、然后再增加到 时,L 与 w 如何增长:
| 5.0 | 6.0 | 7.2 | 8.64 | 10.0 | |
|---|---|---|---|---|---|
| 0.500 | 0.600 | 0.720 | 0.864 | 1.0 | |
| 1.00 | 1.50 | 2.57 | 6.35 | ||
| 0.20 | 0.25 | 0.36 | 0.73 |
对于任意 队列,若 ,排队线的长度将趋于持续不断地增长;长期性能度量 w、 与 全都无穷大 ;且不存在稳态概率分布。正如这里对 所表明的,若 接近于 1,排队线与延误往往会很长。注意,平均系统时间 w 与系统中平均数 L 作为 的函数,其增长是高度非线性的。例如,当 λ 增加 20% 时,L 先是增加 50%(从 1.00 到 1.50),然后增加 71%(到 2.57),再增加 147%(到 6.35)。
例 12
若到达以 每小时的速率发生,且管理层可以在两名服务提供者之间做选择,其中一位以 位顾客每小时的速率工作、另一位以 位顾客每小时的速率工作,则相应的利用率为 与 。若采用 队列作为近似模型,那么,使用第一位服务提供者时,系统中的平均顾客数由表 4 得
而使用第二位服务提供者时,系统中的平均顾客数为
因此,服务率从每小时 11 位顾客提高到每小时 12 位(仅仅 9.1% 的提高),就会使系统中的平均顾客数从 10 下降到 5,即下降了 50%!
利用率与服务变异性的影响
对于任意 队列,如果队伍太长,它们可以通过降低服务台利用率 或降低服务时间变异性 来缩短。这些论断几乎适用于所有队列,而不只是 队列。利用率因子 可以通过降低到达率 、提高服务率 或增加服务台个数来降低,因为一般地有 ,其中 c 是并行服务台的个数。增加服务台的影响将在下面几个小节中加以研究。
一个正随机变量 X 的变异系数的平方(squared coefficient of variation,cv)定义为
它是对一个分布变异性的一种度量。它的值越大,该分布相对于其期望值就越加可变。对于确定性的服务时间,,因此 。对于 k 阶厄兰服务时间, 且 ,因此 。对于服务率为 的指数服务时间,平均服务时间为 、方差为 ,因此 。如果服务时间的标准差大于其均值 ,那么超指数分布(hyperexponential distribution)提供了一个好的模型,它可以达到任意大于 1 的期望变异系数。习题 16 给出了它出现的一个场合。
任意 队列的 公式都可以用变异系数来改写,方法是注意到 。因此,
第一项 正是 队列的 。第二项 对 公式作出修正,以考虑非指数的服务时间分布。 的公式可以通过施加同样的修正因子,从相应的 公式得到。这两个因子 与 ,为深入了解服务台利用率与服务台变异性对队列拥挤程度的相对影响提供了某种洞察:当 时, 急剧增大;而对于固定的 ,它随 线性增长。
4.2 多服务台队列:M/M/c/∞/∞
假定有 c 条通道在并行运转。这些通道各自具有独立且相同的指数服务时间分布,均值为 。到达过程是速率为 λ 的泊松过程。到达者将加入一个单一的队列,并进入第一个可用的服务通道。该排队系统如图 12 所示。如果系统中的顾客数 ,一位到达者将进入某条可用的通道。然而,当 时,若有到达发生,就会形成队列。
提供负载定义为 若 ,则到达率大于或等于系统的最大服务率(即所有服务台都忙碌时的服务率);因此,系统无法处理加于其上的负载,因而它不具有统计平衡。若 ,排队线的长度以每时间单位 位顾客的平均速率增长。顾客以每时间单位 的速率进入系统,却最多以每时间单位 的速率离开系统。
要使 队列具有统计平衡,提供负载必须满足 ,此时 即为服务台利用率。稳态参数列于表 5。多数性能度量可以相当简单地用 (系统为空的概率)来表示,或者用 (所有服务台都忙碌的概率)来表示,后者记为 ,其中 是一个随机变量,表示在统计平衡状态下(经过很长时间之后)系统中的顾客数。于是, 计算所有性能度量都需要用到 的值,而 的方程比前面各种情形稍微复杂一些。不过,可从 www.bcnn.net 获取的电子表格 QueueingTools.xls 会为本章所述的这个排队模型以及所有排队模型执行这些计算。

图 12 多服务台排队系统。
表 5 队列的稳态参数
| ρ | λ/cμ |
|---|---|
| P0 | {[∑n=0c-1/(λ/μ)n/n! ] + [ (λ/μ)c(1/c!) (cμ/cμ-λ)]}-1 |
| = {[∑n=0c-1/(cρ)n/n! ] + [ (cρ)c(1/c!) 1/1-ρ]}-1 | |
| P(L(∞)≥c) | (λ/μ)cP0/c!(1-λ/cμ) = (cρ)cP0/c!(1-ρ) |
| L | cρ + (cρ)c+1P0/c(c!(1-ρ)2) = cρ + ρP(L(∞)≥c)/1-ρ |
| w | L/λ |
| wQ | w - 1/μ |
| LQ | λwQ = (cρ)c+1P0/c(c!(1-ρ)2) = ρP(L(∞)≥c)/1-ρ |
| L - LQ | λ/μ = cρ |
当 (单服务台的情形)时,表 5 中的结果就简化为表 4 中的那些结果。注意,平均忙碌服务台数,或者说正在接受服务的平均顾客数,由简单的表达式 给出。
例 13
排队论早期的许多例子,涉及的是与工具库有关的实际问题。当机械师(假定来自一个无限呼叫总体)到来请求服务时,由管理员管理这些工具库。不过,这个例子同样容易地可以换成顾客到达一家电影院的售票处。假定到达是速率为每分钟 2 名机械师的泊松到达,服务时间服从均值为 40 秒的指数分布。
现在, 每分钟, 每分钟。提供负载大于 1:
因此,如果系统要有统计平衡,就需要不止一个服务台。稳态的要求是 。于是至少需要 名管理员。量 4/3 是忙碌服务台的期望数,而对于 是每个服务台忙碌时间的长期比例。(如果只有 个服务台,会发生什么情况?)
设 名管理员。首先, 计算如下:
接着,所有服务台都忙碌的概率计算如下:
于是,等待的机械师排队线的按时间平均长度为
而系统中的按时间平均顾客数由下式给出:
由 Little 的关系式,一名机械师在工具库度过的平均时间为
而等待一名管理员的平均时间为
M/G/c/∞ 队列的一个近似
回顾一下, 队列的 与 公式可以通过把相应的 公式乘以修正因子 而得到,如式 (18) 所示。 队列的近似公式可以通过对 的 与 公式施加同样的修正因子而得到(对于 ,不存在精确公式)。cv 越接近于 1,该近似越好。
例 14
回顾例 13。假定工具库里机械师的服务时间不是指数分布的,但已知其标准差为 30 秒。于是我们面对的是一个 模型,而不是 。平均服务时间为 40 秒,因此服务时间的变异系数为
因此, 与 的精度可以通过修正因子
加以改进。例如,当有 名管理员时,
注意,由于服务时间的变异系数小于 1,以 度量的系统拥挤程度低于相应的 模型。
修正因子只适用于 与 的公式。然后可以利用 Little 公式来计算 L 与 w。遗憾的是,对于稳态概率 ,并没有通用的修正方法。
服务台个数为无穷时的情形 (M/G/∞/∞)
至少在三种情形中,把服务台个数视为无穷是恰当的:
当每位顾客都是它自己的服务台时——换句话说,在一个自助服务系统中;
当服务容量远远超过服务需求时,如在一个所谓的"充裕服务台"(ample-server)系统中;并且
当我们想知道需要多少个服务台,才能使顾客极少受到延误时。
队列的稳态参数列于表 6。在表中,λ 是泊松到达过程的到达率, 是一般服务时间分布(包括指数分布、常数分布或任何其他分布)的期望服务时间。
表 6 队列的稳态参数
| 0 | |
| 0 | |
例 15
在推出其全新的、仅限订阅者的在线计算机信息服务之前,The Connection 必须就可同时登录的用户数来规划其系统容量。如果该服务取得成功,预计顾客将按每小时 的速率登录(服从一个泊松过程),并保持连接平均 分钟(或 3 小时)。在真实系统中,同时在线的用户数会有一个上限,但出于规划的目的,The Connection 可以假定同时在线的用户数是无穷的。对该系统的一个 模型意味着,同时在线用户的期望数为 ,因此肯定需要大于 1500 的容量。为了确保在 95% 的时间里提供充足的容量,The Connection 可以把同时在线用户数取为满足下式的最小的 c 值:
容量 个同时在线用户满足这一要求。
4.3 具有泊松到达与有限容量的多服务台队列:M/M/c/N/∞
假定服务时间服从速率为 的指数分布,有 c 个服务台,且系统总容量为 位顾客。如果在系统已满时发生一次到达,该到达者就被拒之门外、不进入系统。与前一节一样,假定到达以速率为每时间单位 λ 次到达的泊松过程随机发生。对于任意满足 的 λ 与 µ 的值, 队列都具有统计平衡,其稳态特征如表 7 所示( 情形的公式可在 Hillier 与 Lieberman [2005] 中找到)。
表 7 队列的稳态参数
有效到达率(effective arrival rate) 定义为:每时间单位进入并留在系统中的平均到达数。对于所有系统,;对于容量无限的系统,;但对于诸如此处所讨论的这类在系统已满时把顾客拒之门外的系统,则有 。有效到达率由下式计算:
因为 正是一位顾客在到达时发现有空位、从而能够进入系统的概率。当人们利用 Little 方程 (17) 来计算在系统中度过的平均时间 w 与在队列中度过的平均时间 时,必须用 替换 λ。
例 16
例 10 中描述的那家男女通用美发店只能容纳三位顾客:一位正在接受服务,两位正在等待。当系统已满时,额外的顾客被拒之门外。提供负载如前所述地确定,即 。为计算这些性能度量,首先计算
系统中有三位顾客(系统已满)的概率为
于是,队列的平均长度(等待理发的顾客数)由下式给出:
现在,有效到达率 由下式给出:
因此,由 Little 方程,预期在队列中等待的时间为
而预期在店内的总时间为
最后一次应用 Little 方程,得到店内(在队列中加上正在理发)的期望顾客数为
注意, 是正在接受服务的平均顾客数,或者说,等价地,是单个服务台忙碌的概率。因此,服务台利用率,即服务台忙碌时间的长期比例,由下式给出:
读者应当把这些结果与在未对该系统施加容量约束之前的男女通用美发店的结果作一比较。具体地说,在容量有限的系统中,提供负载 可以取任意正值,并且不再等于服务台利用率 。注意,当系统施加了容量约束时,服务台利用率从 67% 下降到 58.5%。
5 有限总体模型的稳态行为 (M/M/c/K/K)
在许多实际问题中,无限呼叫总体的假定会导致无效的结果,因为呼叫总体实际上是小的。当呼叫总体较小时,系统中存在一位或多位顾客对未来到达的分布有着强烈的影响,而使用无限总体模型可能产生误导。典型例子包括一小群不时发生故障并需要修理的机器,或者一小群由一组护士负责照看的病人。在极端情形下,如果所有机器都已损坏,就不可能发生机器新的"到达"(故障);类似地,如果所有病人都已请求过帮助,就不可能有到达发生。与此形成对照的是无限总体模型,在那类模型中,顾客到达系统的到达率 λ 被假定与系统的状态无关。
考虑一个有 K 位顾客的有限呼叫总体模型。对总体中每一位成员而言,从一次服务访问结束到其下一次请求服务之间的时间,假定服从均值为 个时间单位的指数分布;服务时间同样服从指数分布,均值为 个时间单位;有 c 个并行服务台,系统容量为 K,因而所有到达者都会留下接受服务。图 13 描绘了这样一个系统。
该模型的稳态参数列于表 8。使用一个电子表格或一个符号计算程序来求这些复杂公式的值是有用的。例如,图 14 是为符号计算程序 MATLAB 编写的一个过程,用以计算 队列的稳态概率。可从 www.bcnn.net 获取的电子表格 QueueingTools.xls 也执行这些计算。

图 13 有限总体的排队模型。
表 8 队列的稳态参数
有效到达率 有若干种有效的解释:
- 是顾客到达该队列的长期有效到达率;
- 是顾客进入服务的长期有效到达率;
- 是顾客退出服务的长期速率;
- 是顾客进入呼叫总体(并开始一段新的运行时间)的长期速率;
- 是顾客退出呼叫总体的长期速率。
例 17
有两名工人负责照看 10 台铣床。这些机器平均运行 20 分钟,然后需要平均 5 分钟的服务时段,两个时间都服从指数分布。因此, 且 。计算该系统的各项性能度量。
所有的性能度量都依赖于 ,其为
图 14 计算 队列的 的 MATLAB 过程。
由 我们可以得到其他的 ,由此可以算出等待服务的平均机器数,
有效到达率,
以及队列中的平均等待时间,
类似地,我们可以算出正在接受服务或等待接受服务的机器期望数,
正在接受服务的平均机器数由下式给出:
每台机器必定处于运行中、等待服务中或正在接受服务这三种状态之一,因此平均运行中的机器数由下式给出:
一个经常被问到的问题是:如果增加或减少服务台个数,会发生什么?如果本例中工人数增加到三名(c = 3),那么运行中机器的按时间平均数增加到
平均增加了 0.91 台机器。
反过来,如果服务台减少到一个,会发生什么?此时运行中机器的按时间平均数减少到
从两个服务台减到一个,平均导致运行中的机器减少了近三台。习题 17 要求读者考察增加或删减一个服务台对服务台利用率的影响。
例 17 说明了若干已被发现几乎对所有队列都成立的一般关系。如果服务台个数减少,那么延误、服务台利用率以及一位到达者必须等待才能开始服务的概率都会上升。
6 排队网络
在本章中,我们着重研究了 类型的单个队列。然而,许多系统很自然地被建模为单个队列所构成的网络,其中从一个队列离开的顾客可以被路由到另一个队列。例 1(尤其参见图 3)与例 2(参见图 5)就是这方面的例证。
对排队网络之数学模型的研究超出了本章的范围;例如可参见 Gross 与 Harris [1997]、Nelson [1995] 以及 Kleinrock [1976]。不过,有若干基本原理对于粗略建模非常有用,也许可以在开展一次仿真研究之前加以使用。以下结果假定系统稳定、呼叫总体无限且系统容量不受限制:
只要在队列中没有顾客被创造或消灭,那么从长期看,离开一个队列的离开率就等于进入该队列的到达率。
若顾客以速率 到达队列 i,且其中比例 的顾客在离开时被路由到队列 j,那么从长期看,从队列 i 流向队列 j 的速率为 。
进入队列 的总到达率是来自所有来源的到达率之和。若顾客以速率 从网络之外到达,则
- 若队列 j 有 个并行服务台,每个以速率 工作,则每个服务台的长期利用率为
且队列要稳定必须满足 。
- 若对于每个队列 j,来自网络之外的到达构成一个速率为 的泊松过程,并且若有 个相同的服务台提供均值为 的指数分布服务时间(其中 可以为 ,那么在稳态下,队列 j 的行为就像一个到达率为 的 队列。
例 18
再次考察例 1 中所描述并在图 3 中显示的折扣店。假定顾客以每小时 80 位的速率到达,且在这些到达者中,有 40% 选择自助服务;于是,到达服务中心 1 的到达率为 每小时,而到达服务中心 2 的到达率为 每小时。假定服务中心 2 处的 名店员各以 位顾客每小时的速率工作。那么这些店员的长期利用率为
所有顾客都必须到服务中心 3 的收银员那里。到达服务中心 3 的总到达率为 每小时,而与服务中心 1 的服务率无关,因为从长期看,离开每个服务中心的离开率必定等于进入它的到达率。如果该收银员以 每小时的速率工作,那么收银员的利用率为
7 粗略建模:一个示例
在本节中,我们说明如何运用本章所介绍的工具,在着手进行一次更详细的仿真之前开展一次粗略分析(rough-cut analysis)。粗略建模在若干方面是有用的:在某些情形下,粗略分析的结果已经如此有说服力,以致不再需要那次详细的仿真,从而节省大量的时间与金钱。更为典型的是,粗略模型让分析人员更好地理解待建模的系统——这是一种在构建详细且往往复杂的仿真模型之前的"带妆彩排"。此外,在粗略阶段所得到的性能度量还为仿真输出提供了一种合理性检验(sanity check),有可能避免因仅仅是在编写仿真程序时出错而得出错误的结论。
例 19
在某驾照办理分处,经理收到了许多关于换发驾照时长时间延误的投诉。为了给增加人手找到定量的支持依据,她请来了一位运筹分析人员。该设施的示意图如图 15 所示。
分处的营业时间为上午 8:00 至下午 4:00,历史上平均每天办理 464 名驾驶员。所有到达者必须首先到两名办事员之一那里办理登记。经理手上有几天里针对办事员收集的时间研究数据,发现平均登记时间为 2 分钟,标准差约为 0.4 分钟。登记之后,有 15% 的驾驶员需要参加一场大约持续 20 分钟的笔试;关于考试时间有很好的数据,因为这些试卷在发出与交回时都有时间戳记。这些多项选择题由一台光学扫描仪几乎瞬时地批阅完成。所有到达者都必须等待拍摄照片并制作驾照;这个工位每小时可处理约 60 名驾驶员,但由于有些照片不得不重拍,个别时间高度可变。
分处经理想知道:增加一名登记办事员,或者增加一个新的拍照工位,对顾客延误的相对影响分别是多大,而且这两项变更中是否有任何一项会影响为参加笔试的驾驶员所需的椅子数量(她目前拥有的 20 把椅子一直都是够用的)。
这是一个非常适合采用仿真的应用,但经理所聘请的这位分析人员认为,一次快速的排队近似既能提供有用的洞察,也能对仿真模型起到核对作用。

图 15 驾照办理分处的顾客流。
为开展一次粗略分析,分析人员把该驾照分处表示为一个排队网络,其中登记办事员为队列 1( 个服务台,每个以 名驾驶员每小时 名驾驶员每分钟的速率工作),笔试工位为队列 2( 个服务台,因为可以有任意多的人同时参加笔试,平均服务时间 分钟),拍照工位为队列 3( 个服务台,以 名驾驶员每分钟的速率工作)。分析人员选择略去对试卷的光学扫描,因为它发生得非常快。尽管分处经理说正午前后的到达更为密集,但出于粗略分析的目的,分析人员把全天的到达率建模为每小时 次到达。
到达各个队列的到达率如下:
注意,来自网络之外的到达只发生在队列 1,因此 且 。求解这个方程组得到 与 。分析人员选择以分钟为单位工作,因此把这些值换算为 每分钟与 每分钟。
分析人员把到达过程近似为泊松过程——其合理性在于存在一个庞大的潜在顾客总体,他们(大体上)独立地作出何时到达的决定——并把每个队列的服务时间近似为指数分布。服务时间的近似对于队列 是合理的,因为经理相信拍照时间相当可变;而对于队列 2 则是无害的,因为无限服务台 队列的结果只依赖于服务率,而不依赖于分布。然而,登记时间的变异系数为 ,因此分析人员决定也对登记结果施加修正因子 。
现在,分析人员已掌握必要的信息,可以把驾照分处的每一个工位近似为一个独立的队列(这是又一个近似,因为在现实中它们并不独立)。登记办事员被近似为一个 队列,考试工位被近似为一个 队列,拍照工位被近似为一个 队列。于是,在当前的设置之下,登记工位是一个 ;利用表 5 中的公式再乘以 0.52,得到 分钟。如果增加第三名办事员,队列中的等待时间就下降到 0.4 分钟,这是一项巨大的节省。
当前的拍照工位可以建模为一个 队列,得到 分钟;增加第二个拍照工位 会使队列中的时间下降到 0.3 分钟,这一节省甚至比增加一名办事员还大。
如果需要,考试工位可以利用表 6 中 队列的结果来分析。例如,任意时刻正在参加考试的人数期望值为 ,这一数值不受办事员或拍照工位数量变化的影响,因为这些变化并不改变 或 。
经理是否应当期望:如果实施了其中一项或两项变更,就会精确地看到这些结果呢?不应如此,因为这个模型在若干方面都是粗略的:排队结果是稳态的,而实际的驾照办理机构每天只营业 8 小时,且到达率不是常数。对系统加以简化时略去了试卷批阅、员工休息等环节。然而,这些结果确实为增加一名或多名员工提供了一个有说服力的理由,并提供了一个基线,用以核对一个包含所有相关特征的详细仿真模型。
8 小结
排队模型已经广泛地用于分析服务设施、生产与物料搬运系统、电话与通信系统,以及许多其他可能发生拥挤或稀缺资源竞争的情形。本章介绍了排队模型的基本概念,并说明了如何运用仿真(以及在某些情况下的数学分析)来估计一个系统的性能度量。
可以用仿真来生成一个复杂系统的一段或多段人造历史。这种由仿真生成的数据又可被用来估计系统所期望的性能度量。本章介绍了常用的性能度量,包括 , w、 以及 ,并给出了据以从数据中估计它们的公式。
在仿真任何随时间演化的系统时,分析人员必须决定要研究的究竟是暂态行为还是稳态性能。对于某些队列的稳态行为存在着简单的公式,但要由仿真生成的数据估计稳态性能度量,就必须认识到初始条件对稳态性能估计量可能产生的有害影响,并加以处理。如果初始条件不能代表稳态,或者仿真运行长度太短,这些估计量就可能严重偏离(偏高或偏低)。
无论分析人员关心的是系统的暂态性能还是稳态性能,都应当认识到:从对一个随机队列的仿真中得到的那些估计,恰恰就是估计而已。每一个这样的估计都含有随机误差,需要进行恰当的统计分析才能评估该估计的精度。
在本章的最后三节中,我们说明了一批简单模型可以用数学方法求解。尽管这类模型背后的假定在实际应用中可能并不被严格满足,这些模型在提供性能度量的粗略估计方面仍然有用。在许多情形下,具有指数分布到达间隔时间与服务时间的模型会对系统行为给出保守的估计。例如,如果模型预测平均等待时间 w 为 12.7 分钟,那么真实系统中的平均等待时间很可能小于 12.7 分钟。指数模型的这种保守性质源于:(a) 诸如 w 与 这样的性能度量一般是到达间隔时间与服务时间方差的增函数(回顾一下 队列),以及 (b) 指数分布具有相当高的变异性,其标准差始终等于其均值。因此,如果真实系统的到达过程或服务机构比指数分布的到达间隔时间或服务时间变异性更小,那么系统中的平均数 与在
系统中度过的平均时间 w 就很可能会小于指数模型所预测的值。当然,如果到达间隔时间与服务时间比指数随机变量更加可变,那么 M/M 排队模型就有可能低估拥挤程度。
数学排队模型的一项重要应用是确定一个工作站或服务中心所需的最少服务台数。相当常见的情况是:如果到达率 λ 与服务率 µ 已知或者可以被估计出来,那么简单的不等式 就可以用来对一个工作站的服务台个数 c 给出初始估计。对于一个拥有许多工作站的大系统而言,若要对工作站 i 的服务台个数 的各种可能组合 逐一做仿真,可能非常耗时。因此,由少量分析所得的粗略估计可以节省大量的计算机时间与分析人员的时间。
最后,排队的那些简单指数模型的定性行为可以推广到更复杂的系统。一般而言,正是服务时间的变异性与到达过程的变异性导致排队线堆积并形成拥挤。对于大多数系统,如果到达率上升、或者服务率下降、或者服务时间与到达间隔时间的方差增大,那么系统就会变得更加拥挤。可以通过增加服务台个数,或者通过减小服务时间的均值与变异性来降低拥挤程度。简单的排队模型在量化这些关系以及评价各种备选系统设计方面,可以提供很大的帮助。
参考文献
COOPER, R. B. [1990], Introduction to Queueing Theory, 3d ed., George Washington University, Washington, DC.
DESCLOUX, A. [1962], Delay Tablesfor Finite- and Infinite-Source Systems, McGraw-Hill, New York.
GROSS, D., AND C. HARRIS [1997], Fundamentals ofQueueing Theory, 3d ed., Wiley, New York.
HALL, R. W. [1991], Queueing Methods: For Services and Manufacturing, Prentice Hall, Englewood Cliffs, NJ.
HILLIER, F. S., AND G. J. LIEBERMAN [2005], Introduction to Operations Research, 8th ed., McGraw-Hill, New York.
KENDALL, D. G. [1953], “Stochastic Processes Occurring in the Theory of Queues and Their Analysis by the Method of Imbedded Markov Chains,” Annals ofMathematical Statistics, Vol. 24, pp. 338–354.
KLEINROCK, L. [1976], Queueing Systems, Vol. 2: Computer Applications, Wiley, New York.
LITTLE, J. D. C. [1961], “A Proof for the Queueing Formula Operations Research, Vol. 16, pp. 651– 665.
NELSON, B. L. [1995], Stochastic Modeling: Analysis & Simulation, Dover Publications, Mineola, NY.
WINSTON, W. L. [2004], Operations Research: Applications and Algorithms, 4th Edition, Duxbury Press, Pacific Grove, CA.
习题
某工具库具有指数分布的到达间隔时间与服务时间,为一群数量很大的机械师服务。到达之间的平均时间为 4 分钟。工具库管理员服务一名机械师平均需要 3 分钟。管理员的工资是每小时 10 美元,机械师的工资是每小时 15 美元。再配备一名工具库管理员是否可取?
某机场正在为螺旋桨驱动的飞机设计两条跑道(一条用于降落,一条用于起飞)。已知降落一架飞机的时间服从指数分布,均值为 1.5 分钟。如果假定飞机的到达是随机发生的,那么在平均空中等待时间不超过 3 分钟的条件下,可以容忍多大的到达率?
特罗普港(Port of Trop)一次只能服务一艘船。不过,还有可供另外三艘船系泊的空间。特罗普是一个受欢迎的停靠港,但如果没有可用的系泊空间,船只就不得不前往普普港(Port of Poop)。平均每周有七艘船到达,服从泊松过程。特罗普港有能力每周平均处理八艘船,服务时间服从指数分布。在特罗普港等待或正在接受服务的船只期望数是多少?
在大都会市政厅(Metropolis City Hall),有两名工作人员每天都"拉关系"(做交易)。需要拉的关系平均每 10 分钟出现一个,全天如此。拉一个关系平均需要 15 分钟。到达间隔时间与服务时间都服从指数分布。在随机时刻系统中没有任何需要拉的关系的概率是多少?等待被拉的关系的期望数是多少?两名拉关系者都忙碌的概率是多少?如果再增加一名拉关系者(以与前两人相同的速度工作),对性能有何影响?
在 Tony 与 Cleo 的面包店,只提供一种生日蛋糕。装饰这种蛋糕需要 15 分钟,这项工作由一位特定的面包师完成。事实上,这是这位面包师唯一的工作。如果要使等待装饰的队列平均长度不超过五个蛋糕,可以接受的平均到达间隔时间(服从指数分布)是多少?
病人按速率为每小时 1 位的泊松过程到达进行体检。体检需要三个阶段,每一阶段独立地服从指数分布,服务时间为 15 分钟。一位病人必须在下一位病人被允许进入治疗设施之前走完所有三个阶段。计算该系统被延误病人的平均数 。[提示:独立随机变量之和的方差等于方差之和。]
假定机械师按速率 λ = 每小时 10 位的泊松过程随机到达一个工具库。已知唯一一位工具管理员服务一名机械师平均需要 4 分钟,标准差约为 2 分钟。假定机械师的工资是每小时 15.00 美元。估计机械师等待工具的稳态平均每小时成本。
到达某机场的飞机都被引导到同一条跑道。在一天中的某个时段,这些到达构成一个速率为每小时 30 架的泊松过程。降落一架飞机的时间是 90 秒的常数。确定该机场的 、、 与 。如果一架被延误的飞机平均每小时烧掉价值 5000 美元的燃油,确定等待降落所造成延误的平均每架飞机成本。
某机修车间修理小型电动机,这些电动机按速率为每周 12 台的泊松过程到达(每周工作 5 天、40 小时)。对以往数据的分析表明,发动机平均可在 2.5 小时内修好,方差为 1 小时^2。在不了解系统状态的情况下,一位顾客应当预期把一台电动机留在修理车间多少个工作小时?如果修理时间的方差可以被控制,那么多大的方差会把期望等待时间降到 6.5 小时?
到达某自助加油泵的顾客以每小时 12 位的泊松方式发生。服务时间的分布平均为 4 分钟,标准差为一又三分之一分钟。系统中的期望车辆数是多少?
Classic Car Care 有一名工人按四个步骤洗车——打皂、冲洗、擦干、吸尘。完成每一步的时间服从指数分布,均值为 9 分钟。每辆车在开始下一辆车的流程之前都要走完每一个步骤。平均而言,每 45 分钟有一辆车到来要求洗车,服从泊松过程。一辆车等待开始洗车的平均时间是多少?洗车系统中的平均车辆数是多少?洗一辆车所需的平均时间是多少?
某房间有 10 台棉纺织机。织机一旦完成设置便自动运行。设置时间服从指数分布,均值为 10 分钟。机器平均运行 40 分钟,也服从指数分布。织机操作工的工资是每小时 10 美元,而织机不运行则带来每小时 40 美元的成本。应当雇用多少名织机操作工才能使织机车间的总成本最小?如果目标变成"平均而言,任何织机等待操作工的时间不应超过 1 分钟",应当雇用多少人?又应当雇用多少名操作工,以确保平均而言在任何时刻都至少有 7.5 台织机在运行?
考虑下列关于一个具有指数分布运行时间与服务时间的有限呼叫总体问题的信息:
计算 与 。求使 成立的 λ 值。
假定图 6 表示一个后进先出(LIFO)单服务台系统的系统中顾客数。顾客不会被抢占(即被从服务中踢出),但在一次服务完成之后,最近的那位到达者接着开始服务。对于这个 LIFO 系统,把 L(t) 下方的总面积分摊给每一位顾客,正如在图 8 中对 FIFO 系统所做的那样。利用该图,证明式 (10) 与式 (8) 对单服务台 LIFO 系统成立。
重做习题 14,但假定
(a) 图 6 表示一个有 个服务台的 FIFO 系统。
(b) 图 6 表示一个有 个服务台的 LIFO 系统。
- 考虑一个具有如下类型服务分布的 队列:顾客按 与 的比例请求两种服务之一。第 i 类服务服从速率为 的指数分布。令 表示一次第 i 类的服务时间,X 表示一次任意的服务时间。那么 且
随机变量 X 被称为具有参数为 的超指数分布(hyperexponential distribution)。
(a) 证明
(b) 利用 证明
(c) 对于任意超指数随机变量,若 且 ,证明其变异系数大于 1;即,。因此,超指数分布提供了一族统计模型,用以描述比指数分布服务时间更加可变的服务时间。[提示:利用 (a) 与 (b),可以把 的代数表达式化成 的形式。]
(d) 与 p 的多种选择都可以得到相同的总均值 与 。如果希望得到一个均值为 、变异系数为 的分布,请找出 与 的值来实现这一点。[提示:任意选取 ;然后就 与 求解下列方程。]
在例 中,以服务台利用率 (一个典型服务台忙碌时间所占的比例)为准,比较具有 , 与 个服务台的系统。
在例 17 中,把机器数目增加 2 台,然后以服务台利用率 (一个典型服务台忙碌时间所占的比例)为准,比较具有 , 与 个服务台的系统。
某小型木材堆场由一支 10 辆卡车的车队供货。有一台高架起重机可用来从卡车上卸下长原木。卸载一辆卡车平均需要 1 小时。卸完之后,一辆卡车平均需要 3 小时去装运下一批原木并返回木材堆场。
(a) 要用本章的模型来分析这一问题,需要作某些分布假定。请陈述这些假定并讨论其合理性。
(b) 只有一台起重机时,等待卸载的平均卡车数是多少?平均每小时有多少辆卡车到达堆场?到达时发现起重机忙碌的卡车占多大百分比?这与起重机忙碌时间的长期比例是否相同?
(c) 假定在该木材堆场安装了第二台起重机。回答与 (b) 中相同的问题。制作一张图表,比较一台起重机与两台起重机。
(d) 如果运到堆场的原木价值约为每车 200 美元,且起重机的长期成本为每台每小时 50 美元(无论忙碌还是空闲),请按每小时成本计算最优的起重机台数。
(e) 除 (d) 中的成本之外,如果管理层决定考虑闲置卡车与司机的成本,最优的起重机台数是多少?一辆卡车连同其司机一起估计每小时约花费 40 美元,并且在等待起重机时被视为闲置。
一个配有一名管理员的工具库为一群 10 名机械师服务。机械师工作一段服从指数分布的时间(均值 20 分钟),然后到工具库去领取一件专用工具。管理员的服务时间服从指数分布,均值为 3 分钟。如果管理员的工资是每小时 6 美元、机械师的工资是每小时 10 美元,那么再配备一名管理员是否可取?[提示:与习题 1 作比较。]
本题基于 Nelson [1995] 中的案例 8.1。拟建造一座大型购物商城。在繁忙时段,汽车的到达率预计平均为每小时 1000 辆,而在其他商城所做的研究表明顾客将花 3 小时购物。商城的设计者希望拥有充足的停车位,以便在 99.9% 的时间里都有足够的空位。他们应当设置多少个车位?[提示:把该系统建模为一个 队列,其中车位就是服务台,并求出多少个车位才能以 0.999 的概率够用。]
在例 18 中,假定总到达率预期将上升到每小时 160 位。如果服务率不变,要使服务负荷刚好能被应付,服务中心 2 与服务中心 3 各需要多少名办事员?
一家小型复印店有一台自助复印机。目前只有供 4 个人排队的场地(包括正在使用机器的那个人);当人数多于 4 人时,多余的人必须排到店外。店主希望尽可能避免人们排到店外。为此,他们正在考虑增加第二台自助复印机。据观察,自助顾客以每小时 24 位的速率到达,并且平均使用机器 2 分钟。请评估增加一台复印机的影响。请仔细陈述你所作的任何假定或近似。
某自助洗车房有 4 个洗车位。处在某个车位中时,顾客可以从三种选项中作选择:只冲洗;清洗并冲洗;以及清洗、冲洗并打蜡。每个选项都有固定的完成时间:只冲洗 3 分钟;清洗并冲洗 7 分钟;清洗、冲洗并打蜡 12 分钟。业主观察到,20% 的顾客选择只冲洗;70% 选择清洗并冲洗;10% 选择清洗、冲洗并打蜡。没有预约,顾客的到达率约为每小时 34 辆车。停车场上只有供 3 辆车等待的位置,因此目前有许多顾客流失。业主想知道:如果他们再增加一个车位,能多做多少生意。增加一个车位会占去停车场上的一个位置。
请为该建立一个排队模型。估计在当前系统与拟议系统中顾客流失的速率。请仔细陈述你所作的任何假定或近似。
找出实际应用中使用的排队模型的例子。一份很好的资料来源是《Interfaces》期刊。
通过比较两个 M/M/1 队列(每个的到达率为 λ、服务率为 µ)与一个到达率为 2λ、每个服务台服务率为 µ 的 队列的性能度量,研究合并服务台(pooling servers,即让多个服务台从单一队列中取顾客,而不是每个服务台各自拥有一个队列)的效果。
某修理与检验设施由两个工位组成:一个配有两名技术人员的修理工位,以及一个配有 1 名检验员的检验工位。每名修理技术人员以每小时 3 件物品的速率工作;检验员每小时可以检验 8 件物品。大约有 10% 的物品检验不合格并被送回修理工位。(这一比例即使对被修理过两次或更多次的物品也成立。)如果物品以每小时 5 件的速率到达,在假定泊松到达过程与指数分布服务时间的条件下,物品在这两个工位各自所经历的长期期望延误是多少?在不增加人员的条件下,系统所能承受的最大到达率是多少?
零件以每小时 50 件的速率到达某装配系统的第一级,随后还要经过另外四级,产品才算完成。每一级有 2% 的废品率,这意味着每一级中会有 2% 的产品被判定为缺陷品并被丢弃。
(a) 到达第五个装配工位的到达率是多少(单位:件每小时)?
(b) 如果这五个工位的平均装配时间各不相同,那么把这些工位按加工时间从小到大排序(或者反过来)是否有意义?为什么?
- 某呼叫中心负责回答有关财务跟踪、个人效率以及联系人管理软件方面的问题。呼叫以每分钟 1 次的速率到达,历史上 25% 的呼叫是关于财务类产品的,34% 是关于效率类产品的,41% 是关于联系人管理类产品的。回答一位来电者的问题平均需要 5 分钟。任一时刻能够接入的顾客数基本上是无限制的,但每条产品线各有自己的接线员(财务类 2 名、效率类 2 名、联系人管理类 3 名)。如果有合适的接线员空闲,呼叫就被立即路由给该接线员;否则,来电者被放入一个等待队列。公司希望通过对接线员进行交叉培训、使之能够回答任何产品线的呼叫,从而减少所需接线员的总数。由于这些接线员不可能在所有产品上都是专家,预计这会使处理一次呼叫的时间增加约 10%。要提供与当前系统相同服务水平的服务,需要多少名经过交叉培训的接线员?请通过对当前系统与拟议系统作近似来回答这一问题。
可从 www.bcnn.net 获取的材料清单
QueueingTools.xls
7 随机数生成
随机数(random number)是几乎所有离散系统仿真中不可或缺的基本要素。大多数计算机语言都备有某种子程序、对象或函数,用来产生随机数。在仿真语言中,随机数用于产生事件时间以及其他随机变量(random variable)。本章介绍随机数的生成,以及随后对所生成随机数所作的随机性检验。
1 随机数的性质
一串随机数 必须具备两项重要的统计性质:均匀性与独立性。每个随机数 都必须是从 0 到 1 之间连续均匀分布(uniform distribution)中抽取的独立样本——也就是说,其概率密度函数(pdf)为
该密度函数如图 1 所示。每个 的期望值(expected value)由下式给出:

图 1 随机数的概率密度函数。
而方差(variance)由下式给出:
均匀性与独立性这两项性质带来如下推论:
若把区间 [0, 1] 划分为 n 个类别(class),或等长的子区间,则每个区间中观察值的期望个数为 其中 N 为观察值总数。
在某个特定区间上观察到取值的概率,与此前已抽取的取值无关。
下一节将描述用于产生随机数、驱动仿真的方法所应具备的若干理想性质。
2 伪随机数的生成
注意本节的标题中含有"伪"(pseudo)字。“伪"意为虚假,因此我们所生成的是虚假的随机数!这里使用"伪"字,是要说明:仅仅是用一种已知方法来生成随机数,这一行为本身就消除了产生真正随机性的可能。方法一旦已知,随机数的集合便可重复生成。于是便可以论证,这些数字并非真正随机。然而,任何生成方案的目标,都是产生一串介于 0 与 1 之间的数字,使其尽可能贴近地模拟(或模仿)均匀分布与独立性的理想性质。
确实,在生成伪随机数(pseudo-random number)的过程中,可能会出现某些问题或误差。这些误差,或对理想随机性的偏离,都与第 1 节中所述的性质有关。这类偏离的例子包括:
所生成的数字可能不是均匀分布的。
所生成的数字可能是离散取值而非连续取值的。
所生成数字的均值可能偏高或偏低。
所生成数字的方差可能偏高或偏低。
可能存在相依性,例如以自相关来度量。
对某一特定生成方案而言,其对均匀性与独立性的偏离,通常可以通过第 4 节所述的检验发现。若发现了偏离,就应当弃用该生成方案,改用一个可接受的(acceptable)发生器(generator)。通过第 4 节检验乃至更严格检验的发生器已经问世;因此,没有任何理由去使用一个已被判定有缺陷的发生器。
通常,随机数是由数字计算机作为仿真的一部分来产生的。可以用来产生这些数值的方法有很多。在介绍其中若干方法之前,有几个重要的考虑事项应当提及:
方法应当快速。单次计算代价不高,但一次仿真可能需要数百万个随机数。通过选择计算效率高的随机数生成方法,可以控制总成本。
方法应当可移植到不同的计算机——最好还能移植到不同的编程语言。这样做是有好处的:仿真程序无论在何处执行都将产生相同的结果。
方法应当具有足够长的循环。循环长度,或称周期(period),表示随机数序列在先前的数字开始以早先的次序重复之前所能延续的长度。因此,若要生成 10,000 个事件,周期应当比这长许多倍。
循环的一种特殊情形是退化(degenerating)。当同样的随机数反复出现时,该方法即发生退化。这种情况当然是不可接受的。有些方法很快就会发生这种现象。
随机数应当可重复。给定起点(或初始条件),应当能够生成同一组随机数,且完全独立于被仿真的系统。这对调试大有帮助,并便于在不同系统之间作比较。基于同样的理由,还应当能够方便地指定序列中彼此相距很远的不同起点。
最重要的是,所生成的随机数应当紧逼均匀性与独立性的理想统计性质。
发明一些"看起来像"能产生随机数的技术很容易;而发明真正能产生看上去独立、均匀分布的随机数序列的技术,则极其困难。目前该主题已有浩繁的文献和丰富的理论,人们投入了大量时间进行检验,以确定各种发生器的性质。即便一项技术已知在理论上是可靠的,要把它实现得既快又可移植,也很少容易。本章的目标是让读者了解随机数生成中的核心问题,加深理解,并展示该领域工作者所采用的一些技术。
3 随机数的生成技术
第 3.1 节的线性同余法是生成随机数应用最广泛的技术,因此我们详细地介绍它。我们还将介绍该方法的一个扩展,它能产生周期更长的序列。书中还提出了许多其他方法,Bratley、Fox 与 Schrage [1996]、Law [2007] 和 Ripley [1987] 对它们作了评述。
3.1 线性同余法
线性同余法最初由 Lehmer [1951] 提出,它首先按如下递推关系产生一串介于 0 与 之间的整数 :
初值 称为种子(seed),a 称为乘数(multiplier),c 称为增量(increment),m 称为模(modulus)。若式 (1) 中 ,则这种形式称为混合同余法(mixed congruential method)。当 时,这种形式称为乘法同余法(multiplicative congruential method)。 和 取值的选取会显著影响统计性质与循环长度。式 (1) 的各种变形在计算机生成随机数时相当常见。
注意,这里生成的是随机整数而不是随机数。这些随机整数看上去应当在 0 到 的整数上均匀分布。于是可通过下式生成 0 与 1 之间的随机数 :
下面一个例子将说明这一技术是如何运作的。
例 1
用线性同余法生成一串随机数,取 ,,。种子序列 及其随后所得的随机数 计算如下:
回顾一下:只要 能被 m 整除且没有余数,就有 mod m;否则 mod 运算返回 的余数。因此, mod ,因为 502/100 等于 5 且余数为 2。
线性同余法(以及任何生成方案)的最终检验标准,在于所生成的数字 . 逼近均匀性与独立性的程度。不过,还有若干次级性质必须加以考虑,其中包括最大密度与最大周期。
首先注意,由式 (2) 生成的数字只取自集合 中的值,因为每个 X 都是集合 中的整数。因此,每个 在 I 上是离散的,而不是在区间 [0, 1] 上连续的。如果模 m 是一个很大的整数,这种近似似乎无关紧要。(诸如 和 这样的取值,在许多仿真语言所出现发生器中是常用的。)所谓最大密度,是指 所取的值在 [0, 1] 上不留下大的空隙。
其次,为有助于达到最大密度,并避免在实际应用中发生循环(即同一生成数字序列的反复出现),发生器应当具有尽可能大的周期。通过恰当选取 和 可达到最大周期 [Law 2007]。
当 m 是 2 的幂,即 ,且 时,可能的最长周期为 ,只要 c 与 m 互素(即 c 与 m 的最大公因子为 1)且 (k 为整数)即可达到。
当 m 是 2 的幂,即 ,且 时,可能的最长周期为 ,若种子 为奇数,且乘数 a 取为 或 (其中 1, . . . )即可达到。
当 m 是素数且 时,可能的最长周期为 ,只要乘数 a 具有如下性质即可达到:使 能被 m 整除的最小整数 k 为 。
例 2
使用乘法同余法,求取发生器在 64 且 和 4 时的周期。解答见表 1。当种子为 1 或 3 时,序列的周期为 16。然而,种子为 2 时得到的周期长度为 8,种子为 4 时则出现长度为 4 的周期。
在例 2 中, 且 。因此最大周期为 注意,该周期是通过使用奇数种子 和 达到的;偶数种子 和 分别给出周期 8 和 4,均小于最大值。注意 属于 且 的形式,这正是达到最大周期所要求的。
当 时,所生成的序列取值为集合 中的值。所生成的随机数 序列中的间隙相当大(即间隙为 ,即 0.0625)。这样的间隙引发了人们对所生成序列密度的担忧。
例 2 中的发生器对任何应用都是不可行的——它的周期太短,密度也不足。不过,这个例子显示了对 和 进行恰当选择的重要性。
表 1 使用不同种子确定周期
| i | ||||
|---|---|---|---|---|
| 0 | 1 | 2 | 3 | 4 |
| 1 | 13 | 26 | 39 | 52 |
| 2 | 41 | 18 | 59 | 36 |
| 3 | 21 | 42 | 63 | 20 |
| 4 | 17 | 34 | 51 | 4 |
| 5 | 29 | 58 | 23 | |
| 6 | 57 | 50 | 43 | |
| 7 | 37 | 10 | 47 | |
| 8 | 33 | 2 | 35 | |
| 9 | 45 | 7 | ||
| 10 | 9 | 27 | ||
| 11 | 53 | 31 | ||
| 12 | 49 | 19 | ||
| 13 | 61 | 55 | ||
| 14 | 25 | 11 | ||
| 15 | 5 | 15 | ||
| 16 | 1 | 3 |
在数字计算机上使用该发生器时,速度与效率同样也是选择时需要考虑的因素。使用一个 2 的幂或接近 2 的幂的模 m,有助于提高速度与效率。由于大多数数字计算机采用二进制表示,当模为 2 的幂()时,式 (1) 中的 mod(取余)运算可以高效地完成。在普通算术运算给出 的值之后,只需丢弃 中最左边的二进制位,再取最右边的 b 个二进制位,即得 。下面的例子用 类比地说明这一运算,因为大多数人是以十进制方式思考的。
例 3
令 ,并用式 (1) 生成一串随机整数。
当 m 是 10 的幂,即 时,mod 运算只需保留最右边的 b 位(十进制)数字即可完成。类比地,当 且 时,mod 运算对二进制计算机最为高效。
例 4
本节最后一个例子已在实际中使用。它经过了大量检验 [Learmonth and Lewis, 1973; Lewis et , 1969]。 和 m 的取值经过挑选,以确保发生器所期望的特性最有可能得到满足。
令 , 且 (一个素数)。这些取值满足保证周期为 (远超过 20 亿)的条件。再指定种子 。所生成的前几个数如下:
注意,该方法除以 而非 ;不过,对于如此之大的 ,其影响可以忽略。
3.2 组合线性同余发生器
随着计算能力的提高,我们能够仿真的系统复杂度也随之提高。周期为 的随机数发生器(例如例 4 中介绍的那个广为流行的发生器),对所有应用来说已不再够用。例子包括高可靠性系统的仿真——为了观察哪怕仅仅一次失效事件,就必须仿真数十万次基本事件;以及复杂计算机网络的仿真,其中数千名用户正在执行数百个程序。当前的一个研究领域是推导周期显著更长的发生器。
一种富有成效的思路,是把两个或多个乘法同余发生器组合起来,使组合后的发生器既具有良好的统计性质,又有更长的周期。L’Ecuyer [1988] 的下列结果给出了实现这一点的思路:
若 是任意一组相互独立的离散取值随机变量(不一定同分布),但其中之一(比如 )在 0 到 的整数上均匀分布,那么
在 0 到 的整数上均匀分布。为说明如何利用这一结果来构造组合发生器,令 为 k 个不同乘法同余发生器的第 i 个输出,其中第 j 个发生器的模为素数 ,乘数 的选取使得周期为 。于是第 j 个发生器产生的整数 近似地在 1 到 的整数上均匀分布,而 近似地在 0 到 的整数上均匀分布。因此 L’Ecuyer 建议采用如下形式的组合发生器:
其中
注意, 系数隐含地完成了减去 1 的操作,即 ;例如,若 ,则 。这类发生器可能达到的最大周期为
它由下一个例子所介绍的发生器达到。
例 5
对于 32 位计算机,L’Ecuyer [1988] 建议组合 个发生器,其中 ,,,且 。由此得到如下算法(algorithm):
为第一个发生器选取处于区间 [1, 2,147,483,562] 内的种子 ,为第二个发生器选取处于区间 [1, 2,147,483,398] 内的种子 。令 。
计算各个发生器。
- 置
- 返回
- 置 ,转到步骤 2。
这个组合发生器的周期为 。或许出人意料的是,即便如此之长的周期,对所有应用来说也仍可能不够用。周期长达 的组合发生器,可参见 L’Ecuyer [1996, 1999] 和 L’Ecuyer 等人 [2002]。其中一个发生器已被译成 Visual Basic for Applications,可在 www.bcnn.net 上的电子表格 RandomNumberTools.xls 中找到。
3.3 随机数流
线性同余随机数发生器的初始种子(对于组合线性同余发生器而言则是各初始种子),就是用于初始化随机数序列的整数值 。由于发生器所产生的整数序列 X , 是重复的,序列中的任何取值都可以用来"播种"该发生器。
对于线性同余发生器,随机数流(stream)无非是这样一种便利的指称方式:它指取自序列 的一个起始种子(对于组合发生器,流指的是所有基本发生器的起始种子);通常这些起始种子在序列中相距甚远。例如,若各流相隔 b 个取值,则第 i 个流可由起始种子
来定义,其中 。在较早的发生器中 较为常见,但在现代组合线性同余发生器中已使用高达 的取值。(此类发生器的实现可参见 L’Ecuyer 等人 [2002]。)因此,只要保存每个流当前的种子取值,一个具有 k 个流的随机数发生器就像 k 个彼此独立的虚拟随机数发生器。习题 21 给出了构造相距很远之随机数流的一种方法。
这里还有一个问题:通过仿真来比较两个或多个备选系统;把伪随机数序列的各段专门用于各个被仿真系统中的同一用途,是有利的。例如,在比较若干排队系统的效率时,若所有被仿真的系统都经历完全相同的顾客到达序列,则比较会更加公平。通过为每个排队仿真指定一个特定的流来产生到达,即可实现这种同步。若这些流的起始种子相距足够远,则其效果等同于拥有一个专门用于产生顾客到达的独立随机数发生器。
4 随机数的检验
随机数所期望具备的性质——均匀性与独立性——已在第 1 节中讨论过。为检验这些期望性质是否已经达到,可以进行若干检验。(所幸,大多数商业仿真软件所适用的检验都已经做过。)按照所关注的性质,这些检验可归为两类:均匀性与独立性。本节简要介绍两类检验:
频数检验(frequency test)。采用 Kolmogorov–Smirnov 检验或卡方检验(chi-square test),将所生成数字集合的分布与均匀分布作比较。
自相关检验(autocorrelation test)。检验数字之间的相关性,并把样本相关性与所期望的相关性(零)作比较。
在均匀性检验(uniform test)中,假设如下:
原假设 的含义是:这些数字在区间 [0, 1] 上均匀分布。未能拒绝原假设,意味着本检验没有发现非均匀性的证据。但这并不意味着无需进一步检验发生器的均匀性。
在独立性检验中,假设如下:
这一原假设 的含义是:这些数字是独立的。未能拒绝原假设,意味着本检验没有发现相依性的证据。但这并不意味着无需进一步检验发生器的独立性。
每项检验都必须给出显著性水平 α。水平 α 是在原假设为真时拒绝原假设的概率:
决策者为任何检验设定 α 的取值。α 通常取 0.01 或 0.05。
若对同一组数字进行若干项检验,则仅凭偶然(即犯第一类(α)错误)在至少一项检验上拒绝原假设的概率会上升。设 ,并对一串数字进行了五项不同的检验。仅凭偶然在至少一项检验上拒绝原假设的概率可能高达 0.25。
类似地,若对发生器产生的许多组数字各做一项检验,则随着受检数字组数的增加,仅凭偶然(即犯第一类(α)错误)在至少一项检验上拒绝原假设的概率也会上升。例如,若对 100 组数字做该检验,取 ,则预期会有五项检验仅凭偶然而被拒绝。若 100 次检验中的拒绝次数接近 100α,就没有充分理由弃用该发生器。本段与上一段所讨论的概念,在例 8 的结论中还将进一步讨论。
如果使用的是众所周知的仿真语言或随机数发生器,那么前面提到的检验以及第 4.1 节和第 4.2 节所述的检验,很可能就没有必要再做了。然而,随机数发生器常常被加入并非专为仿真而开发的软件中,例如电子表格程序、符号/数值计算器以及编程语言。如果手头的发生器没有明确的说明或文档,那么就应该对来自该发生器的许多组数字样本应用本章的检验。本章未予涵盖、但常用的其他检验有:用于抽样数字的 Good 序列检验(serial test)[1953, 1967]、中位谱检验 [Cox and Lewis, 1966; Durbin, 1967]、游程检验 [Law 2007],以及方差齐性检验 [Cox and Lewis, 1966]。即便一组数字通过了所有检验,也不能保证其随机性;总有可能存在某种潜在的规律未被察觉。
本书强调的是应用于发生器实际产生的数字序列上的经验检验。由于现代伪随机数发生器的周期极长(如第 3.2 节所述),如今已不可能把这些检验应用于此类发生器周期中相当可观的一部分。当遇到一个性质完全未知的发生器(例如某个没有文档说明、埋藏在软件包深处的那种)时,这些检验可以用作一种检查;但它们无法用以确定一个发生器在其整个周期内的质量。所幸,还有一类理论检验,它们无需实际产生任何数字即可评价 m、a、c 的取值选择,其中最常见的是频谱检验(spectral test)。这些检验中有许多评估 k 元组随机数是如何填满一个 k 维单位立方体的。这些检验超出了本书的范围;可参见 Ripley [1987]。
在下面检验的示例中不再重述假设,假设如前面各段所指出。尽管很少有仿真分析人员需要亲自执行这些检验,但每一位仿真使用者都应当了解一个优良随机数发生器应具备的性质。
4.1 频数检验
为确认一个新发生器而始终应当进行的一项基本检验,是均匀性检验。两种不同的检验方法是 Kolmogorov–Smirnov 检验和卡方检验。这两种检验都度量随机数样本的分布与理论均匀分布之间的吻合程度。二者都基于这样的原假设:样本分布与理论分布之间不存在显著差异。
- Kolmogorov–Smirnov 检验。该检验把均匀分布的连续累积分布函数(cdf) 与 N 个观察值样本的经验累积分布函数 作比较。根据定义,
若来自该随机数发生器的样本为 ,则经验累积分布函数 定义为
随着 N 变大,只要原假设成立, 就应当成为 更好的逼近。
经验分布的累积分布函数是阶梯函数,在每个观测值处发生跳跃。
Kolmogorov–Smirnov 检验基于 与 在随机变量取值范围内的最大绝对偏差——即,它基于统计量
D 的抽样分布是已知的;它作为 N 的函数列于表 A.8。对于针对均匀 cdf 的检验,检验步骤如下:
步骤 1. 将数据由小到大排序。令 表示第 i 个最小的观察值,使得
步骤 2. 计算
步骤 3. 计算
步骤 4. 在表 A.8 中按给定的显著性水平 α 和给定的样本量 N 查取临界值 。
步骤 5. 若样本统计量 D 大于临界值 ,则拒绝"数据是来自均匀分布的样本"这一原假设。若 ,则断定 的真实分布与均匀分布之间未发现差异。
例 6
假定生成了 5 个数字 0.44、0.81、0.14、0.05、0.93,现拟采用 Kolmogorov–Smirnov 检验(显著性水平 )进行均匀性检验。首先必须把这些数字由小到大排序。借助表 2 可以简化计算。表 2 的首行列出了从最小()到最大()的各数。(即 )和 (即 )的计算只需使用表 2 即可轻松完成。统计量算得 ,。因此,。
表 2 Kolmogorov–Smirnov 检验的计算
| 0.05 | 0.14 | 0.44 | 0.81 | 0.93 | |
|---|---|---|---|---|---|
| 0.20 | 0.40 | 0.60 | 0.80 | 1.00 | |
| 0.15 | 0.26 | 0.16 | — | 0.07 | |
| 0.05 | — | 0.04 | 0.21 | 0.13 |
的临界值由附录中的表 A.8 按 和 查得,为 0.565。由于算得的值 0.26 小于表列临界值 0.565,故"所生成数字的分布为均匀分布"这一假设不被拒绝。
表 2 中的计算在图 2 中得到了图示,其中经验累积分布函数 与均匀累积分布函数 作了比较。可以看出, 是 高于 的最大偏差,而 是 低于 的最大偏差。例如,在 处, 的值由 给出,而 的值由 给出。虽然统计量 D 由式 (3) 定义为所有 x 上的最大偏差,但从图 2 可以看出,最大偏差总是出现在某个跳跃点 上;因此,无需考虑其他 x 取值处的偏差。
- 卡方检验。卡方检验使用样本统计量
其中 是第 i 类中的观察频数, 是第 i 类中的期望频数,n 是类别数。对于均匀分布 若各类等间距,则每类的期望个数为
其中 N 为观察值总数。可以证明, 的抽样分布近似于具有 n − 1 个自由度的卡方分布。
例 7
用 的卡方检验,检验接下来给出的数据是否均匀分布。表 3 给出了主要的计算结果。该检验使用 个等长区间,即 。 的值为 3.4。将其与表 A.6 中给出的临界值 作比较。由于 远小于表列值 ,故均匀分布的原假设不被拒绝。

图 2 F(x) 与 的比较。
| 0.34 | 0.90 | 0.25 | 0.89 | 0.87 | 0.44 | 0.12 | 0.21 | 0.46 | 0.67 |
|---|---|---|---|---|---|---|---|---|---|
| 0.83 | 0.76 | 0.79 | 0.64 | 0.70 | 0.81 | 0.94 | 0.74 | 0.22 | 0.74 |
| 0.96 | 0.99 | 0.77 | 0.67 | 0.56 | 0.41 | 0.52 | 0.73 | 0.99 | 0.02 |
| 0.47 | 0.30 | 0.17 | 0.82 | 0.56 | 0.05 | 0.45 | 0.31 | 0.78 | 0.05 |
| 0.79 | 0.71 | 0.23 | 0.19 | 0.82 | 0.93 | 0.65 | 0.37 | 0.39 | 0.42 |
| 0.99 | 0.17 | 0.99 | 0.46 | 0.05 | 0.66 | 0.10 | 0.42 | 0.18 | 0.49 |
| 0.37 | 0.51 | 0.54 | 0.01 | 0.81 | 0.28 | 0.69 | 0.34 | 0.75 | 0.49 |
| 0.72 | 0.43 | 0.56 | 0.97 | 0.30 | 0.94 | 0.96 | 0.58 | 0.73 | 0.05 |
| 0.06 | 0.39 | 0.84 | 0.24 | 0.40 | 0.64 | 0.40 | 0.19 | 0.79 | 0.62 |
| 0.18 | 0.26 | 0.97 | 0.88 | 0.64 | 0.47 | 0.60 | 0.11 | 0.29 | 0.78 |
不同作者对于卡方检验的应用提出了各自的考虑。对于例 7 中那种大小的数据集,这些考虑并不适用——也就是说,若样本中有 100 个取值,并使用 5 到 10 个等长区间,该检验即可接受。一般而言,建议选取 n 与 N 使每个 。
只要样本量足够大,Kolmogorov–Smirnov 检验和卡方检验都可用于检验数据样本的均匀性。不过,Kolmogorov–Smirnov 检验在两者中检验功效更强,因而更受推荐。此外,Kolmogorov–Smirnov 检验可用于小样本,而卡方检验只对大样本有效,比如 。
表 3 卡方检验的计算
| 区间 | |||||
|---|---|---|---|---|---|
| 1 | 8 | 10 | -2 | 4 | 0.4 |
| 2 | 8 | 10 | -2 | 4 | 0.4 |
| 3 | 10 | 10 | 0 | 0 | 0.0 |
| 4 | 9 | 10 | -1 | 1 | 0.1 |
| 5 | 12 | 10 | 2 | 4 | 0.4 |
| 6 | 8 | 10 | -2 | 4 | 0.4 |
| 7 | 10 | 10 | 0 | 0 | 0.0 |
| 8 | 14 | 10 | 4 | 16 | 1.6 |
| 9 | 10 | 10 | 0 | 0 | 0.0 |
| 10 | 11 | 10 | 1 | 1 | 0.1 |
| 100 | 100 | 0 | 3.4 |
设想一组 100 个正在接受独立性检验的数字,其中前 10 个取值位于 0.01–0.10 区间,接下来的 10 个取值位于 0.11–0.20 区间,依此类推。这组数字会轻松通过频数检验,但发生器所产生数字的次序并不是随机的。本章下一节所讨论的检验,正是针对所生成随机数的独立性。
4.2 自相关检验
自相关检验关注的是一串数字之间的相依性。举例来说,请考虑下面这串数字(从左到右读):
| 0.12 | 0.01 | 0.23 | 0.28 | 0.89 | 0.31 | 0.64 | 0.28 | 0.83 | 0.93 |
|---|---|---|---|---|---|---|---|---|---|
| 0.99 | 0.15 | 0.33 | 0.35 | 0.91 | 0.41 | 0.60 | 0.27 | 0.75 | 0.88 |
| 0.68 | 0.49 | 0.05 | 0.43 | 0.95 | 0.58 | 0.19 | 0.36 | 0.69 | 0.87 |
从直观上看,这些数字似乎是随机的,而且它们大概会通过至此为止所给出的全部检验。然而,考察第 5 个、第 10 个、第 15 个(即从第 5 个起每隔 5 个)等等位置,会发现该位置上是一个很大的数。现在,30 个数字对于判定一个随机数发生器不合格而言,样本量还相当小,但这个想法是:序列中的数字可能是相互关联的。在本节中,将介绍一种发现是否存在这种关系的方法。这种关系不必非要是全是大数。也有可能在被考察的位置上全是小数,或者数字在极高与极低之间交替。
下面即将介绍的检验,要求计算每隔 ℓ 个数(ℓ 也称为 ,即滞后)之间的自相关,并从第 i 个数开始。因此,有意义的是下列各数之间的自相关 :。M 是满足 的最大整数,其中 N 是序列中取值的总数。(也就是说,所检验的是长度为 的子序列。)

图 3 未能拒绝假设。
非零的自相关意味着缺乏独立性,因此适合采用下面的双尾检验:
当 M 较大时,若 互不相关,则 的估计量(estimator,记作 )近似服从正态分布。于是检验统计量可构造为
在 M 较大时,在独立性假设下它服从均值为 0、方差为 1 的正态分布。
的公式(写成略有差异的形式)以及估计量的标准差(standard deviation),由 Schmidt 与 Taylor [1970] 给出如下:
以及
算出 之后,若 ,则不拒绝独立性的原假设,其中 α 为显著性水平, 由表 A.3 查得。图 3 说明了这一检验。
若 ,则称该子序列呈现正自相关。此时,滞后为 ℓ 的相邻取值彼此接近的概率高于预期(即子序列中随机数高者之后仍为高者,低者之后仍为低者)。另一方面,若 ,则该子序列呈现负自相关,这意味着低随机数后面往往跟着高随机数,反之亦然。所期望的性质——独立性(它意味着零自相关)——意味着在滞后为 ℓ 的相邻随机数之间,不存在这里所讨论的那种可辨别的关系。
例 8
用 检验本节开头那串数字中的第 3 个、第 8 个、第 13 个……是否自相关。这里 i = 3(从第 3 个数开始),(每隔 5 个数),(序列中有 30 个数),(满足 的最大整数)。于是
以及
于是检验统计量取值为
由表 A.3 查得临界值为
因此,不能依据本检验拒绝独立性的假设。
可以看出,当 M 较小时该检验并不十分灵敏,特别是当被检验的数字偏小的时候。设想一下,如果上述 计算中的每一项都等于零会怎样。那时 将等于 −0.25,而算得的 Z 将取 −1.95 的值,尚不足以拒绝独立性的假设。
当 N 较大时,一组数据中可以形成许多种序列。例如,从序列的第一个数开始,可能的选择包括:(a) 全部数字构成的序列;(b) 由第 1、3、5、……个数字构成的序列;(c) 由第 1、4、……个数字构成的序列,依此类推。若 ,则拒绝一个真假设的概率为 0.05。若考察 10 条相互独立的序列,则仅凭偶然而未发现显著自相关的概率为 ,即 0.60。因此,在自相关并不存在的情况下,有 40% 的概率会检测到显著的自相关。若 α 取 0.10 并进行 10 项检验,则仅有 65% 的把握不会仅凭偶然而发现自相关。结论是:通过做大量检验来"搜寻"自相关,最终可能会检测出自相关来,甚至可能仅仅是出于偶然,即便原本并不存在自相关。
5 小结
本章介绍了随机数的生成,以及随后对所生成数字所作的均匀性与独立性检验。随机数用于产生随机变量。
在现有的众多随机数发生器类型中,基于线性同余法的发生器应用最为广泛,但它们正被组合线性同余发生器所取代。在用于检验随机数发生器的众多统计检验类型中,本章介绍了两种不同的类型:一种检验均匀性,另一种检验独立性。
仿真分析人员可能永远不会直接接触随机数发生器,也不会直接参与发生器输出数字的检验。大多数计算机和仿真语言都备有能够按需产生随机数或随机数流的方法。但即便是使用多年的发生器——其中一些至今仍在使用——也已被发现是不合格的。因此,本章提请仿真分析人员注意这类可能性,并提醒应调查并确认所用的发生器已经过充分的检验。一些研究者已在开发随机数的生成与检验方法以及这些方法的后续应用方面积累了高深的专长。本章仅对该主题作基本介绍;若要成为该领域的专家,读者还需要更深的探究和更广的视野。一份重要的奠基性参考文献是 Knuth [1998];另可参见 Bratley、Fox 与 Schrage [1996]、Law [2007]、L’Ecuyer [1998] 和 Ripley [1987] 中的评述。
最后还需要提醒一点。即便所生成的数字通过了所有检验(本章所涵盖的检验以及本章中提及的其他检验),仍可能有某种潜在的规律未被察觉,而发生器也并未因此被判为有缺陷。不过,广泛使用的仿真语言中所提供的那些发生器,已经过充分的检验与确认。
参考文献
BRATLEY, P., B. L. FOX, AND L. E. SCHRAGE [1996], A Guide to Simulation, 2d ed., Springer-Verlag, New York.
COX, D. R., AND P. A. W. LEWIS [1966], The Statistical Analysis ofSeries ofEvents, Methuen, London.
DURBIN, J. [1967], “Tests of Serial Independence Based on the Cumulated Periodogram,” Bulletin of the International Institute ofStatistics, vol. 42, pp. 1039–1049.
GOOD, I. J. [1953], “The Serial Test for Sampling Numbers and Other Tests of Randomness,” Proceedings of the Cambridge Philosophical Society, Vol. 49, pp. 276–284.
GOOD, I. J. [1967], “The Generalized Serial Test and the Binary Expansion of 4,” Journal ofthe Royal Statistical Society, Ser. A, Vol. 30, No. 1, pp. 102–107.
KNUTH, D. W. [1998], TheArt ofComputer Programming:Vol. 2, Semi-numericalAlgorithms, 2d ed.,Addison– Wesley, Reading, MA.
LAW, A. M. [2007], Simulation Modeling and Analysis, 4th ed., McGraw-Hill, New York.
LEARMONTH, G. P., AND P. A. W. LEWIS [1973], “Statistical Tests of Some Widely Used and Recently Proposed Uniform Random Number Generators,” Proceedings ofthe Conference on Computer Science and Statistics: Seventh Annual Symposium on the Interface, Western Publishing, North Hollywood, CA, pp. 163–171.
L’ECUYER, P. [1988], “Efficient and Portable Combined Random Number Generators,” Communications of the ACM, Vol. 31, pp. 742–749, 774.
L’ECUYER, P. [1996], “Combined Multiple Recursive Random Number Generators,” Operations Research, Vol. 44, pp. 816–822.
L’ECUYER, P. [1998], “Random Number Generation,” Chapter 4 in Handbook of Simulation, J. Banks, ed., pp. 93–137. Wiley, New York.
L’ECUYER, P. [1999], “Good Parameters and Implementations for Combined Multiple Recursive Random Number Generators,” Operations Research, Vol. 47, pp. 159–164.
L’ECUYER, P., R. SIMARD, E. J. CHEN,AND W. D. KELTON [2002], “An Object-Oriented Random-Number Package with Many Long Streams and Substreams,” Operations Research, Vol. 50, pp. 1073–1075.
LEHMER, D. H. [1951], “Mathematical Methods in large-Scale Computing Units,” Proceedings ofthe Second Symposium on Large-Scale Digital Calculating Machinery, Harvard University Press, Cambridge, MA, pp. 141–146.
LEWIS, P. A. W., A. S. GOODMAN, AND J. M. MILLER [1969], “A Pseudo-Random Number Generator for the System/360,” IBM Systems Journal, Vol. 8, pp. 136–145.
RIPLEY, B. D. [1987], Stochastic Simulation, Wiley, New York.
SCHMIDT, J. W., and R. E. TAYLOR [1970], Simulation and Analysis of Industrial Systems, Irwin, Home wood, IL.
习题
设计一种方法,在区间 [0, 1] 上以 2 位精度实际产生随机数。[提示:考虑从帽子里抽取某物。]
列举伪随机数除系统仿真之外的一些应用——例如视频博彩游戏。
如何把在区间 [0, 1] 上均匀的随机数,转换成在区间 [−11, 17] 上均匀的随机数?
用线性同余法生成一串三个两位随机整数及相应的随机数。令 ,,,。
若 ,在上一题中是否会遇到问题?
用乘法同余法生成一串四个三位随机整数及相应的随机数。令 ,,。
已生成数字序列 0.54、0.73、0.98、0.11 和 0.68。用 的 Kolmogorov–Smirnov 检验,判断"这些数字在区间 [0, 1] 上均匀分布"这一假设能否被拒绝。
把例 7 中的 100 个两位随机数倒序排列,得到一组新的随机数。于是新集合中的第一个随机数为 0.43。用 的卡方检验,判断"这些数字在区间 [0, 1] 上均匀分布"这一假设能否被拒绝。
查明下列线性同余发生器能否达到最大周期;同时说明为获得该周期对 有何限制:
- (a) 混合同余法,取
- (b) 乘法同余发生器,取
- (c) 混合同余发生器,取
- (d) 乘法同余发生器,取
用混合同余法生成一串三个两位随机整数及相应的随机数,取 ,。
用混合同余法生成一串介于 0 与 24 之间的三个两位随机整数及相应的随机数,取 ,。
编写一个计算机程序,用乘法同余法产生四位随机数。允许用户输入 和 的取值。
若在习题 中 ,生成该序列中的第一个随机数。计算到小数点后四位。
调查你可接触到的一台计算机上的电子表格程序中的随机数发生器。在许多电子表格中,随机数是由名为 RAND 或 @RAND 的函数产生的。
- (a) 查阅用户手册,看它是否说明了随机数是如何生成的。
- (b) 编写宏来实施本章所述的每一项检验。生成 100 组随机数,每组含 1000 个随机数。对每组随机数实施每一项检验。得出结论。
考虑在下列情形下的乘法同余发生器:
- (a)
- (b)
- (c)
- (d)
在每种情形下生成足够的取值以完成一个循环。可以得出什么结论?是否达到了最大周期?
L’Ecuyer [1988] 给出了一个组合三个乘法发生器的发生器,其中 157,,且 。该发生器的周期约为 。用这个组合发生器生成 5 个随机数,各基本发生器的初始种子取 和 。
把本章所述的检验应用于上一习题给出的发生器。
利用本章所述的原理,设计你自己的线性同余随机数发生器。
利用本章所述的原理,设计你自己的组合线性同余随机数发生器。
用本章中学到的程序,对下列数字序列作均匀性与独立性检验:0.594, 0.928, 0.515, 0.055, 0.507, 0.351, 0.262, 0.797, 0.788, 0.442, 0.097, 0.798, 0.227, 0.127, 0.474, 0.825, 0.007, 0.182, 0.929, 0.852.
在某些应用中,有必要能够快速地在伪随机数序列中向前跳跃,而不必实际生成其间的全部取值。
- (a) 对 的线性同余发生器,证明 mod 。
- (b) 接着证明 mod mod mod m(这一结果很有用,因为 mod m 可以预先算出,从而便于从序列中任意一点向前跳跃 n 个随机数)。
- (c) 在例 3 中,利用这一结果计算 ,起始条件为 。用通常的方法计算 以核对你的答案。
产生良好的伪随机数发生器,远比看上去困难。例如,数学天才 John Von Neumann 提出了平方法(middle-square method)。要用平方法产生六位伪随机数,先以一个六位整数作为种子。把该数平方,抽取其中间的六位数字作为序列中的下一个数。通过反复平方当前数字并抽取中间六位数字来继续这一过程。若要得到 0 与 1 之间的数,可以在这六位数字之前放一个小数点。试算几个例子,以说明该方法可能如何遭遇惊人的失败(Von Neumann 本人已意识到这些问题)。
www.bcnn.net 上提供的资料清单
RandomNumberTools.xls
8 随机变量生成
本章讨论从各种常用的连续分布与离散分布中抽样的方法。此前的讨论和示例表明,概率分布在刻画那些一般无法预测或存在不确定性的建模活动时很有用。例如,队列处的到达间隔时间(interarrival time)和服务时间(service time)以及产品需求,在相当程度上常常是无法预测的。通常,这类变量被建模为服从某个给定概率分布的随机变量(random variable),并且已有标准的统计程序可用于估计所假设分布的参数,以及检验所假定统计模型的有效性。
在本章中,我们假定一个分布已经完全指定,并寻求从该分布生成样本的方法,以用作仿真模型(simulation model)的输入。本章的目的是解释并举例说明若干广泛使用的随机变量生成(random variate generation)技术,而不是要对最高效的技术作一份最新进展的综述。在实践中,大多数仿真建模人员会使用编程库中已有的例程,或者仿真语言内置的例程。然而,有些编程语言并未为所有常用分布提供内置例程,有些计算机配置也没有随机变量生成库;在这些情况下,建模者必须自行构造一个可接受的例程。尽管发生这种情况的可能性很小,但了解随机变量生成究竟是如何进行的,仍然是值得的。
本章讨论逆变换法(inverse-transform technique),并较为简要地讨论接受-拒绝法(acceptance-rejection technique)和特殊性质。另一种技术——组合法(composition method)——由 Devroye [1986]、Dagpunar [1988] 和 Law [2007] 讨论。本章所有技术都假定可以方便地获得 [0, 1] 上的均匀随机数源 ,其中每个 的 pdf 为
cdf 为
在本章中,R 与 代表在 [0, 1] 上均匀分布的随机数,它们由随机数生成(random-number generation)技术产生,或取自随机数表,例如附录中的表 A.1。本章中的许多算法已被译成 Visual Basic for Applications,可在 www.bcnn.net 上的电子表格 RandomNumberTools.xls 中找到。
1 逆变换法
逆变换法可用于从指数分布、均匀分布、Weibull 分布和三角分布中抽样,也可用于从经验分布中抽样。此外,它还是从大量离散分布中抽样的基本原理。本节先以指数分布为例详细说明该方法,然后再将其应用于其他分布。就计算而言,它是最直接的方法,但并不总是最高效的方法。
1.1 指数分布
指数分布的概率密度函数(pdf)为
累积分布函数(cdf)为
参数 λ 可以解释为单位时间内发生次数的均值。例如,若到达间隔时间 服从速率为 λ 的指数分布,那么 λ 就可以解释为单位时间内到达次数的均值,即到达率(arrival rate)。注意,对任意 i,
因此 就是平均到达间隔时间。本节的目标是构造一个生成值 的过程,使其服从指数分布。
原则上,逆变换法可以用于任何分布,但只有当 cdf()的形式极为简单、其逆()易于计算时,该方法才最为有用。(记号 表示方程 关于 x 的解;它并不表示 。)下面给出逆变换法的一个分步过程,此处以指数分布为例加以说明:
步骤 1. 计算所求随机变量 的 cdf。
对于指数分布,cdf 为 。
步骤 2. 在 X 的取值范围内令 。
对于指数分布,它变为在范围 上的 。X 是一个随机变量(在本例中服从指数分布),因此 也是一个随机变量,这里称之为 R。如后文将要说明的,R 在区间 [0, 1] 上服从均匀分布。
步骤 3. 将方程 就 R 解出 X。
对于指数分布,求解过程如下:
式 (1) 称为指数分布的随机变量生成器(random-variate generator)。一般地,式 (1) 写作 。要生成一串取值,则通过步骤 4 完成。
步骤 4. 生成(按需要)均匀随机数 ,并按下式计算所求的随机变量
对于指数情形,由式 (1) 得 ,因此
其中 。式 (2) 中通常采用的一项简化是把 替换为 ,从而得到
这一替代做法之所以合理,是因为 与 都在 [0, 1] 上服从均匀分布。
例 1
表 1 给出了取自表 A.1 的一串随机数,以及由式 (2)(取 )计算得到的指数随机变量 。图 1(a) 是取自均匀分布的 200 个值 的直方图,图 1(b) 是由式 (2) 计算得到的 200 个值 的直方图。把这些经验直方图与图 1(c) 和 (d) 中的理论密度函数作比较。如图所示,直方图是底层密度函数的一种估计。
表 1 给定随机数 时,均值为 1 的指数随机变量 的生成
| i | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 0.1306 | 0.0422 | 0.6597 | 0.7965 | 0.7696 | |
| 0.1400 | 0.0431 | 1.078 | 1.592 | 1.468 |
图 2 给出了逆变换法的图解解释。图中所示的 cdf 为 ,这是一个速率为 的指数分布。要生成一个具有 cdf 的值 ,先在 0 与 1 之间生成一个随机数 ,然后从 向 cdf 的图形作一条水平线,再向下作一条垂直线到 x 轴,从而得到所求结果 。注意 与 之间的互逆关系,即
以及
一般地,该关系写作
以及
由这一过程生成的随机变量 为什么具有所期望的分布呢?取一个值 并计算累积概率
要理解式 (4) 中的第一个等号,请参见图 2,其中固定的数 和 画在各自的坐标轴上。可以看出, 当且仅当 。由于 ,式 (4) 中的第二个等号立即由 在 [0, 1] 上均匀分布这一事实得到。式 (4) 表明 的 cdf 就是 ;因此, 具有所期望的分布。


![图 1(c) [0,1] 上的理论均匀密度](/img/ch08/img_222a7fcfeead5806.jpg)

图 1 (a) 200 个均匀随机数的经验直方图;(b) 200 个指数随机变量的经验直方图;(c) [0, 1] 上的理论均匀密度;(d) 均值为 1 的理论指数密度。
1.2 均匀分布
考虑一个在区间 [a, b] 上均匀分布的随机变量 X。生成 X 的一个合理设想是

图 2 逆变换法的图解。
(请记住,R 始终是 [0, 1] 上的随机数。)X 的 pdf 为
式 (5) 的推导沿用第 1.1 节的步骤 1 至步骤 3:
步骤 1. cdf 为
步骤 2. 令 。
步骤 3. 就 R 解出 X 得 ,与式 (5) 一致。
1.3 Weibull 分布
Weibull 分布是作为机器或电子元件失效时间的模型而引入的。当位置参数 ν 取 0 时:
其中 和 分别是该分布的尺度参数(scale parameter)和形状参数(shape parameter)。要生成一个 Weibull 随机变量,请沿用第 1.1 节的步骤 1 至步骤 3:
步骤 1. cdf 为 。
步骤 2. 令 。
步骤 3. 就 R 解出 X 得
式 (6) 的推导留给读者作为习题 10。比较式 (6) 与式 (1) 可以看出,若 X 是 Weibull 随机变量,则 是均值为 的指数随机变量。反过来,若 Y 是均值为 的指数随机变量,则 是形状参数为 、尺度参数为 的 Weibull 随机变量。
1.4 三角分布
考虑一个 pdf 为
的随机变量 X,如图 3 所示。这个分布称为三角分布(triangular distribution),其端点为 ,众数在 1 处。其 cdf 为
对于 ,

图 3 某一特定三角分布的密度函数。
而对于 ,
在式 中, 意味着 ,此时 。由式 (8), 意味着 ,此时 。于是,X 由下式生成:
习题 2、3 和 4 让读者练习处理其他三角分布。注意,若随机变量 X 的 pdf 和 cdf 是分段给出的(即在 X 取值范围的不同部分需要不同的公式),那么应用逆变换法生成 X 时,将得到在 R 取值范围的不同部分上各不相同的公式,如式 (9) 所示。
1.5 经验连续分布
若建模者未能找到一个能为输入数据提供良好模型的理论分布,那么就有必要使用数据的经验分布(empirical distribution)。一种可能做法是直接对观测到的数据本身重抽样。这称为使用经验分布,当已知输入过程只取有限多个值时,这样做尤其合理。本章第 1.7 节给出了这类情形的一个例子,以及生成随机输入的一种方法。
另一方面,若数据被认为取自一个连续取值的输入过程,那么在观测数据点之间作插值以填补空缺就是合理的做法。本节描述一种定义连续经验分布并从中生成数据的方法。
例 2
已经收集到五组消防队响应时间(以分钟计)的观测值,用以开展一项仿真研究,考察可能的备选人员配置与班组排班政策。数据为
在收集更多数据之前,希望先建立一个初步的仿真模型,其中的响应时间分布基于这五组观测值。因此,需要一种从响应时间分布中生成随机变量的方法。初步假定响应时间 X 的取值范围为 ,其中 c 未知,但将由 估计,其中 为原始数据, 为观测值个数。
把数据由小到大排列,令 表示这些排序后的取值。认为可能的最小取值为 0,故定义 。给每个区间 赋予概率 ,如表 2 所示。由此得到的经验 cdf 见图 4。第 i 段线段的斜率为
逆 cdf 由下式计算:
其中 。例如,若生成随机数 ,可以看出 落在第四个区间内(在 与 之间);于是由式 (10),
生成过程的图解说明请参见图 4。
表 2 消防队响应时间数据汇总
| i | 区间 | 概率 | 累积概率 | 斜率 |
|---|---|---|---|---|
| 1 | 0.2 | 0.2 | 4.00 | |
| 2 | 0.2 | 0.4 | 2.20 | |
| 3 | 0.2 | 0.6 | 1.05 | |
| 4 | 0.2 | 0.8 | 1.90 | |
| 5 | 0.2 | 1.0 | 4.65 |

图 4 消防队响应时间的经验 cdf。
在例 2 中,经验 cdf 把每一个数据点都表示了出来。若可以获得很大的样本(借助自动化数据采集,样本量可以达到数百乃至数万),那么先把数据汇总成区间数少得多的频数分布(frequency distribution),再对该频数分布拟合一条连续经验 cdf,可能更为方便(计算效率也更高)。为此只需对式 (10) 作一点点推广。现在第 i 段线段的斜率为:
其中 是频数分布前 i 个区间的累积概率, 是第 i 个区间。逆 cdf 计算如下:
其中 。
例 3
假定已经收集到 100 个机器修理时间。数据按各个区间中的观测值个数汇总于表 3。例如,0 至 0.5 小时之间有 31 个观测值,0.5 至 1 小时之间有 10 个,依此类推。假定已知所有修理至少需要 15 分钟,因而总有 小时。于是置 ,如表 3 和图 5 所示。
表 3 修理时间数据汇总
| i | 区间(小时) | 频数 | 相对频数 | 累积频数 | 斜率 |
|---|---|---|---|---|---|
| 1 | 0.25 ≤ x ≤ 0.5 | 31 | 0.31 | 0.31 | 0.81 |
| 2 | 0.5 < x ≤ 1.0 | 10 | 0.10 | 0.41 | 5.0 |
| 3 | 1.0 < x ≤ 1.5 | 25 | 0.25 | 0.66 | 2.0 |
| 4 | 1.5 < x ≤ 2.0 | 34 | 0.34 | 1.00 | 1.47 |

图 5 由修理时间数据的经验分布函数生成随机变量()。
例如,假定所生成的第一个随机数为 。由于 介于 与 之间,
再举一个例子,假定 。由于 ,
点 同样示于图 5。
现在重新审视表 3 中的数据。数据的取值被限制在 之内,但其背后的分布可能有更宽的取值范围。这给出了一条重要的理由,说明为何要为数据寻找一个理论概率分布(如伽马分布或 Weibull 分布):这些分布确实允许更宽的取值范围——即 。另一方面,经验分布紧贴数据本身所呈现的内容,而数据往往是能够获得的信息中最好的来源。
当数据以频数区间的形式汇总时,建议采用相对较短的区间,因为这样做能更准确地刻画底层的 cdf。例如,对于表 3 中的修理时间数据,其观测值个数为 ,若使用 10 至 20 个区间(这当然不算过多),本可以得到远为准确的估计,而不是像这里为便于说明而实际使用的四个相当宽的区间。
以下几点值得注意:
- 这一过程的计算机化版本会随着区间个数 n 的增加而变得低效。系统化的计算机版本常称为查表生成方案(table-lookup generation scheme),因为给定一个 R 的取值,计算机程序必须在一组 值中查找 R 所落入的区间 i,即满足
的区间 i。区间越多,若按这里所述的粗略方式实现,查找所需的时间平均而言就越长。编程实现该过程时,分析人员应当权衡估计 cdf 的准确性与计算效率之间的取舍。若可以获得大量的观测值,分析人员很可能决定把观测值归入 20 至 50 个区间,然后采用例 3 的过程——或者也可以采用更高效的查表过程,例如 Law [2007] 所描述的那种。
- 在例 2 中,假定响应时间 X 满足 。这一假定导致图 4 和表 2 中纳入了点 与 。如果事先已知 X 落在另一个范围内——例如,已知响应时间总是在 15 秒至 3 分钟之间,即
——那么就应当用点 与 来估计响应时间的经验 cdf。注意,由于纳入了新的点 ,现在共有六个区间而不是五个,每个区间赋予概率 。习题 12 说明了对这些附加假定的运用。
1.6 无闭式逆函数的连续分布
有不少有用的连续分布,其 cdf 或其逆函数没有闭式表达式;例子包括正态分布、伽马分布和贝塔分布。因此,人们常说逆变换法不能用于这些分布的随机变量生成。但只要我们愿意近似逆 cdf,或者对 cdf 作数值积分并加以搜索,这一方法实际上是可以用的。尽管这种做法听上去不够精确,请注意即使是闭式逆函数,在计算机上求值时也需要作数值近似。例如,通过逆 cdf 生成服从指数分布的随机变量,就需要对对数函数作数值近似。因此,使用近似逆 cdf 与近似求值一个闭式逆函数之间,并没有本质差别。使用近似逆 cdf 的问题在于,其中有些在计算上求值缓慢。
为说明这一思想,考虑 Schmeiser [1979] 提出的标准正态分布逆 cdf 的一个简单近似:
当 时,该近似的精度至少达到小数点后一位。表 4 把该近似与若干 R 取值下通过数值积分得到的精确值(保留四位小数)作了比较。还存在精度高得多、而复杂程度只是略高的近似。Bratley、Fox 和 Schrage [1996] 是若干分布此类近似的一个很好的来源。
表 4 标准正态分布的近似逆函数与精确值(保留四位小数)比较
| R | 近似逆函数 | 精确逆函数 |
|---|---|---|
| 0.01 | -2.3263 | -2.3373 |
| 0.10 | -1.2816 | -1.2813 |
| 0.25 | -0.6745 | -0.6713 |
| 0.50 | 0.0000 | 0.0000 |
| 0.75 | 0.6745 | 0.6713 |
| 0.90 | 1.2816 | 1.2813 |
| 0.99 | 2.3263 | 2.3373 |
1.7 离散分布
所有离散分布都可以用逆变换法生成,或者通过查表过程以数值方式生成,或者在某些情况下以代数方式生成(最终的生成方案为一个公式)。对某些分布还会使用其他技术,例如用于二项分布的卷积技术(convolution technique)。其中一些方法将在后面几节讨论。本小节给出若干例子,涵盖经验分布以及两个标准离散分布——(离散)均匀分布和几何分布。Bratley、Fox 和 Schrage [1996] 以及 Ripley [1987] 给出了这些分布和其他分布的高效查表过程。
例 4:经验离散分布
每天结束时,IHW 公司装卸码头上的发货批次要么是 0,要么是 1,要么是 2,其观察到的相对频数分别为 0.50、0.30 和 0.20。公司内部的顾问(consultants)受命开发一个模型,以改进装卸与搬运作业的效率;作为该模型的一部分,他们需要能够生成代表每天结束时码头发货批次数的取值 X。顾问们决定把 X 建模为一个离散随机变量,其分布如表 5 所示、见图 6。
表 5 发货批次 X 的分布
| x | p(x) | F(x) |
|---|---|---|
| 0 | 0.50 | 0.50 |
| 1 | 0.30 | 0.80 |
| 2 | 0.20 | 1.00 |
概率质量函数(pmf) 为
cdf( )为
请记住,离散随机变量的 cdf 总是由若干水平线段组成,在该随机变量可能取到的各个点 x 上,线段发生大小为 的跳跃。例如,在图 6 中,在 处有一个大小为 的跳跃,在 处有一个大小为 的跳跃,在 处有一个大小为 的跳跃。

图 6 发货批次 X 的 cdf。
对于离散随机变量的生成,逆变换法变成一个查表过程,但与连续变量的情形不同,它不需要插值。为说明这一过程,假定生成了 。在图上,如图 6 所示,先在纵轴上找到 ,接着作一条水平线段直到撞上 cdf 中的一个“跳跃”,然后向横轴作垂线以得到所生成的随机变量。这里 被变换为 。这一过程与第 1.5 节中用于经验连续分布、并示于图 4 的过程类似,只是省去了最后一步——线性插值。
构造类似于表 6 的表格有助于实现这一查表过程。当生成 时,先找出 所落入的区间。一般地,对 ,若
则置 。这里, 是该随机变量的可能取值;而 对于本例, 且 因而 且 。(注意,在所有情形下都有 。)
表 6 用于生成离散随机变量 X 的表
| 输入 | 输出 | |
|---|---|---|
| 1 | 0.50 | 0 |
| 2 | 0.80 | 1 |
| 3 | 1.00 | 2 |
由于 ,置 。生成方案汇总如下:
例 4 说明了查表过程;下一个例子说明可用于某些分布的代数方法。
例 5:离散均匀分布
考虑集合 上的离散均匀分布,其 pmf 与 cdf 分别为
以及
令 且 ( )。那么由不等式 (13) 可以看出,若所生成的随机数 R 满足
则通过令 生成 X。现在可以对 i 解出不等式 (14):
记 为不小于 y 的最小整数。例如, ,且 。当 时, 是一个向上取整的函数。这一记号与不等式 (15) 合在一起,给出了生成 X 的一个公式,即
例如,考虑生成一个在 上均匀分布的随机变量 X。该随机变量 X 可以表示装上一辆卡车所要装载的托盘数。以表 A.1 作为随机数 R 的来源,并使用式 (16)(取 ),得到
这里讨论的过程稍加修改即可生成取值范围为任意一组连续整数的离散均匀随机变量。习题 13 要求学生为这样一个情形设计生成过程。
例 6:几何分布
考虑 pmf 为
的几何分布,其中 。其 cdf 为
其中 。使用逆变换法[即不等式 (13)],请回忆几何随机变量 X 在下述条件成立时取值为 x:
其中 R 是所生成的随机数,假定 。对不等式 (17) 解出 x 的过程如下:
但 意味着 ,因此
于是,对满足不等式 (18) 的那个整数 x,取 。简言之,利用向上取整函数 ,有
由于 是固定参数,令 。则 ,且由式 (19), 。由式 可知, 是均值为 的指数随机变量;因此,生成参数为 的几何随机变量的一种办法是:生成一个(用任何方法)参数为 的指数随机变量,减去 1,再向上取整。
有时人们需要的几何随机变量 X 的可能取值为 ,其 pmf 为 ( )。这类随机变量 X 可由式 (19) 生成为
最常见的情形之一是 。
例 7
生成取值范围为 、均值为 2 的几何分布的三个取值。这样的几何分布其 pmf 为 ( ),均值为 即 。因此,可以由式 (20)(取 ,且 )生成 X。取自表 的 和 给出
习题 15 讨论几何分布的一个应用。
2 接受-拒绝法
假设分析人员需要设计一种方法,生成在 1/4 与 1 之间均匀分布的随机变量 X。可以按如下步骤进行:
步骤 1. 生成一个随机数 R。
步骤 2a. 若 ,则接受 ,转到步骤 3。
步骤 2b. 若 ,则拒绝 R,返回步骤 1。
步骤 3. 若还需要另一个 [1/4, 1] 上的均匀随机变量,则从步骤 1 开始重复上述过程。否则停止。
每次执行步骤 1,都必须生成一个新的随机数 R。在这一接受-拒绝技术中,步骤 2a 是"接受",步骤 2b 是"拒绝"。概括来说,该技术是:生成具有某种分布(此处为 [0, 1] 上的均匀分布)的随机变量 R,直到某个条件(此处为 )被满足。当该条件最终被满足时,就可以计算出所求的随机变量 X(此处为 [1/4, 1] 上的均匀分布)( )。这一过程之所以正确,是因为被接受的 R 的取值是条件化取值;也就是说,R 本身并不具有所期望的分布,但在事件 条件下的 R 才具有所期望的分布。要说明这一点,取 则
这正是 [1/4, 1] 上均匀分布的正确概率。式 (21) 说明,在 R 位于 1/4 与 1 之间这一条件下(R 的其他取值全部被舍去),R 的概率分布就是所期望的分布。因此,若 ,置 。
接受-拒绝技术的效率在很大程度上取决于能否把拒绝的次数降到最低。在本例中,拒绝的概率为 ,因此拒绝次数是一个服从几何分布的随机变量,其"成功"概率为 ,平均拒绝次数为 。(例 6 讨论了几何分布。)生成一个随机变量 X 所需的平均随机数 R 个数比拒绝次数多 1,故为 。换句话说,生成 1000 个 X 的取值大约需要 1333 个随机数 R。
在当前这种情形下,生成 [1/4, 1] 上均匀变量的另一种过程是存在的——即式 (5),它化为 。究竟是接受-拒绝法更高效,还是像逆变换法[式 (5)]这样的另一种过程更高效,取决于若干考虑。所使用的计算机、程序员的技术水平,以及接受-拒绝法为生成额外的(被拒绝的)随机数所带来的相对低效,都应当与另一种过程所需的计算量作比较。在实践中,对生成效率的关注通常交给专门的专家,他们通过广泛的试验来比较各种方法(即,直到某个仿真模型因所用发生器而开始需要过长的计算机运行时间为止)。
对于 [1/4, 1] 上的均匀分布,式 (5) 的逆变换法无疑比接受-拒绝法容易应用得多,效率也高得多。本例的主要目的是解释并阐明接受-拒绝法的基本概念。然而,对于某些重要的分布,如正态分布、伽马分布和贝塔分布,逆 cdf 没有闭式表达式,因而逆变换法难以使用。这些更为高级的技术由 Bratley、Fox 和 Schrage [1996] 以及 Law [2007] 作了总结。
在下面几小节中,将说明如何用接受-拒绝法生成泊松分布、非平稳泊松分布和伽马分布的随机变量。
2.1 泊松分布
一个均值为 的泊松随机变量 N,其 pmf 为
然而更为重要的是,N 可以解释为一个单位时间内泊松到达过程(Poisson arrival process)的到达次数相继到达顾客的到达间隔时间 服从速率为 α 的指数分布(即 α 是单位时间内到达次数的均值);此外,指数随机变量可由式 (3) 生成。因此,离散的泊松分布与连续的指数分布之间存在如下关系:
当且仅当
式 (22)( )说的是在一个单位时间内恰好发生了 n 次到达;而不等式 (23) 说的是第 n 次到达发生在时刻 1 之前,而第 次到达发生在时刻 1 之后。显然,这两个陈述是等价的。现在可以通过生成指数到达间隔时间直到某次到达(比如第 次)发生在时刻 1 之后为止,然后置 来进行。
为了高效生成,不等式 (23) 通常先借助式 (3)( ln R )加以简化,得到
接下来两边同乘 ,这会使不等号方向反转,并利用"对数之和等于乘积之对数"这一事实,得到
最后,对任意数 x 利用关系 ,得到
它与不等式 (23) 等价。生成泊松随机变量 N 的过程由以下步骤给出:
步骤 1. 置 。
步骤 2. 生成一个随机数 ,并把 P 替换为 。
步骤 3. 若 ,则接受 。否则,拒绝当前的 n,把 n 加 1,返回步骤 2。
注意,步骤 2 完成后,P 等于不等式 (24) 中最右端的表达式。拒绝技术的基本思想在这里再次得到体现:若在步骤 3 中 ,则 n 被拒绝,生成过程必须至少再进行一次试探。
平均而言,生成一个泊松随机变量 N 需要多少个随机数呢?若 ,则需要 个随机数,因此平均个数由下式给出:
若泊松分布的均值 α 很大,这个数就相当大。
例 8
生成三个均值为 的泊松随机变量。首先计算 。接下来,从表 A.1 取一串随机数 R,按前面描述的步骤 1 至步骤 3 进行:
步骤 1. 置 。步骤 2. 。步骤 3. 由于 ,接受 。
步骤 1–3.( 导致 。)步骤 1. 置 。步骤 2. 步骤 3. 由于 ,拒绝 并带着 返回步骤 2。
步骤 2. 步骤 3. 由于 ,拒绝 并带着 返回步骤 2。
步骤 2. 步骤 3. 由于 ,接受 。
生成这三个泊松随机变量所需的计算汇总如下:
| n | P | 接受/拒绝 | 结果 | |
|---|---|---|---|---|
| 0 | 0.4357 | 0.4357 | (接受) | N=0 |
| 0 | 0.4146 | 0.4146 | (接受) | N=0 |
| 0 | 0.8353 | 0.8353 | (拒绝) | |
| 1 | 0.9952 | 0.8313 | (拒绝) | |
| 2 | 0.8004 | 0.6654 | (接受) | N=2 |
这里生成三个泊松随机变量( 和 )用了五个随机数 R;但从长期来看,若要生成比如 1000 个均值为 的泊松随机变量,大约需要 即 1200 个随机数。
例 9
在 Peachtree 与 North Avenue 交叉口的公交站,公交车按泊松过程到达,平均每 15 分钟一辆。生成一个随机变量 N,表示某个 1 小时时段内到达的公交车数。现在,N 服从均值为每小时四辆车的泊松分布。首先计算 。使用取自表 A.1 的 12 个随机数,得到如下汇总结果:
| n | P | 接受/拒绝 | 结果 | |
|---|---|---|---|---|
| 0 | 0.4357 | 0.4357 | (拒绝) | |
| 1 | 0.4146 | 0.1806 | (拒绝) | |
| 2 | 0.8353 | 0.1508 | (拒绝) | |
| 3 | 0.9952 | 0.1502 | (拒绝) | |
| 4 | 0.8004 | 0.1202 | (拒绝) | |
| 5 | 0.7945 | 0.0955 | (拒绝) | |
| 6 | 0.1530 | 0.0146 | (接受) | N = 6 |
可以立即看出,α 的取值越大(此处 ),通常所需的随机数就越多;若需要 1000 个泊松随机变量,大约需要 个随机数。
当 α 较大时(比如 ),这里所勾勒的拒绝技术就变得相当昂贵;所幸,基于正态分布的近似技术效果相当好。当均值 α 较大时,
近似服从均值为零、方差为 1 的正态分布;这一观察提示我们采用一种近似技术。首先按第 3.1 节的式 (28) 生成一个标准正态随机变量 Z,然后按下式生成所求的泊松随机变量 N:
其中 是第 1.7 节所述的向上取整函数。(若 ,则置 。)公式中所用的 使向上取整函数变成了"四舍五入到最接近整数"的函数。式 (25) 不是一种接受-拒绝技术,但当它被用作接受-拒绝法的替代方案时,可以为生成均值很大的泊松随机变量提供一种相当高效而准确的方法。
2.2 非平稳泊松过程
另一类接受-拒绝方法(称为抽稀法,thinning)可用于生成非平稳泊松过程(nonstationary Poisson process, NSPP)的到达间隔时间,该过程的到达率为 。NSPP 是到达率随时间而变化的到达过程。
例如,考虑表 7 给出的、每小时发生变化的到达率函数。抽稀法的思路是:以最快的速率(在本例中为每分钟 1/5 位顾客)生成一个平稳泊松到达过程,但只"接受"或保留其中一部分到达,抽稀的幅度恰好足以得到所期望的时变速率。下面给出通用算法,它生成 作为第 i 次到达的时刻。请记住,在平稳泊松到达过程中,到达之间的时间服从指数分布。
步骤 1. 令
为到达率函数的最大值,并置 和 。
步骤 2. 从速率为 的指数分布中生成 E,并令 (这就是该平稳泊松过程的到达时刻)。
步骤 3. 从 分布中生成随机数 R。若 则令 且 步骤 4. 转到步骤 2。
若典型到达率与最大到达率之间的差异很大,抽稀算法可能效率不高。不过,抽稀法的优点在于它适用于任何可积的到达率函数,而不只是像本例这样分段为常数的函数。
表 7 NSPP 示例的到达率
| t(分钟) | 平均到达间隔时间(分钟) | 到达率 λ(t)(次/分钟) |
|---|---|---|
| 0 | 15 | 1/15 |
| 60 | 12 | 1/12 |
| 120 | 7 | 1/7 |
| 180 | 5 | 1/5 |
| 240 | 8 | 1/8 |
| 300 | 10 | 1/10 |
| 360 | 15 | 1/15 |
| 420 | 20 | 1/20 |
| 480 | 20 | 1/20 |
例 10
对于表 7 中的到达率函数,生成前两个到达时刻。
步骤 1. 且 。步骤 2. 对随机数 ,有 ,且 。
步骤 3. 生成 。由于 ,故不生成该次到达。
步骤 4. 转到步骤 2。
步骤 2. 对随机数 ,有 ,且 。步骤 3. 生成 。由于 ,故置 且 。
步骤 4. 转到步骤 2。
步骤 2. 对随机数 ,有 ,且 。
步骤 3. 生成 。由于 ,故置 且 。
步骤 4. 转到步骤 2。
2.3 伽马分布
人们已经开发出若干用于生成伽马随机变量的接受-拒绝技术。(参见 Bratley、Fox 和 Schrage [1996] 以及 Law [2007]。)其中较为高效的一种由 Cheng [1977] 提出;对形状参数 β 的任意取值 ,其平均试探次数介于 1.13 与 1.47 之间。若形状参数 β 为整数,比如 则可以采用例 12 中的卷积技术,因为厄兰分布(Erlang distribution)是更一般的伽马分布的一个特例。另一方面,这里所描述的接受-拒绝技术对厄兰分布而言将是极为高效的方法,尤其当 较大时。该例程生成具有尺度参数 θ 和形状参数 β 的伽马随机变量——也就是说,均值为 ,方差为 。其步骤如下:
步骤 1. 计算 。
步骤 2. 生成 和 。置 。
步骤 3. 计算 。
步骤 4a. 若
则拒绝 X 并返回步骤 2。
步骤 4b. 若
则把 X 作为所求的随机变量。
步骤 4b 所生成的随机变量,其均值与方差都等于 。若希望均值为 且方差为 ,则还要加入步骤 5。
(步骤 5. 把 X 替换为 )
所有接受-拒绝方法的基本思想在这里再次得到说明,但本例的证明超出了本书的范围。在步骤 3 中, 并不服从伽马分布,但在步骤 4a 中拒绝 X 的某些取值,保证了步骤 4b 中被接受的取值确实服从伽马分布。
例 11
已发现某高产量糖果制造机的停机时间服从伽马分布,均值为 2.2 分钟,方差为 2.10 分钟^2。因此, 且 ,两者合起来意味着 且 。
步骤 1. 。
步骤 2. 生成 。置 。
步骤 3. 计算 。
步骤 4. ,故拒绝 X 并返回步骤 2。
步骤 2. 生成 。置 。步骤 3. 计算 。
步骤 4. 由于 ,接受 X。
步骤 5. 用 除 X ,得 。
本例用了两次试探(即一次拒绝)才生成一个可接受的服从伽马分布的随机变量;但平均而言,若要生成比如 1000 个伽马随机变量,该方法将需要 1130 到 1470 次试探,或者等价地需要 2260 到 2940 个随机数。该方法用于手工计算稍嫌繁琐,但在计算机上编程很容易,并且是已知的最有效的伽马发生器之一。
3 特殊性质
“特殊性质"正如其名称所暗示的那样:它们是一些基于概率分布特定族之特征的随机变量生成技术,而不是像逆变换法或接受-拒绝法那样的通用技术。
3.1 正态分布与对数正态分布的直接变换
人们已经开发出多种生成正态分布随机变量的方法。然而,逆变换法难以应用,因为逆 cdf 无法写成闭式形式。标准正态 cdf 为
本节描述一种直观而吸引人的直接变换,它产生一对相互独立的、均值为零方差为 1 的标准正态随机变量。该方法由 Box 与 Muller [1958] 提出。尽管它不如许多更现代的技术高效,但用科学计算语言(如 FORTRAN、C、C++、Visual Basic 或 Java)编写程序十分容易。随后我们说明如何把一个标准正态随机变量变换为均值为 、方差为 的正态随机变量。一旦我们有了(用本方法或任何其他方法)从 分布生成 的方法,就可以利用直接变换 生成参数为 和 的对数正态(lognormal)随机变量 Y 。(请记住, 和 并不是对数正态分布的均值和方差。)
考虑两个标准正态随机变量 和 ,如图 7 所示把它们画成平面上的一个点,并用极坐标表示为

图 7 一对标准正态变量的极坐标表示。
已知 服从自由度为 2 的卡方(chi-square)分布,这等价于均值为 2 的指数分布。因此,半径 B 可用式 (3) 生成:
由正态分布的对称性,可以合理地推测(事实也确实如此)角度在 0 到 2π 弧度之间均匀分布。此外,半径 B 与角度 相互独立。把式 (26) 与式 (27) 结合起来,就得到一种直接方法:由两个相互独立的随机数 和 生成两个相互独立的标准正态随机变量 和 :
为说明这一生成方案,考虑式 (28) 中 和 的情形。所生成的两个标准正态随机变量如下:
为得到均值为 、方差为 的正态随机变量 ,我们随后对标准正态随机变量施加如下变换:
例如,要把这两个标准正态随机变量变换为均值为 、方差为 的正态随机变量,我们计算
请记住,要由正态随机变量 X 得到对数正态随机变量 Y,置 即可。还请记住,对数正态 Y 的均值和方差与正态 X 的并不相同。
3.2 卷积法
两个或多个相互独立随机变量之和的概率分布,称为原有各变量分布的卷积(convolution)。因此,卷积法是指把两个或多个随机变量相加,以得到具有所期望分布的新随机变量。这一技术可用于获得厄兰随机变量和二项随机变量。重要的并不是所求随机变量的 cdf,而是它与那些更易生成的随机变量之间的关系。
例 12:厄兰分布
具有参数 的厄兰随机变量 X 可以证明是 k 个相互独立的指数随机变量 之和,每个的均值为 ——也就是说,
卷积方法的思路是生成 ,然后把它们相加得到 X。在厄兰的情形下,每个 都可以由式 (3)(取 )生成。因此,厄兰随机变量可以生成为
从计算效率看,先把所有随机数相乘、然后只算一次对数,会更加高效。
例 13
卡车以完全随机的方式到达一座大型仓库,这可用到达率为 辆/小时的泊松过程来建模。门口的守卫把卡车交替地送往北码头和南码头。一位分析人员开发了一个模型来研究南码头的装卸过程,需要一个仅有南码头到达过程的模型。南码头处相继卡车到达之间的到达间隔时间 X,等于门口处两个到达间隔时间之和,因而是两个指数随机变量之和,每个的均值为 0.1 小时,即 6 分钟。因此,X 服从厄兰分布,其中 ,均值 小时。要生成随机变量 先从表 A.1 取得 个随机数,比如 和 。然后由式 (30),
一般而言,式 (30) 意味着每生成一个厄兰随机变量都需要 k 个均匀随机数。若 k 较大,用其他技术生成厄兰随机变量会更高效,例如第 2.3 节给出的许多伽马分布接受-拒绝技术之一,或者 Bratley、Fox 和 Schrage [1996] 以及 Law [2007] 所述的技术。
3.3 更多特殊性质
概率分布之间存在许多关系,可以被利用来生成随机变量。第 3.2 节的卷积法就是其中一个例子。另一个特别有用的例子是贝塔分布与伽马分布之间的关系。
假定 服从形状参数为 、尺度参数为 的伽马分布,而 服从形状参数为 、尺度参数为 的伽马分布,并且这两个随机变量相互独立。那么
在区间 [0, 1] 上服从参数为 和 的贝塔分布。若我们希望 定义在区间 上,则置
于是,利用上一节定义的伽马随机变量接受-拒绝技术,我们就可以生成贝塔随机变量,每生成一个贝塔随机变量需要两个伽马随机变量。
虽然这种生成贝塔随机变量的方法很方便,但还有基于接受-拒绝思想的更快方法。例如可参见 Devroye [1986] 或 Dagpunar [1988]。
4 小结
本章通过实例介绍并说明了用逆变换法、接受-拒绝法以及特殊性质进行随机变量生成的基本原理。给出了生成许多重要连续分布和离散分布以及全部经验分布的方法。极佳的综述参见 Schmeiser [1980];更深入的处理请读者参阅 Devroye [1986] 或 Dagpunar [1988]。
参考文献
BRATLEY, P., B. L. FOX, AND L. E. SCHRAGE [1996], A Guide to Simulation, 2d ed., Springer-Verlag, New York.
BOX, G. E. P., AND M. F. MULLER [1958], “A Note on the Generation of Random Normal Deviates,” Annals of Mathematical Statistics, Vol. 29, pp. 610–611.
CHENG, R. C. H. [1977], “The Generation of Gamma Variables with Nonintegral Shape Parameter,” Applied Statistics, Vol. 26, No. 1, pp. 71–75.
DAGPUNAR, J. [1988], Principles of Random Variate Generation, Clarendon Press, Oxford.
DEVROYE, L. [1986], Non-Uniform Random Variate Generation, Springer-Verlag, New York.
LAW, A. M. [2007], Simulation Modeling and Analysis, 4th ed., McGraw-Hill, New York.
RIPLEY, B. D. [1987], Stochastic Simulation, Wiley, New York.
SCHMEISER, B. W. [1979], “Approximations to the Inverse Cumulative Normal Function for Use on Hand Calculators,” Applied Statistics, Vol. 28, pp. 175–176.
SCHMEISER, B. W. [1980], “Random Variate Generation: A Survey,” in Simulation with Discrete Models: A State of the Art View, T. I. Oren, C. M. Shub, and P. F. Roth, eds., IEEE, NY, pp. 79–104.
习题
本节许多习题要求读者为给定分布开发一个生成方案并生成取值。结果应当用某种编程语言或电子表格来实现,以便能够生成大量的随机变量。
- 为随机变量 X 开发一个随机变量生成器,其 pdf 为
- 为具有下列 pdf 的三角分布开发一个生成方案:
生成 1000 个随机变量的取值,计算样本均值,并与该分布的真实均值作比较。
为取值范围为 (1, 10)、众数在 处的三角分布开发一个生成器。生成 1000 个随机变量的取值,计算样本均值,并与该分布的真实均值作比较。
为取值范围为 (1, 10)、均值为 4 的三角分布开发一个生成器。生成 1000 个随机变量的取值,计算样本均值,并与该分布的真实均值作比较。
给定一个取值范围为 −3 到 4 的连续变量,其 cdf 如下:
开发该变量的生成器,生成 1000 个取值,并作直方图。
给定 cdf ( ),为该分布开发一个生成器。生成 1000 个随机变量的取值,计算样本均值,并与该分布的真实均值作比较。
给定 pdf ( ),为该分布开发一个生成器。生成 1000 个随机变量的取值,计算样本均值,并与该分布的真实均值作比较。
为 pdf 为下列形式的随机变量开发一个生成器:
生成 1000 个取值并作直方图。
- 离散随机变量 X 的 cdf 为
当 时,使用 和 生成 X 的三个取值。
某自动化生产过程的失效时间被发现服从参数为 和 的 Weibull 分布。推导式 (6),然后用取自表 A.1 的五个随机数,从该 Weibull 分布生成五个取值。
已收集到 Shady Lane National Bank 某个免下车银行窗口的服务时间数据。这些数据汇总为如下区间:
| 区间(秒) | 频数 |
|---|---|
| 15–30 | 10 |
| 30–45 | 20 |
| 45–60 | 25 |
| 60–90 | 35 |
| 90–120 | 30 |
| 120–180 | 20 |
| 180–300 | 10 |
建立一张类似于表 3 的表,用查表法生成服务时间,并使用取自表 A.1 的四位随机数生成五个服务时间取值。
在例 2 中,假定消防队响应时间满足 。修改表 2 以适应这一假定。然后使用取自表 A.1 的四位均匀随机数,生成五个响应时间取值。
在仿真模型的一个初步版本中,假定装上一辆卡车的托盘数 X 在 8 与 24 之间均匀分布。假定相继各卡车所载货物相互独立,设计一个生成 X 的方法。请使用例 5 中离散均匀分布的技术。最后用取自表 A.1 的四位随机数,生成相继 10 辆卡车所载的货物。
开发一个从参数为 p 和 k 的负二项分布生成取值的方法。当 且 时生成 3 个取值。[提示:考虑负二项分布的定义——即直到第 k 次成功为止的伯努利(Bernoulli)试探次数。]
某种滞销商品的周需求 X 被发现可以很好地用取值范围为 的几何分布来近似,周平均需求为 2.5 件。使用表 A.1 中的随机数生成 10 个每周需求 X 的取值。[提示:对于取值范围为 、参数为 p 的几何分布,其均值为 。]
在习题 15 中,假定需求被发现服从均值为每周 2.5 件的泊松分布。使用表 A.1 中的随机数生成 10 个每周需求 X 的取值。讨论几何分布与泊松分布之间的差别。
提前期被发现服从均值为 3.7 天的指数分布。从该分布生成五个随机提前期。
某生产流程的定期维护被发现存在波动,已建模为均值 33 分钟、方差 4 分钟^2 的正态随机变量。从给定分布生成五个随机维护时间。
一台机器或者发生故障,或者在 5 小时之后,二者以先到者为准而退出生产。通过运行同类机器直至发生故障,发现失效时间 X 服从 Weibull 分布,其中 且 。于是,直到机器退出生产的时间可以表示为 。为生成 Y 开发一个分步过程。
某个部件退出服役之前的时间在 0 到 8 小时之间均匀分布。两个这样的相互独立的部件串联,只要其中一个故障,整个系统就停止。若 表示部件的运行时间,则 表示系统寿命。请设计两种不同的生成 Y 的方法。[提示:其中一种方法比较直接。作为第二种方法,先计算 Y 的 cdf: ,其中 。利用等价关系 且 以及 与 的独立性。求出 后,再接着用逆变换法。]
在习题 20 中,假定部件寿命服从指数分布,一个均值为 2 小时,另一个均值为 6 小时。在这一新假定下重做习题 20。讨论所设计的两种生成方案的相对效率。
开发一种用卷积技术生成二项随机变量 X 的方法。[提示:X 可以表示为 n 次相互独立的伯努利试探中的成功次数,每次成功的概率为 p。因此, ,其中 且 。]
开发一种接受-拒绝技术,用于生成取值范围为 、参数为 p 的几何随机变量 X。[提示:X 可以理解为在一串相互独立的伯努利试探中首次成功之前发生的失败次数。]
编写一个计算机例程,用本章讨论的精确方法生成标准正态随机变量。用它生成 10,000 个取值。把取值落在 的真实概率 与所观察到的"取值 的实际相对频数"作比较,其中 和 4。
编写一个计算机例程,生成形状参数为 、尺度参数为 θ 的伽马随机变量。取 和 生成 1000 个取值,并把真实均值 与样本均值作比较。
编写一个计算机例程,从习题 1 至 23 中的某个随机变量生成 2000 个取值。把这 2000 个取值作成直方图,并与理论密度函数(或对离散随机变量而言为概率质量函数)作比较。
许多电子表格、符号计算和统计分析程序都带有用于从标准分布生成随机变量的内置例程。查阅其中一个软件包的文档,看看它使用了什么样的随机变量生成方法。如果某个随机变量发生器的方法没有文档说明,你是否应当信任它?
假定我们不知怎的获得了一个均值为 1 的指数分布随机变量的来源。编写一个算法,通过变换指数分布随机变量来生成三角分布的随机变量。[提示:先作变换以得到均匀分布的随机变量。]
令时刻 t = 0 对应于上午 6 点,并假定某家早餐餐厅(营业时间为上午 6 点至 9 点)的顾客到达率(以每小时到达数计)为
推导一个抽稀算法,用于从该 NSPP 生成到达,并生成前 100 个到达时刻。
从区间 [0, 1] 上参数为 和 的贝塔分布生成 10 个取值。然后把它们变换到区间 [−10, 20] 上。
假定某个离散分布可取值为 。这些取值等可能,但并不是 。请设计一个利用例 5 中思路的生成方案。[提示:考虑把这些值存放在一个数组中,然后生成一个随机的数组下标。]
假定某网站的点击到达率为 次/小时。推导一个抽稀算法,用于从该 NSPP 生成到达。
www.bcnn.net 上提供的资料清单
RandomNumberTools.xls
9 输入建模
输入模型为仿真提供驱动力。在排队系统的仿真中,典型的输入模型是到达间隔时间分布与服务时间分布。对于供应链仿真,输入模型包括需求与提前期的分布。对于可靠性问题的仿真,部件的失效时间分布就是输入模型的一个例子。
在真实世界的仿真应用中,为输入数据选择合适的分布,从时间和资源需求的角度看是一项主要任务。无论分析人员有多么高明,有缺陷的输入模型都会导致输出在解释时可能产生误导性的建议。
建立有用的输入数据模型包含四个步骤:
从所关注的真实系统中收集数据。这往往需要投入大量的时间与资源。遗憾的是,在某些情况下无法收集数据(例如,时间极为有限、输入过程尚不存在,或者法律或规章禁止收集数据)。当数据不可得时,必须依靠专家意见和对过程的了解作出有根据的猜测。
确定一个概率分布来表示该输入过程。当数据可得时,这一步通常从绘制数据的直方图(histogram)开始。给定直方图以及对过程的结构性认识,就可以选择一个分布族。所幸的是,若干为人熟知的分布在实际应用中常常能提供良好的近似。
选择参数,以确定该分布族的一个具体实例。当数据可得时,这些参数可以由数据估计得出。
评估所选分布及其相关参数的拟合优度(goodness of fit)。拟合优度既可以通过图形方法非正式地评估,也可以通过统计检验正式地评估。卡方检验与 Kolmogorov–Smirnov 检验是标准的拟合优度检验。若不满意所选分布对数据的近似程度,分析人员就回到第 2 步,选择另一个分布族,并重复这一过程。若该过程的若干次迭代都无法在某种假定分布形式与所收集数据之间取得拟合,则可以采用该分布的经验形式。
本章逐一讨论上述每一步。尽管现在已有大量软件可用来完成第 2、3、4 步——包括 ExpertFit® 和 这样的独立程序,以及 Arena 的 Input Processor 和 @Risk 的 BestFit® 这样的集成程序——但理解软件究竟做了什么仍然重要,这样才能恰当地使用软件。遗憾的是,当两个或多个所关注的变量之间存在关系时,或者当没有数据可用时,用于输入建模的软件就不那么容易获得了。这两个主题在本章靠后的部分讨论。
1 数据收集
在数学、物理、化学以及其他技术类学科的教科书中,每章末尾都附有习题,供读者练习。年复一年地做这些习题,会给读者一种印象,仿佛数据是现成可得的。事实远非如此。数据收集是求解实际问题时最大的任务之一,也是仿真中最重要、最困难的问题之一。
输入建模的焦点在于把概率分布拟合到数据的统计层面,这些分布随后将为仿真提供驱动输入。然而,在"拟合"发生之前,需要有准确且相关的输入数据可用(或可收集),并且需要充分理解数据的性质。人们常常把数据直接交给输入建模软件,而软件总会给数据拟合出某个概率模型,不论这种拟合是否有正当理由。下面的例子说明了这种做法常见的陷阱:
例 1:陈旧数据
一项仿真研究将考察如何缩短患者在癌症筛查诊所中耗费的时间。筛查流程的一部分由护士采集患者病史。在 2002 年的一项护理活动研究中,一家咨询公司收集了护士采集患者病史的观测数据。这家医院仍保存着这些数据。当前项目是否应当用它们来做输入建模?
在这种情况下,答案很可能是否定的,因为当前项目的工程师们深入调查后发现,2008 年护士已停止在纸质病历上记录筛查笔记,改为直接把内容录入笔记本电脑。因此,2002 年的数据对应的是另一种不同的病史采集过程,可能会严重歪曲当前的过程。如果由于所需时间或费用而无法收集当前数据,那么宁可使用护士本人给出的估计,也不要依赖那份过时的研究。第 6 节描述了把专家意见转化为概率分布的方法。工程师们还可以主动让自己的病史被采集一次并计时,用得到的几个实际数据点来检验护士的估计。
例 2:出乎意料的数据
出于安保目的,进入某政府大楼的人员必须通过一道包含金属探测器的安检。在实施新的安保流程之前,将开展一项仿真研究以评估其影响。为便于研究,收集了 1000 个通过金属探测器站点所需时间(以分钟计)的观测值。这些数据的均值约为 1/2 分钟,标准差几乎与之相同。这提示通过金属探测器的时间可以用指数分布作为良好的输入模型,因为指数分布的均值与标准差总是相等,而且在排队系统中指数分布常被用来建模服务时间。
然而,分析人员对这一输入模型感到不安,因为根据她的经验,通过金属探测器只需几秒钟。她绘制了数据的直方图,如图 1 所示,这立刻表明通过金属探测的时间由两个明显不同的分布构成。仔细思考后,她意识到有些人毫无意外地通过探测器,而另一些人则触发了警报,必须取出身上残留的金属物品再试一次,某些情况下甚至需要接受人身检查。

图 1 以分钟计量的 1000 个通过金属探测器时间观测值的直方图
因此,这批数据需要三个不同的输入模型:一个是未触发探测器而通过所需时间的模型(直方图中最左侧的 764 个观测值);一个是警报确实响起时通过所需时间的模型(直方图中最右侧的 236 个观测值);还有一个是一个人触发警报的概率模型。虽然指数分布当然能与数据的汇总统计量(均值与标准差)相匹配,但拟合出的指数分布会遗漏安保检查的一个关键特征,几乎必然导致不准确的仿真。
遗憾的是,仔细检查数据后,分析人员又发现了一个复杂情况:图 1 的直方图显示样本中存在负值(共九个)。通过金属探测的时间为负显然是不可能的,那么分析人员应当怎么做?可能是观测记录本身正确,只是在计算时间时出了错;如果是这样,分析人员或许能够重建正确的数值。若不能,则在拟合分布之前应当舍弃这九个负值。但在估计某人触发警报的概率时,是否也应当舍弃它们呢?也就是说,估计值应当是 236/1000 还是 236/991?如果分析人员能够说服自己,这九个负值实际上是记录错误的小时间值,那么她可能希望在估计该概率时保留它们。如果她不确定,那么仿真应当分别用这两个估计各运行一次,看看是否存在实质性的影响。
例 3:时变数据
一家计算机制造商设有客户支持中心,产品所有者可以打电话咨询问题或提出疑虑。该呼叫中心的坐席服务时间从东部时间上午 8:00 到晚上 8:00。由于坐席的工资与福利是主要成本,因此计划开展一项仿真研究以帮助确定人员配置水平。呼叫中心拥有详尽的每日呼叫量记录,显示他们平均每天接到 12,277 通电话。固定时间或空间内随机事件的数量常常可以用泊松分布很好地建模,于是对数据拟合了一个泊松分布(使用本章后面描述的方法),并且看起来拟合良好。当到达数服从泊松分布时,到达之间的时间间隔——这正是仿真呼叫所需要的——必定服从指数分布。该指数分布到达率的自然估计是每 12 小时工作日 12,277 次到达,但由于"一天"是相当大的时间单位,它被换算为每分钟 17 通电话。
上一段的分析看起来是可靠的,泊松分布的选择(意味着到达间隔时间服从指数分布)甚至得到了数据的支持。然而,数据的聚合层级——一个 12 小时工作日——掩盖了呼叫中心一个非常重要的特征:呼叫的到达率可能而且通常确实会随时间(一天中的时段、一周中的星期几,甚至一年中的时节,例如假日送礼季刚结束时)而显著变化。我们常常假定所关注的过程是平稳的(stationary),即其基本性质不随时间变化。然而,如果存在趋势,那么考虑这些趋势可能远比选择用哪个概率分布来表示系统中剩余的不确定性更为重要。在第 5 节中,我们描述一种拟合非平稳泊松过程的方法,它很可能更适合这个呼叫中心。
例 4:相关数据
某大型零售商已从订单数据库中提取出某个品牌运动饮料的月度需求,用于一项供应链仿真。针对这批数据的一个简单输入模型是:月度需求独立同分布(i.i.d.)。本章描述了对此类数据拟合分布并评估拟合效果的方法。但同样重要的是,还要检验"独立同分布"这一假设本身。

图 2 带时间滞后的需求数据
检验这些数据是否同分布的一种非正式方法是按时间顺序绘制需求,以查找趋势(例如需求随时间下降)或季节性(存在规律的需求周期,例如每年夏季需求高、随后冬季需求低)。带有趋势或季节性的数据通常应当先"去趋势"(通常通过对趋势或季节模式拟合一个模型),然后再对剩余变异拟合一个分布。
独立性可以通过带时间滞后的散点图来检验。图 2 是一幅散点图,把该运动饮料每个月的 demand 与下一个月的 demand 对应作图(例如 1 月的需求对 2 月的需求)。显然存在很强的负相关,这意味着某个月需求大,下个月需求往往就小,反之亦然。这一现象可能是零售商某个月过量备货、随后在下个月少订货以消化多余库存所导致的。大于一个月的时间滞后同样可以考察。如果盲目地采用独立同分布输入这一标准假设,就会漏掉这一重要现象,从而导致供应链管理效果不佳。在第 7 节中,我们给出对相关输入数据建模的方法。
正如这些例子所示,仅仅拥有数据并不足以支撑有效的输入建模。数据可能过时,也可能"脏"(含有错误)。有时,把数据转换成可用形式或"清洗"掉错误所需的工作量或成本,可能与获取数据本身相当。输入建模几乎总是要求分析人员既运用自己的判断,也使用恰当的统计工具。了解哪些输入模型最可靠、哪些最不可靠,对于判断仿真研究所得结论的可靠性非常重要。而且,由于关于输入模型正确性的不确定性永远无法彻底消除,明智的做法是用若干个看似合理的输入模型分别运行仿真,看看结论是稳健的,还是对这些选择高度敏感。
从一次真实的数据收集经历中可以学到许多教训。本章末尾的前五道习题给出了一些情境,学生可以在其中获得这类经验。
下面的建议可能有助于加强和便利数据收集工作,尽管它们并不包罗万象。
把时间花在规划上是值得的。这可以从一次练习或预观测开始。试着在预观测时收集数据。为此设计表格。这些表格很可能在正式收集数据之前必须修改多次。留意异常情形,并考虑如何处理它们。在可能的情况下,对系统录像,事后通过观看录像提取数据。即使数据将自动收集(例如通过计算机收集数据),规划也很重要,以确保获得恰当的数据。当数据已由他人收集时,务必留出充足的时间把数据转换成可用的格式。
尽量在收集数据的同时分析数据。弄清楚正在收集的数据是否足以提供仿真所需的分布。查明正在收集的某些数据是否对仿真无用。没有必要收集多余的数据。
尽量合并同质的数据集。检查相继时间段内以及相继日期的同一时间段内数据的同质性。例如,检查下午 2:00 至 3:00 与下午 3:00 至 4:00 数据的同质性,并检查星期四与星期五下午 2:00 至 3:00 的数据是否同质。在检查同质性时,初步检验可以看分布的均值(例如平均到达间隔时间)是否相同。两样本 t 检验可用于此目的。更彻底的分析要求检验分布是否等价,也许可以通过分位数-分位数图(quantile-quantile plot,后文描述)来进行。
注意数据删失(censoring)的可能性,即所关注的量未被完整观测。这一问题最常出现在分析人员关注完成某个过程所需时间时(例如生产一个零件、治疗一位患者,或某个部件失效),但该过程在观测期开始之前就已开始,或在观测期结束之后才结束。删失会导致特别长的加工时间被排除在数据样本之外。
要发现两个变量之间是否存在关系,可绘制散点图。有时只要看一看散点图,就能判明所关注的变量之间是否存在关系。
考虑这样一种可能:一组看起来独立的观测序列实际上具有自相关(autocorrelation)。自相关可以存在于相继的时间段中,也可以存在于相继的顾客之间。
牢记输入数据与输出或性能数据之间的区别,并确保收集的是输入数据。输入数据通常表示那些很大程度上超出系统控制范围的不确定性量,不会因为为改进系统所作的变更而改变。另一方面,输出数据表示系统在
受到这些输入作用时的性能表现,而这可能正是我们试图改进的东西。在排队仿真中,顾客到达时间通常是输入,而顾客延误则是输出。性能数据对模型确认很有用。
再次说明,这些只是几点建议。一般而言,必须以极为审慎的态度对待数据收集与分析。
2 用数据识别分布
在本节中,我们讨论当数据可得并且被认为是独立同分布时,选择输入分布族的方法。分布族中具体分布的确定通过估计其参数来完成,如第 3 节所述。第 6 节讨论数据不可得的情形。
2.1 直方图
频数分布或直方图(histogram)有助于识别分布的形状。直方图按如下方式构造:
把数据的取值范围划分为若干区间。(区间通常等宽;不过,如果对频数的高度作相应调整,也可以使用不等宽的区间。)
标注横轴,使之与所选区间一致。
找出每个区间内出现的频数。
标注纵轴,以便为每个区间绘制总出现次数。
在纵轴上绘制频数。
类别区间(class interval)的数目取决于观测值的个数以及数据中散布或离散的程度。Hines 等人 [2002] 指出,在实践中,把类别区间的数目取为大致等于样本量的平方根通常效果不错。如果区间过宽,直方图就会很粗糙或呈块状,其形状和其他细节就表现不好。如果区间过窄,直方图就会参差不齐,无法把数据平滑化。同一批数据的参差、粗糙与恰当的直方图示例见图 3。现代数据分析软件通常允许方便、交互地改变区间大小,直到找到合适的选择为止。
连续数据的直方图对应于理论分布的概率密度函数。如果数据是连续的,则穿过每个类别区间频数中心点所画出的线应当形成类似 pdf 的形状。
对于数据点很多的离散数据,其直方图应当为数据取值范围内的每一个值设一个格子。然而,如果数据点很少,可能就有必要合并相邻格子,以消除直方图的参差外观。如果直方图对应的是离散数据,它看起来应当像一个概率质量函数。



图 3 参差、粗糙与恰当的直方图:(a) 原始数据——过于参差;(b) 合并相邻格子——过于粗糙;(c) 合并相邻格子——恰当
例 5:离散数据
在 20 周期间的五个工作日中,对上午 7:00 至 7:05 这 5 分钟内到达某交叉口西北角的车辆数进行了监测。表 1 给出了所得数据。表中第一项表示有 12 个 5 分钟时段内零辆车到达,有 10 个时段内一辆车到达,依此类推。
表 1 5 分钟时段内的到达数
| 每时段到达数 | 频数 | 每时段到达数 | 频数 |
|---|---|---|---|
| 0 | 12 | 6 | 7 |
| 1 | 10 | 7 | 5 |
| 2 | 19 | 8 | 5 |
| 3 | 17 | 9 | 3 |
| 4 | 10 | 10 | 3 |
| 5 | 8 | 11 | 1 |

图 4 每时段到达数的直方图
汽车数量是离散变量,而且数据充足,因此直方图可以为数据取值范围内的每一个可能值设一个格子。所得直方图如图 4 所示。
例 6:连续数据
对随机抽取的电子元件样本在 1.5 倍额定电压下进行了寿命试验,并记录其寿命(或失效时间),以天为单位:
| 79.919 | 3.081 | 0.062 | 1.961 | 5.845 |
|---|---|---|---|---|
| 3.027 | 6.505 | 0.021 | 0.013 | 0.123 |
| 6.769 | 59.899 | 1.192 | 34.760 | 5.009 |
| 18.387 | 0.141 | 43.565 | 24.420 | 0.433 |
| 144.695 | 2.663 | 17.967 | 0.091 | 9.003 |
| 0.941 | 0.878 | 3.371 | 2.157 | 7.579 |
| 0.624 | 5.380 | 3.148 | 7.078 | 23.960 |
| 0.590 | 1.928 | 0.300 | 0.002 | 0.543 |
| 7.004 | 31.764 | 1.005 | 1.147 | 0.219 |
| 3.217 | 14.382 | 1.008 | 2.336 | 4.562 |
寿命通常被视为连续变量,这里记录到小数点后三位。把数据放入类别区间即可绘制直方图。数据的取值范围相当大,从 0.002 天到 144.695 天。然而,大多数数值(50 个中的 30 个)落在 0 至 5 天的范围内。取区间宽度为 3,得到表 2。然后用表 2 的数据绘制出图 5 所示的直方图。

图 5 元件寿命的直方图
2.2 选择分布族
绘制直方图的目的是推断出某个已知的 pdf 或 pmf。一个分布族的选择,依据是所考察情境中可能出现的分布以及直方图的形状。因此,如果已经收集了到达间隔时间数据,且直方图的形状类似于指数分布,就可以假定为指数分布。类似地,如果正在测量货盘上货物的重量,而直方图看起来关于均值对称,那么假定为正态分布就是有充分理由的。
表 2 电子元件数据
| 元件寿命(天) | 频数 |
|---|---|
| 23 | |
| 10 | |
| 5 | |
| 1 | |
| 1 | |
| 2 | |
| 0 | |
| 1 | |
| 1 | |
| 0 | |
| 1 | |
| 1 | |
| . | . |
| . | . |
| . | . |
| 1 | |
| . | . |
| . | . |
| . | . |
| 1 | |
| . | . |
| . | . |
| . | . |
| 1 | |
| . | . |
| . | . |
| . | . |
| 1 |
指数分布、正态分布和泊松分布是经常遇到的,从计算角度看也不难分析。虽然 beta 分布、伽马分布和 Weibull 分布分析起来较为困难,但它们提供的形状极为丰富,在对底层概率过程建模时不应被忽视。也许起初假定的是指数分布,却发现它对数据拟合不佳。下一步应当是考察拟合不佳出现在何处。如果拟合不佳出现在分布的某一尾部,那么伽马分布或 Weibull 分布或许能更充分地拟合数据。
人们已经构造出的概率分布实际上有成百上千种;其中许多是带着某种特定的物理过程而创建的。选择分布的一个辅助手段是利用分布的物理基础作为指引。下面是一些例子:
二项分布(Binomial):建模 n 次试验中成功的次数,其中各次试验相互独立且具有共同的成功概率 p;例如,在一批 n 个芯片中发现的有缺陷芯片的数量。
负二项分布(Negative Binomial,包含几何分布):建模为取得 k 次成功所需的试验次数;例如,为找到 4 个有缺陷芯片而必须检查的芯片数量。
泊松分布(Poisson):建模在固定时间或空间内发生的独立事件的个数;例如,1 小时内到达某商店的顾客数,或在 30 平方米金属薄板上发现的缺陷数。
正态分布(Normal):建模一个可视为若干分量过程之和的过程的分布;例如,装配一件产品的时间就是各项装配作业所需时间的总和。注意正态分布允许取负值,而对于加工时间来说负值可能是不可能的。
对数正态分布(Lognormal):建模一个可视为若干分量过程之积(即相乘)的过程的分布;例如,当利息按复利计算时,一项投资的收益率就是若干期收益的乘积。
指数分布(Exponential):建模独立事件之间的时间间隔,或具有无记忆性(memoryless)的加工时间(知道已经过去多少时间,并不能提供关于还要多久过程才完成的任何信息);例如,来自大量相互独立行动的潜在顾客的到达之间的间隔时间。指数分布是变异性很高的分布;它有时被过度使用,因为它常常导致数学上易于处理的模型。回顾一下,如果事件之间的时间间隔服从指数分布,那么固定时间段内事件发生的个数就服从泊松分布。
伽马分布(Gamma):一种极为灵活的分布,用于建模非负随机变量。伽马分布可以通过加上一个常数而从 0 处平移开。
Beta 分布(Beta):一种极为灵活的分布,用于建模有界(具有固定的上限和下限)的随机变量。Beta 分布可以通过加上一个常数而从 0 处平移开,也可以通过乘以一个常数而获得比 [0, 1] 更大的取值范围。
厄兰分布(Erlang):建模可以看作若干个指数分布过程之和的过程;例如,当一台计算机和两台备份计算机都失效时计算机网络失效,而每台计算机的失效时间都服从指数分布。厄兰分布是伽马分布的一个特例。
Weibull 分布(Weibull):建模部件的失效时间;例如磁盘驱动器的失效时间。指数分布是 Weibull 分布的一个特例。
离散或连续均匀分布(Uniform):建模完全的不确定性:所有结果等可能。在没有数据时,这一分布常常被不恰当地使用。
三角分布(Triangular):建模只知道分布的最小值、最可能值和最大值的过程;例如测试一件产品所需的最小、最可能和最大时间。这一模型通常比均匀分布有显著改进。
经验分布(Empirical):从实际收集到的数据中重抽样;通常在似乎没有合适的理论分布时使用。
在选择分布时,不要忽视过程的物理特征。这个过程天然是离散取值还是连续取值?它是有界的还是没有天然界限?这类不依赖数据的知识,有助于缩小可供选择的分布族的范围。还要记住,对任何随机输入过程而言,并不存在"真实"的分布。输入模型是对现实的一种近似,因此目标是从仿真实验中获得一个能产生有用结果的近似。
建议读者完成习题 6 至习题 11,以进一步了解本节提到的各种分布的形状。观察参数变化时形状的改变,是很有启发性的。
2.3 分位数-分位数图
如第 2.1 节所讨论的直方图的构造,以及如第 2.2 节所讨论的分布形状的识别,都是为一批样本数据选择分布族的必要组成部分。然而,直方图在评估所选分布的 方面并不那么有用。当数据点个数较少(比如 30 个或更少)时,直方图可能相当参差。此外,我们对拟合程度的感知取决于直方图区间的宽度。而且,即便区间选得很好,把数据分组到格子中也使得很难把直方图与连续概率密度函数作比较。分位数-分位数图(quantile-quantile plot, 图)是评估分布拟合的有用工具,它不受这些问题的困扰。
如果 X 是 cdf 为 F 的随机变量,那么 X 的 q 分位数(quantile)就是满足 的值 ,其中 。当 F 存在逆函数时,我们写作 。现在令 是来自 X 的一个数据样本。把观测值从小到大排序,并记为 ,其中 。令 j 表示秩或序号。因此,最小者 ,最大者 。 图基于这样一个事实: 是 X 的 分位数的一个估计。换言之,
现在,假设我们选择了 cdf 为 的分布作为 X 分布的一种可能表示。如果 是某个恰当分布族的成员,那么把 对 ) 作图将近似为一条直线。如果 F 来自恰当的分布族且参数值也恰当,那么该直线的斜率将为 1。另一方面,如果所假定的分布不恰当,这些点就会偏离直线,
通常是以一种系统性的方式偏离。是否拒绝某个假设模型的判断是主观的。
例 7:正态 Q-Q 图
一台机器人用于在装配线上安装汽车车门。人们认为安装时间服从正态分布。该机器人能够精确测量安装时间。机器人自动采集了 20 个安装时间的样本,结果如下,数值以秒为单位:
| 99.79 | 99.56 | 100.17 | 100.33 |
|---|---|---|---|
| 100.26 | 100.41 | 99.98 | 99.83 |
| 100.23 | 100.27 | 100.02 | 100.47 |
| 99.55 | 99.62 | 99.65 | 99.82 |
| 99.96 | 99.90 | 100.06 | 99.85 |
样本均值为 99.99 秒,样本方差为 (0.2832)^2 秒^2。这些值可以作为正态分布的均值与方差的参数估计。现将观测值从小到大排序如下:
| j | 值 | j | 值 | j | 值 | j | 值 |
|---|---|---|---|---|---|---|---|
| 1 | 99.55 | 6 | 99.82 | 11 | 99.98 | 16 | 100.26 |
| 2 | 99.56 | 7 | 99.83 | 12 | 100.02 | 17 | 100.27 |
| 3 | 99.62 | 8 | 99.85 | 13 | 100.06 | 18 | 100.33 |
| 4 | 99.65 | 9 | 99.90 | 14 | 100.17 | 19 | 100.41 |
| 5 | 99.79 | 10 | 99.96 | 15 | 100.23 | 20 | 100.47 |
然后把排序后的观测值对 作图,其中 ,F 是均值为 99.99、方差为 (0.2832)^2 的正态分布的 cdf,从而得到 q-q 图。所绘制的点连同数据的直方图一起显示在图 6 中。注意,从直方图很难判断数据是否能被正态分布很好地表示,但在 q-q 图中呈一条直线的总体观感却相当清晰,并支持正态分布的假设。
在评估 q-q 图的线性程度时,应当考虑以下几点:
a. 观测值永远不会精确地落在一条直线上。
b. 排序后的值并不独立;它们已被排过秩。因此,如果一个点位于某条直线上方,那么下一个点很可能也位于该直线上方。而且,这些点不太可能均匀地散布在直线两侧。
c. 极端值(最大值和最小值)的方差远高于图中部值的方差。在极端处可以接受较大的偏差。图中部诸点的线性比极端处的线性更重要。


图 6 安装时间的 q-q 图与直方图
现代数据分析软件通常包含生成 q-q 图的工具,尤其是针对正态分布的。 图也可用于比较两个数据样本,看它们能否用同一个分布表示(即它们是否同质)。 是随机变量 的一个样本,而 是随机变量 的一个样本,那么把 X 的排序值与 Z 的排序值对应作图,如果两个样本都能被同一个分布很好地表示,则图形将近似呈一条直线(Chambers、Cleveland 与 Tukey [1983])。
3 参数估计
选定了分布族之后,下一步就是估计该分布的参数。本节描述许多有用分布的估计量。此外,现在已有许多软件包——其中一些已集成到仿真语言中——可以用来计算这些估计。
3.1 预备统计量:样本均值与样本方差
在许多情况下,样本均值,或样本均值与样本方差,被用来估计所假设分布的参数;参见例 7。下面的段落给出三组用于计算样本均值和样本方差的公式。当可得的是离散或连续的原始数据(raw data)时,使用式 (1) 和式 (2)。当数据是离散的且已被归入频数分布时,使用式 (3) 和式 (4)。当数据是离散或连续的且已被放入类别区间时,使用式 (5) 和式 (6)。式 (5) 和式 (6) 是近似式,只有在原始数据不可得时才应使用。
如果容量为 n 的样本中的观测值为 ,则样本均值 定义为
样本方差 定义为
如果数据是离散的且已被归入频数分布,则可以对式 (1) 和式 (2) 加以修改,从而大大提高计算效率。样本均值可以计算为
样本方差为
其中 k 是 X 的不同取值的个数, 是 X 的取值 的观测频数。
例 8:分组数据
对表 1 中的数据进行分析可得 ,以及 。由式 (3) 得,
并由式 (4) 得,
样本标准差 S 就是样本方差的平方根。在本例中,。用式 (1) 和式 (2) 也会得到关于 和 完全相同的结果。当取值是连续的时,如果可能,最好使用原始数据。然而,有时收到的数据已经被放进了类别区间。这时就不再可能得到精确的样本均值和样本方差。在这种情况下,样本均值和样本方差由下列公式近似:
以及
其中 是第 j 个类别区间中的观测频数, 是第 j 个区间的中点,c 是类别区间的个数。
例 9:类别区间中的连续数据
假设例 6 中元件寿命的原始数据或者已被丢弃,或者已经丢失。然而,表 2 中的数据仍然可得。为了近似 X¯ 和 的值,使用式 (5) 和式 (6)。创建如下数值: 以及 。取 ,由式 (5) 近似得 X 为
然后,由式 (6) 近似得 为
以及
对例 6 中的原始数据应用式 (1) 和式 (2),得到 和 。因此,当原始数据被丢弃或丢失时,可能会产生误差。
表 3 仿真中常用分布的建议估计量
| 分布 | 参数 | 建议估计量 |
|---|---|---|
| 泊松 | ||
| 指数 | ||
| 伽马 | (见表 A.9) | |
| 正态 | (无偏) | |
| 对数正态 | (对数据进行 ln 变换后) (对数据进行 ln 变换后) | |
| Weibull() | 见式 (11) 与式 (14) 中 与 的定义 迭代至收敛 | |
| Beta | 其中 为双伽马函数(digamma function), 且 |
3.2 建议的估计量
需要分布参数的数值估计,以便把分布族缩小为一个具体的分布,并检验由此产生的假设。表 3 给出了仿真中常用分布的建议估计量。除了对正态分布的 估计作了去除偏倚的修正之外,这些估计量都是基于原始数据的最大似然估计量。(如果数据位于类别区间中,这些估计量必须加以修改。)关于均匀分布、二项分布和负二项分布的参数估计,请读者参阅 Fishman [1973] 和 Law [2007]。三角分布通常在无数据可用时使用,其参数由对最小值、最可能值和最大可能值的有根据猜测获得;如果只有最小值和最大值可用,均匀分布也可以这样使用。
下面各段给出这些估计量的使用示例。读者应当牢记,参数是一个未知的常数,而估计量是一个统计量(或随机变量),因为它依赖于样本值。为了在这里清楚地区分二者,如果某个参数记作 α,则其估计量将记作 α。
例 10:指数分布
我们将用指数分布来说明获得参数估计量的最大似然法。速率参数为 λ 的指数分布的密度函数为
其中 。如果 独立同分布,且各自服从该指数分布,那么它们的联合分布为
联合分布大致表示任意一组 取值的似然。
最大似然法把这个关系反转过来:如果我们有一个数据样本,比如 ,但 λ 未知,那么最大似然估计量(MLE)就是使该样本似然(由式 (7) 度量)最大化的那个 λ 值。因此,指数分布 λ 的 MLE 使如下似然函数最大化
求 MLE 通常是一项关于未知参数最大化似然函数的微积分练习。由于似然函数是密度函数的乘积且取值为正,有时最大化似然函数的对数会更容易,在本例中即为
对 求导并令其等于 ,得到
于是得到 MLE ,其中 是观测值的样本均值。
例如,假设例 6 中的数据来自指数分布,则由 得到 λ 的 MLE 为
例 11:Weibull 分布
假设已经抽取了一个容量为 n 的随机样本 ,并且假定这些观测值来自 Weibull 分布。可以证明其似然函数为
最大似然估计是使 最大、等价地使 ln (记作 )最大的那些 和 值。 的最大值通过对 和 取偏导、令其各自为零、并求解所得方程而获得,代入后这些方程变为
以及
其中
最大似然估计 和 是式 (9) 与式 (10) 的解。首先,通过下面说明的迭代过程求得。然后在式 (10) 中取 求得 。式 (9) 是非线性的,因此必须使用数值分析技术来求解。在表 中,给出的计算 的建议迭代方法为
式 (12) 在逼近 时采用牛顿法(Newton’s method),其中 是第 j 次迭代,从表 3 给出的初始估计 开始,如下:
如果初始估计 与解 足够接近,那么当 时 趋于 。在牛顿法中, 是通过大小为 的增量逐步逼近的。用式 (11) 计算 ,用式 (14) 计算 ,如下:
式 (14) 可由式 (11) 对 求导 得到。迭代过程一直持续到 ,即直到 $| f ( \widehat {\beta} _ {j} ) | \leq 0 . 001 $ 。
考虑例 6 中给出的数据。这些数据涉及电子元件的失效,看起来来自指数分布。在例 10 中,参数 是在数据来自指数分布的假设下估计的。如果这一假设被拒绝,另一个假设就是数据来自 Weibull 分布。之所以怀疑是 Weibull 分布,是因为这些数据涉及电子元件失效,而失效是突然发生的。
用式 (13) 计算 。对于例 中的数据,以及 ;于是由式 (2) 求得 为
且 。因此,
要用式 (12) 计算 ,需要根据式 (11) 和式 (14) 计算 。还需要下列附加数值:,以及 。于是,
以及
然后,由式 (12) 得,
四次迭代之后,$| f ( \widehat {\beta} _ {3} ) | \le 0 . 001 $,此时 就是式 (9) 的近似 解。表 4 列出了完成每次迭代所需的数值。
现在,可以在式 (10) 中取 计算,如下:
表 4 Weibull 分布参数的迭代估计
| j | |||||||
|---|---|---|---|---|---|---|---|
| 0 | 0.477 | 115.125 | 292.629 | 1057.781 | 16.024 | -356.110 | 0.522 |
| 1 | 0.522 | 129.489 | 344.713 | 1254.111 | 1.008 | -313.540 | 0.525 |
| 2 | 0.525 | 130.603 | 348.769 | 1269.547 | 0.004 | -310.853 | 0.525 |
| 3 | 0.525 | 130.608 | 348.786 | 1269.614 | 0.000 | -310.841 | 0.525 |
如果 与 足够接近,该过程收敛很快,通常四到五次迭代即可。 然而,如果该过程看似发散,则应对 尝试其他初值;例如,取初始估计的一半或两倍。
手工估计 Weibull 分布参数的艰巨任务,凸显了为输入建模提供软件支持的价值。
例 12:泊松分布
假设需要分析表 1 中的到达数据。考察图 4 提示可以假定为参数 α 未知的泊松分布。由表 3 可知,α 的估计量是 ,这已在例 8 中求出。于是,。回顾一下,对于泊松分布,真实的均值与方差相等。在例 8 中,样本方差估计为 。然而,绝不应期望样本均值与样本方差精确相等,因为二者都是随机变量。
例 13:对数正态分布
某投资组合中 10 项投资的收益率分别为 18.8、27.9、21.0、6.1、37.4、5.0、22.9、1.0、3.1 和 8.3 个百分点。为了估计这些数据对数正态模型的参数,我们首先对数据取自然对数,得到 2.9、3.3、3.0、1.8、3.6、1.6、3.1、0、1.1 和 2.1。然后令 以及 。
例 14:正态分布
正态分布的参数 与 ,由 X¯ 与 估计,如表 3 所示。例 7 中的 图得出的分布假设是安装时间服从正态分布。由式 (1) 和式 (2),例 7 的数据给出 和 秒^2。
例 15:伽马分布
伽马分布的估计量 通过查阅表 A.9 来选定。表 A.9 需要 计算量 ,其中
另外,由表 3 可见 由下式给出
提前期常常服从伽马分布。假设与 20 个订单相关的提前期(以天计)已被精确测量如下:
| 订单 | 提前期(天) | 订单 | 提前期(天) |
|---|---|---|---|
| 1 | 70.292 | 11 | 30.215 |
| 2 | 10.107 | 12 | 17.137 |
| 3 | 48.386 | 13 | 44.024 |
| 4 | 20.480 | 14 | 10.552 |
| 5 | 13.053 | 15 | 37.298 |
| 6 | 25.292 | 16 | 16.314 |
| 7 | 14.713 | 17 | 28.073 |
| 8 | 39.166 | 18 | 39.019 |
| 9 | 17.421 | 19 | 32.330 |
| 10 | 13.905 | 20 | 36.547 |
要估计 和 ,首先需要由式 (15) 计算 M。这里由式 (1) 求得 为
然后
接着
于是
以及
通过在附录表 A.9 中插值,得。最后,由式 (16) 得
例 16:Beta 分布
每个月携带商店优惠券的顾客百分比必定介于 0 与 100% 之间。在某商店八个月的观测给出如下数值:25%、74%、20%、32%、81%、47%、31% 和 8%。为了对这些数据拟合 Beta 分布,我们首先需要把所有数值除以 100,将其重新标定到区间 [0, 1] 上,得到 0.25、0.74、0.20、0.32、0.81、0.47、0.31、0.08。
参数 的最大似然估计量是表 3 中所示方程组的解。这类方程可以用现代符号/数值计算程序(如 Maple)求解;图 7 给出了一个求解 Beta 参数的 Maple 程序。在本例中,解为 和 。
图 7 计算 Beta 分布参数最大似然估计的 Maple 程序
4 拟合优度检验
在本节中,将 Kolmogorov–Smirnov 检验与卡方检验应用于关于输入数据分布形式的假设。
拟合优度检验为评估某个候选输入模型的适用性提供了有益的指导;然而,在实际应用中并不存在唯一正确的分布,因此你不应当成为这类检验结论的奴隶。理解样本量的影响尤其重要。如果可用数据很少,那么拟合优度检验不太可能拒绝任何候选分布;而如果可用数据很多,那么拟合优度检验很可能拒绝所有候选分布。因此,未能拒绝某个候选分布应当被视为支持该选择的一条证据,而拒绝某个输入模型也只是反对该选择的一条证据。
4.1 卡方检验
检验"容量为 n 的随机变量 X 的随机样本服从某种特定分布形式"这一假设的一种程序是卡方拟合优度检验。该检验把"把数据的直方图与候选密度函数或质量函数的形状作比较"这一直观想法形式化。当样本量较大、且参数由最大似然法估计时,该检验对离散与连续两种分布假设都有效。检验程序首先把 n 个观测值排列成 k 个类别区间或格子。检验统计量由下式给出
其中 是第 i 个类别区间中的观测频数, 是该类别区间中的期望频数。每个类别区间的期望频数计算为 ,其中 是与第 i 个类别区间相关联的理论的、假设的概率。
可以证明, 近似服从自由度为 的卡方分布,其中 s 表示由样本统计量估计的假设分布参数的个数。假设如下: 随机变量 X 服从由参数估计值所给出的分布假设。:随机变量 X 不服从该分布。
临界值 可在表 A.6 中查到。若 ,则拒绝原假设 。在应用该检验时,如果期望频数过小, 不仅会反映观测频数对期望频数的偏离,也会反映期望频数本身过小这一点。关于 的最小取值虽然没有一致意见,但 , 和 5 这些值被广泛采用。如果某个 值过小,可以把它与相邻类别区间中的期望频数合并。相应的 值也应当合并,并且每合并一个格子,k 就减少 1。
如果被检验的分布是离散的,那么随机变量的每一个取值都应当是一个类别区间,除非为了满足最小期望格子频数的要求而必须合并相邻的类别区间。对于离散情形,如果不需要合并相邻格子,则
否则, 通过对适当的相邻格子的概率求和得到。
表 5 连续数据类别区间数目的建议
| 样本量 n | 类别区间数 k |
|---|---|
| 20 | 不要使用卡方检验 |
| 50 | 5 到 10 |
| 100 | 10 到 20 |
| >100 | 到 |
如果被检验的分布是连续的,则类别区间由 给出,其中 和 是第 i 个类别区间的端点。对于假定了 pdff(x) 或假定了 cdf 的连续情形,可以计算为
对于离散情形,类别区间的数目由按需合并相邻格子之后得到的格子数决定。然而,对于连续情形,类别区间的数目必须指定。虽然没有可遵循的一般规则,但表 5 中的建议有助于确定连续数据的类别区间数目。
例 17:对泊松假设应用卡方检验
在例 12 中,分析了例 5 给出的车辆到达数据。数据的直方图如图 所示,看起来服从泊松分布;因此求得参数 .64。于是形成如下假设: 随机变量服从泊松分布。:随机变量不服从泊松分布。
泊松分布的 pmf 为:
对于 ,由式 (18) 得到与 x 的各个取值相对应的概率:
表 6 例 17 的卡方拟合优度检验
| 观测频数 | 期望频数 | |||
|---|---|---|---|---|
| 0 | 12 | 22 | 2.6 | 7.87 |
| 1 | 10 | 9.6 | ||
| 2 | 19 | 17.4 | 0.15 | |
| 3 | 17 | 21.1 | 0.80 | |
| 4 | 10 | 19.2 | 4.41 | |
| 5 | 8 | 14.0 | 2.57 | |
| 6 | 7 | 8.5 | 0.26 | |
| 7 | 5 | 17 | 4.4 | 11.62 |
| 8 | 5 | 2.0 | ||
| 9 | 3 | 0.8 | ||
| 10 | 3 | 0.3 | ||
| ≥11 | 1 | 0.1 | ||
| 100 | 100.0 | 27.68 |
根据这些信息构造出表 6。 的值由 2.6 给出。以类似方式计算其余的 值。由于 与 被合并。在这种情况下, 与 也被合并,k 减少 1。出于同样的原因,最后五个类别区间也被合并,k 再减少 4。
计算得到的 为 27.68。 表值的自由度为 。这里,,因为有一个参数 是由数据估计的。在 0.05 显著性水平下,临界值 为 11.1。因此, 将在 0.05 显著性水平下被拒绝。于是,分析人员可能希望寻找拟合更好的模型,或者使用数据的经验分布。
4.2 等概率的卡方检验
如果被检验的是连续分布假设,则应当使用概率相等而非区间宽度相等的类别区间。这已为许多作者所推荐 [Mann 与 Wald, 1942;Gumbel, 1943;Law, 2007;Stuart、Ord 与 Arnold, 1998]。应当指出,该程序不适用于以类别区间形式收集、且原始数据已被丢弃或丢失的数据。
遗憾的是,并没有一种简便的方法来确定与每个区间相关联的概率,以使给定规模的检验的功效(power)最大化。(检验的功效定义为拒绝一个错误假设的概率。)然而,如果使用等概率,则 。我们建议
于是,代入 得到
并对 k 求解得
式 (19) 被用于得出表 5 中关于最大类别区间数的建议。
如果所假设的分布是正态、指数或 Weibull 分布,本节描述的方法是直截了当的。例 18 说明了如何对指数分布实施该程序。如果所假设的分布是伽马分布(但不是厄兰分布)或某些其他分布,那么类别区间端点的计算就很复杂,可能需要对密度函数作数值积分。在这种情况下,统计分析软件非常有用。
例 18:指数分布的卡方检验
在例 10 中,分析了例 6 给出的失效数据。数据的直方图如图 5 所示,看起来服从指数分布,于是计算出参数 。因此形成如下假设: 随机变量服从指数分布。:随机变量不服从指数分布。
为了用等概率区间进行卡方检验,必须求出类别区间的端点。式 (19) 表明区间数应当小于或等于 。这里,,因此 。在表 5 中,建议使用 5 到 10 个类别区间。令 ,则每个区间具有概率 。每个区间的端点由指数分布的 cdf 计算如下:
其中 表示第 i 个区间的端点,。由于 是从零到 的累积面积,因此式 (20) 可写为
或
两边取对数并对 求解,得到指数分布 k 个等概率区间端点的一般结果:
表 7 例 18 的卡方拟合优度检验
| 类别区间 | 观测频数 | 期望频数 | |
|---|---|---|---|
| [0, 1.590) | 19 | 6.25 | 26.01 |
| [1.590, 3.425) | 10 | 6.25 | 2.25 |
| [3.425, 5.595) | 3 | 6.25 | 0.81 |
| [5.595, 8.252) | 6 | 6.25 | 0.01 |
| [8.252, 11.677) | 1 | 6.25 | 4.41 |
| [11.677, 16.503) | 1 | 6.25 | 4.41 |
| [16.503, 24.755) | 4 | 6.25 | 0.81 |
| [24.755,∞) | 6 | 6.25 | 0.01 |
| 50 | 50 | 39.6 |
无论 取何值,式 (21) 总会有 和 。取 和 由式 (21) 计算为
对 继续应用式 (21),得到 分别为 3.425、5.595、8.252、11.677、16.503 和 24.755。由于 。第一个区间是 [0, 1.590),第二个区间是 [1.590, 3.425),依此类推。预期每个区间中将落入 0.125 比例的观测值。观测值、期望值以及对 计算值的贡献如表 7 所示。 的计算值为 39.6。自由度由 给出, 的表值为 12.6。由于 ,原假设被拒绝。( 的值为 16.8,因此在显著性水平 下原假设也会被拒绝。)
4.3 Kolmogorov–Smirnov 拟合优度检验
卡方拟合优度检验可以容纳由数据估计参数的情况,其结果是自由度相应减少(每估计一个参数减少一个)。卡方检验要求把数据放入类别区间;在连续分布假设的情形下,这种分组是人为的。改变类别数和区间宽度会影响计算所得和查表所得的卡方值。一种假设可能在数据按某种方式分组时被接受,而在按另一种方式分组时被拒绝。此外,卡方检验统计量的分布只是近似已知,而且该检验的功效有时相当低。基于这些考虑,人们希望有卡方检验之外的拟合优度检验。Kolmogorov–Smirnov 检验把考察 q-q 图背后的思想形式化了。
Kolmogorov–Smirnov 检验可以用来检验数值的均匀性。这两种用途都属于拟合优度检验的范畴。任何连续分布假设都可以进行拟合优度检验。
Kolmogorov–Smirnov 检验在样本量较小、且没有参数由数据估计时特别有用。当已经作出参数估计时,表 A.8 中的临界值是有偏的;具体地说,它们过于保守。在这里,“保守"意味着临界值会过大,从而导致比所设定的更小的第 I 类(α)错误。在某些情况下可以算出 α 的精确值,本节末尾将对此加以讨论。
当假定为指数分布时,Kolmogorov–Smirnov 检验不需要任何特殊的表。下面的例子说明在这种情况下如何应用该检验。(注意,在本例中不需要估计分布的参数,因此我们可以使用表 A.8。)
例 19:指数分布的 Kolmogorov–Smirnov 检验
假设在 100 分钟的时间区间内收集了 50 个到达间隔时间(以分钟计)(按发生顺序排列):
| 0.44 | 0.53 | 2.04 | 2.74 | 2.00 | 0.30 | 2.54 | 0.52 | 2.02 | 1.89 | 1.53 | 0.21 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 2.80 | 0.04 | 1.35 | 8.32 | 2.34 | 1.95 | 0.10 | 1.42 | 0.46 | 0.07 | 1.09 | 0.76 |
| 5.55 | 3.93 | 1.07 | 2.26 | 2.88 | 0.67 | 1.12 | 0.26 | 4.57 | 5.37 | 0.12 | 3.19 |
| 1.63 | 1.46 | 1.08 | 2.06 | 0.85 | 0.83 | 2.44 | 1.02 | 2.24 | 2.11 | 3.15 | 2.90 |
| 6.58 | 0.64 |
原假设及其对立假设构造如下: 到达间隔时间服从指数分布。:到达间隔时间不服从指数分布。
数据是在从 0 到 分钟这一区间内收集的。可以证明,如果到达间隔时间 的底层分布是指数分布,那么到达时间在区间 [0, T] 上服从均匀分布。到达时间 是通过累加到达间隔时间得到的。然后把到达时间归一化到 [0, 1] 区间,以便应用 Kolmogorov–Smirnov 检验。在 [0, 1] 区间上,这些点将是 。所得的 50 个数据点如下:
| 0.0044 | 0.0097 | 0.0301 | 0.0575 | 0.0775 | 0.0805 | 0.1059 | 0.1111 | 0.1313 | 0.1502 |
|---|---|---|---|---|---|---|---|---|---|
| 0.1655 | 0.1676 | 0.1956 | 0.1960 | 0.2095 | 0.2927 | 0.3161 | 0.3356 | 0.3366 | 0.3508 |
| 0.3553 | 0.3561 | 0.3670 | 0.3746 | 0.4300 | 0.4694 | 0.4796 | 0.5027 | 0.5315 | 0.5382 |
| 0.5494 | 0.5520 | 0.5977 | 0.6514 | 0.6526 | 0.6845 | 0.7008 | 0.7154 | 0.7262 | 0.7468 |
| 0.7553 | 0.7636 | 0.7880 | 0.7982 | 0.8206 | 0.8417 | 0.8732 | 0.9022 | 0.9680 | 0.9744 |
按照该程序得到 为 0.1054, 为 0.0080。因此,Kolmogorov–Smirnov 统计量为 。由表 A.8 得到的
在显著性水平 且 时 D 的临界值为 ;然而,,因此"到达间隔时间服从指数分布"这一假设不能被拒绝。
Kolmogorov–Smirnov 检验已被改造,以便在若干种参数由数据估计的情形下使用。检验统计量的计算是相同的,但使用不同的临界值表。不同的分布假设需要不同的临界值表。Lilliefors [1967] 提出了一种正态性检验。原假设声称总体属于正态分布族中的某一个,而不指定分布的参数。有兴趣的读者不妨研读 Lilliefors 的原始工作;他描述了如何用仿真来确定临界值。
Lilliefors [1969] 还针对指数分布修正了 Kolmogorov–Smirnov 检验的临界值。Lilliefors 再次使用随机抽样来获得近似的临界值,但 Durbin [1975] 随后得到了精确分布。Connover [1998] 给出了正态分布与指数分布的 Kolmogorov–Smirnov 检验示例。他还提到了若干其他读者可能感兴趣的 Kolmogorov–Smirnov 型检验。
Anderson-Darling 检验是一种在精神上与 Kolmogorov–Smirnov 检验相似的检验。与 Kolmogorov–Smirnov 检验一样,Anderson-Darling 检验基于经验 cdf 与拟合 cdf 之间的差异;与 Kolmogorov–Smirnov 检验不同的是,Anderson-Darling 检验基于一种更综合的差异度量(不只是最大差异),并且对分布尾部的差异更为敏感。Anderson-Darling 检验的临界值同样取决于候选分布以及是否估计了参数。幸运的是,该检验和 Kolmogorov–Smirnov 检验都已在许多支持仿真输入建模的软件包中实现。
4.4 p 值与"最佳拟合”
要应用拟合优度检验,必须选择显著性水平。回顾一下,显著性水平是错误地拒绝 :随机变量服从该分布假设的概率。传统的显著性水平是 0.1、0.05 和 0.01。在高速计算出现之前,拥有一小组标准值使得制出有用的临界值表成为可能。如今,大多数统计软件按需计算临界值,而不是把它们存进表中。因此,分析人员可以采用不同的显著性水平,比如 0.07。
然而,许多软件包并不要求预先指定显著性水平,而是为检验统计量计算一个 -值。-值是指对于给定的检验统计量取值,恰好会拒绝 的显著性水平。因此,大的 p 值往往表明拟合良好(为了拒绝,我们不得不接受很大的出错机会),而小的 p 值则表明拟合不佳(要接受,我们就必须要求几乎没有风险)。
回顾例 17,其中用卡方检验来检验车辆到达数据的泊松假设。检验统计量的值为 ,自由度为 5。该检验统计量的 值为 0.00004,这意味着我们会在 0.00004 的显著性水平上拒绝"数据服从泊松分布"的假设。(回顾一下,我们曾在 0.05 水平上拒绝该假设;现在我们知道,即使在更低的水平上也不得不拒绝它。)
p 值可以看作拟合程度的一种度量,值越大越好。这提示我们可以把手中所有的分布都拟合一遍,为每次拟合计算一个检验统计量,然后选择产生最大 p 值的那个分布。据我们所知,并没有输入建模软件实现这一特定算法,但许多此类软件确实包含"最佳拟合"选项,即软件在评估所有可行模型之后向用户推荐一个输入模型。软件也可能考虑其他因素——例如数据是离散的还是连续的、有界的还是无界的——但最终仍会用某种拟合的汇总度量(如 p 值)来对分布排序。这样做并无不妥,但有几点需要牢记:
软件可能对数据的物理基础一无所知,而这类信息却能提示哪些分布族是恰当的。(参见第 2.2 节中的清单。)记住,输入建模的目标常常是填补空白或平滑数据,而不是找到一个与给定样本尽可能贴合的输入模型。
回顾一下,厄兰分布和指数分布都是伽马分布的特例,而指数分布也是更灵活的 Weibull 分布的特例。自动化的最佳拟合程序倾向于选择更灵活的分布(伽马和 Weibull 优于厄兰和指数),因为额外的灵活性使其能更贴合数据并获得更好的拟合汇总度量。但同样地,与数据贴合得紧密并不总能得到最恰当的输入模型。
像 p 值这样的汇总统计量,终究只是一种汇总度量。它几乎不能说明拟合不佳出现在何处(在分布的中部、右尾还是左尾)。而人借助图形工具,能够看出拟合不佳出现在何处,并判断它对手头的应用是否重要。
我们的建议是:把自动化的分布选择当作提出候选分布的若干种方式之一。务必用图形方法检查自动选择的结果,并记住最终的选择权在你手中。
5 拟合非平稳泊松过程
一般而言,把非平稳泊松过程(nonstationary Poisson process,NSPP)拟合到到达数据是一个困难的问题,因为我们很少知道到达率函数 λ(t) 的恰当形式。一种途径是选择一个具有大量参数的非常灵活的模型,并用诸如最大似然之类的方法拟合它;关于这种途径的例子参见 Johnson、Lee 与 Wilson [1994]。第二种方法——也是这里我们考虑的方法——是把到达率近似为在某个基本时间区间(例如一小时、一天或一个月)内保持恒定,但在不同时间区间之间变化。这样,问题就变成选择基本时间区间以及估计每个区间内的到达率。
假设我们需要对某个时间段(比如 [0, T])内的到达建模。我们所描述的方法最适用于这样一种情形:可以反复观测时间段 [0, T] 并对到达计数。例如,如果问题涉及对工作日(上午 8:00 至下午 6:00)期间电子邮件的到达建模,而我们相信到达率在半小时区间内近似恒定,那么我们需要能够统计若干天中各个半小时区间内的到达数。如果能够记录实际的到达时刻而非计数,那么实际到达时刻显然更好,因为事后可以把它们按我们希望的任何区间长度分组。不过,从此处往后我们将假定只有计数可用。
表 8 NSPP 示例的星期一电子邮件到达数据
| 时段 | 到达数 | 估计到达率(到达数/小时) | ||
|---|---|---|---|---|
| 第 1 天 | 第 2 天 | 第 3 天 | ||
| 8:00–8:30 | 12 | 14 | 10 | 24 |
| 8:30–9:00 | 23 | 26 | 32 | 54 |
| 9:00–9:30 | 27 | 19 | 32 | 52 |
| 9:30–10:00 | 20 | 13 | 12 | 30 |
把时间段 [0, T] 划分为 k 个长度为 的等长区间。例如,如果我们考虑从上午 8:00 到下午 6:00 的 10 小时工作日,并且允许速率每半小时变化一次,那么 ,。在 n 个观测周期(例如 n 天)上,令 为第 j 个观测周期的第 i 个时间区间内发生的到达数。在我们的例子中, 就是第三个观测日从上午 8:30 到 9:00(第二个半小时区间)的到达数。
第 i 个时间段 内的估计到达率,就是按时间区间长度缩放后的平均到达数:
在各个时间区间的到达率估计出来之后,可以把速率看起来相同的相邻区间合并起来。
例如,考虑三个星期一工作日的前两个小时内的电子邮件到达计数,如表 8 所示。8:30–9:00 的估计到达率为
看到这些结果后,我们可能会考虑把区间 8:30–9:00 与区间 9:00–9:30 合并,因为两者的速率如此接近。还要注意,上一节描述的拟合优度检验可以分别应用于每个时间区间的数据,以检验泊松近似。
6 无数据时选择输入模型
遗憾的是,在实践中常常不得不在任何过程数据可用之前就建立仿真模型——也许是为了演示目的或做初步研究。在这种情况下,建模者必须在选择输入模型时足智多谋,并且必须仔细检查结果对所选模型的敏感性。
即使没有数据,也有若干途径可以获得关于某个过程的信息:
工程数据:产品或者过程常常带有制造商提供的性能额定值(例如,磁盘驱动器的平均失效时间为 10,000 小时;激光打印机每分钟可打印 8 页;刀具的切削速度为 1 厘米/秒;等等)。公司的规章可能规定时间或生产标准。这些数值通过确定一个中心值,为输入建模提供了起点。
专家意见:与对这个过程或类似过程有经验的人交谈。他们常常能够给出乐观的、悲观的和最可能的时间。他们也许还能说明这个过程是近乎恒定还是高度可变,并且可能能够指出变异性的来源。
物理或惯常限制:大多数真实过程在性能上存在物理限制;例如,计算机数据录入不可能比一个人打字的速度更快。由于公司政策的原因,一个过程可能允许耗费的时间存在上限。不要忽视那些缩小输入过程取值范围的显而易见的限制或界限。
过程的性质:第 2.2 节中对各种分布的描述,可以用来论证某个特定的选择,即使没有数据可用。
当数据不可得时,均匀分布、三角分布和 Beta 分布常被用作输入模型。均匀分布可能是糟糕的选择,因为在真实过程中,上限和下限很少与中心值一样可能。如果除了上限和下限之外还能给出一个最可能值,那么就可以使用三角分布。三角分布把大部分概率放在最可能值附近,而放在极端值附近的概率要小得多。如果使用 Beta 分布,那么一定要画出所选分布的密度函数;Beta 分布可能呈现不寻常的形状。
如果能够给出最小值、最大值以及一个或多个"断点",就可以得到一种有用的改进。断点是一个中间值,连同小于或等于该值的概率。下面的例子说明如何使用断点。
例 20
对于一项生产计划仿真,需要各种产品的销售量。负责产品 XYZ-123 的销售人员说,销量不会少于 1000 件(因为已有合同),也不会多于 5000 件(因为那是该产品的整个市场)。根据她的经验,她认为销量超过 2000 件的机会是 90%,超过 3500 件的机会是 25%,而超过 4500 件的机会只有 1%。
表 9 汇总了这些信息。注意,超过某些销售目标的机会已被换算为小于或等于这些目标的累积概率。
表 9 销售信息汇总
| i | 区间(销售额) | 累积频率 |
|---|---|---|
| 1 | 0.10 | |
| 2 | 0.75 | |
| 3 | 0.99 | |
| 4 | 1.00 |
当输入模型是在没有数据的情况下选定的时候,检验仿真结果对所选分布的敏感性就尤为重要。不仅要检验对分布中心的敏感性,还要检验对变异性或界限的敏感性。如果输出结果对输入模型极度敏感,这就提供了一个有说服力的理由,反对依据这些结果作出关键决策,而赞成着手开展数据收集工作。
7 多变量与时间序列输入模型
在第 1 节至第 4 节中,输入随机变量被认为与问题情境中的任何其他变量相互独立。当情况并非如此时,使用能够刻画这种依赖关系的输入模型就至关重要;否则,仿真可能极不准确。
例 21
某项供应链仿真包含工业机器人的提前期与年需求量。需求增加会导致提前期增加:这些机器人的最终组装必须按采购方的规格进行。因此,与其把提前期和需求当作相互独立的随机变量,不如建立一个多变量输入模型。
例 22
对某股票经纪人基于网络的交易站点的仿真,包含买入与卖出订单到达之间的时间间隔。投资者往往会对其他投资者的行为作出反应,因此这些买入与卖出订单是成批到达的。因此,与其把到达间隔时间当作相互独立的随机变量,不如建立一个时间序列模型。
我们把固定、有限个随机变量的多变量输入模型(例如例 21 中提前期与年需求这两个随机变量)与(概念上无限的)相关随机变量序列的时间序列输入模型(例如例 22 中相继的订单间隔时间)区分开来。在回顾两种依赖性度量——协方差与相关性——之后,我们将描述适用于这些例子的输入模型。
7.1 协方差与相关性
令 和 为两个随机变量,并令 和 分别为 的均值和方差。协方差与相关性度量 与 . 之间的线性依赖程度。换言之,协方差与相关性表明 与 之间的关系能被如下模型描述得多好:
其中 ε 是均值为 0 且独立于 的随机变量。如果事实上,那么这个模型就是完美的。另一方面, 与 统计独立,则 ,该模型就没有价值。一般地, 取正值表明 与 倾向于同时高于或同时低于各自的均值; 取负值表明它们往往位于各自均值的相反两侧。
与 之间的协方差定义为
值 cov 意味着在我们的依赖模型中 ,而 意味着 。协方差可以在 与 之间取任意值。相关性把协方差标准化到介于 −1 与 1 之间:
同样,值 corr 意味着在我们的模型中 ,而 意味着 。 越接近于 1 或 −1, 与 之间的线性关系就越强。
现在,假设我们有一列随机变量 . 它们是同分布的(意味着它们都具有相同的均值和方差),但可能是相关的。我们把这样一列称为时间序列,并分别把 cov 和 称为滞后 h 自协方差(lag-h autocovariance)和滞后 h 自相关(lag-h autocorrelation)。如果自协方差的取值只依赖于 h 而不依赖于 ,那么我们就说这个时间序列是协方差平稳的(covariance stationary)。对于协方差平稳的时间序列,我们使用如下简记
表示滞后 h 自相关。注意,自相关度量的是时间序列中相隔 个其他变量的随机变量之间的依赖性。
7.2 多变量输入模型
如果 和 各自服从正态分布,那么它们之间的依赖性可以用参数为 和 ) 的二元正态分布来建模。 和 的估计已在第 3.2 节中描述。为了估计 ,假设我们有 n 个独立同分布的对 。那么样本协方差为
其中 和 是样本均值。相关性由下式估计
其中 和 是样本方差。
例 23:例 21(续)
令 表示交货的平均提前期(以月计), 表示工业机器人的年需求量。以下是过去十年关于需求与提前期的可得数据:
| 提前期 | 需求 |
|---|---|
| 6.5 | 103 |
| 4.3 | 83 |
| 6.9 | 116 |
| 6.0 | 97 |
| 6.9 | 112 |
| 6.9 | 104 |
| 5.8 | 106 |
| 7.3 | 109 |
| 4.5 | 92 |
| 6.3 | 96 |
常规计算给出 和 ,分别作为 和 的估计。为了估计相关性,我们需要
因此,,且
显然,提前期与需求是强相关的。然而,在我们接受这个模型之前,还应当分别检验提前期和需求是否能被正态分布很好地表示。特别是,需求是一个离散取值的量,因此连续的正态分布充其量只是一种近似。
下面的简单算法可用于生成二元正态随机变量:
步骤 1. 生成 和 ,即相互独立的标准正态随机变量。
步骤 2. 令
步骤 3. 令
显然,二元正态分布并不适用于所有的多变量输入建模问题。它可以推广到 k 元正态分布,以建模两个以上随机变量之间的依赖性;但在许多情况下,任何形式的正态分布都是不恰当的。我们在第 7.4 节给出一种处理非正态分布的方法。关于其他模型的良好参考文献是 Johnson [1987] 以及 Nelson 与 Yamnitsky [1998]。
7.3 时间序列输入模型
如果 . 是一列同分布、但相关且协方差平稳的随机变量,那么有若干时间序列模型可用于表示这一过程。我们将描述两个具有如下特征的模型:其自相关具有形式
其中 。注意 -h 自相关随着滞后增大而几何衰减,因此在时间上相距很远的观测值近乎独立。下面将要给出的一个模型中,每个 服从正态分布;在另一个模型中,每个 服从指数分布。更一般的时间序列输入模型在第 7.4 节以及 Nelson 与 Yamnitsky [1998] 中描述。
AR(1) 模型
考虑时间序列模型
其中 ,. 独立同(正态)分布,均值为 0,方差为 ,且 。如果初值 选择得当(见下文),那么 . 都服从均值为 、方差为 的正态分布,且
其中 。这个时间序列模型称为 1 阶自回归模型(autoregressive order-1 model),简称 AR(1)。
参数 的估计可以由如下事实得到
即滞后 1 自相关。因此,为了估计 ,我们首先用下式估计滞后 1 自协方差
并用通常的估计量 估计方差 。然后
最后,分别用 和 ) 估计 和 。
下面的算法在给定参数 和 的取值时,生成一个平稳的 ) 时间序列:
步骤 1. 从均值为 、方差为 的正态分布中生成 。令 。
步骤 2. 从均值为 、方差为 的正态分布中生成 。
步骤 3. 令 。
步骤 4. 令 ,转到步骤 2。
EAR(1) 模型
考虑时间序列模型
其中 ,. 独立同(指数)分布,均值为 ,且 。如果初值 选择得当(见下文),那么 都服从均值为 的指数分布,且
其中 。这个时间序列模型称为指数自回归 1 阶模型(exponential autoregressive order-1 model),简称 。该模型只能表示大于 0 的自相关。参数的估计按 的方式进行,即令 (估计的滞后 1 自相关),并令 。
下面的算法在给定参数 φ 和 λ 的取值时,生成一个平稳的 EAR(1) 时间序列:
步骤 1. 从均值为 的指数分布中生成 。令 。
步骤 2. 从 [0, 1] 上的均匀分布中生成 U。如果 ,则令
否则,从均值为 的指数分布中生成 ,并令
步骤 3. 令 ,转到步骤 2。
例 24:例 22(续)
这位股票经纪人通常会有大量数据样本,但为了便于说明,假设已经记录了下列 20 个顾客买入与卖出订单之间的时间间隔(以秒计):1.95、1.75、1.58、1.42、1.28、1.15、1.04、0.93、0.84、0.75、0.68、0.61、11.98、10.79、9.71、14.02、12.62、11.36、10.22、9.20。常规计算给出 和 。为了估计滞后 1 自相关,我们需要
于是,,且
因此,我们可以把到达间隔时间建模为 EAR(1) 过程,其中 和 ,前提是各个间隔本身能被指数分布很好地建模。
7.4 正态到任意分布变换
二元正态分布以及 AR(1) 和 EAR(1) 时间序列模型都是有用的输入模型,它们既容易拟合也容易仿真。然而,其边缘分布要么是正态的,要么是指数的,这对许多应用来说当然不是最好的选择。幸运的是,我们可以从二元正态或 AR(1) 模型出发,把它变换成具有我们所想要的任意边缘分布(包括指数分布)。
假设我们要仿真一个 cdf 为 的随机变量 X。令 为标准正态随机变量(均值为 0,方差为 1), 为其 cdf。那么可以证明
是一个 1) 随机变量。如果我们有一个 随机变量,就可以通过逆 cdf 变换得到 X:
我们称之为正态到任意分布变换(normal to anything transformation),简称 NORTA。
当然,如果我们想要的只是 ,那就没有理由如此周折;我们可以直接生成 R。但假设我们想要一个二元随机向量 ,使得 与 相关,但它们的分布不是正态的。那么我们可以从二元正态随机向量 出发,应用 NORTA 变换得到
甚至并不要求 与 来自同一个分布族;例如, 可以是某个指数分布,而 是某个 Beta 分布。
同样的思想也适用于时间序列。如果 由边缘分布为 的 生成,那么
就是一个边缘分布为 的时间序列模型。为了确保 服从 ,我们在 AR(1) 模型中令 和 。
尽管 NORTA 方法非常通用,但要实施它必须解决两个技术问题:
NORTA 方法需要能够计算标准正态 cdf,以及相关分布的逆 cdf。 没有闭式表达式,许多分布的 也没有闭式表达式。因此需要数值近似。幸运的是,这些函数已内置在许多符号计算和电子表格程序中,下面我们就给出一个例子。此外,Bratley、Fox 与 Schrage [1987] 收录了针对许多分布的算法。
标准正态随机变量 之间的相关性在通过 NORTA 变换时会被扭曲。更具体地说,如果 ) 的相关系数为 ,那么一般地 与 ] 将具有相关系数 。这一差异常常很小,但并非总是如此。
第二个问题更为关键,因为在输入建模问题中,我们希望指定二元相关或滞后 1 相关。因此,我们需要找到能给出我们所想要的输入相关 的二元正态相关系数 (回顾一下,我们通过滞后 1 相关 来指定时间序列模型)。关于这一问题已有大量研究,包括 Cario 与 Nelson [1996, 1998] 以及 Biller 与 Nelson [2003]。幸运的是,已经证明 是
关于 的非降函数,且 与 总是同号。因此,我们可以基于如下算法做一个相对简单的搜索:
步骤 1. 先令 。
步骤 2. 生成大量的相关系数为 的二元正态对 ),并用 NORTA 变换把它们变换为 。
步骤 3. 用式 (25) 计算 之间的样本相关,记为 。如果 ,则减小 并转到步骤 2;如果 ,则增大 并 转到步骤 2。如果 ,则停止。
例 25
假设我们需要 服从均值为 1 的指数分布, 服从 的 Beta 分布,并且二者具有相关系数 。图 8 给出一个用 Maple 编写的程序,它将估计所需的 值。在该程序中,n 是用于估计相关系数的样本对数。取 n = 1000 运行该程序,得到 。
图 8 估计 NORTA 方法所需的二元正态相关系数的 Maple 程序
8 小结
在离散事件仿真项目中,输入数据的收集与分析需要投入大量的时间与资源。然而,无论仿真模型多么有效、多么精巧,不可靠的输入都会导致输出在后续解释时可能产生错误的建议。
本章讨论了建立输入数据模型的四个步骤:收集原始数据、识别底层的统计分布、估计参数以及检验拟合优度。
针对便利数据收集工作给出了一些建议。然而,诸如完成习题 1 至习题 5 中任何一道所获得的经验,将会增强人们对数据收集中可能出现的困难以及规划之必要性的认识。
数据一旦收集完毕,就应当假设一个统计模型。此时如果有足够的数据,绘制直方图非常有用。通常可以基于底层过程以及直方图的形状选择一个分布,作进一步研究。
研究继续进行,对所假设的分布估计参数。本章给出了仿真中常用分布的建议估计量。在许多情况下,这些估计量是样本均值与样本方差的函数。
该过程的最后一步是检验分布假设。 图是评估拟合的有用图形方法。卡方检验、Kolmogorov–Smirnov 检验和 Anderson-Darling 拟合优度检验可应用于许多分布假设。当某个分布假设被拒绝时,就尝试另一个分布。当所有办法都失败时,可以在模型中使用经验分布。
遗憾的是,在某些情况下,必须在没有时间或资源去收集作为输入模型依据的数据时开展仿真研究。当这种情况发生时,分析人员必须利用任何可得的信息——例如制造商规格和专家意见——来构造输入模型。当输入模型是在没有数据支持的情况下导出时,检查结果对所选模型的敏感性就尤为重要。
许多(但并非全部)输入过程都可以表示为独立同分布随机变量的序列。当输入应当表现出依赖性时,就需要多变量输入模型。二元正态分布(更一般地,多元正态分布)常被用来表示有限个相关的随机变量。时间序列模型则适用于表示(概念上无限的)相关输入序列。NORTA 变换便于建立边缘分布非正态的多变量输入模型。
参考文献
BILLER, B., AND B. L. NELSON [2003], “Modeling and Generating Multivariate Time Series with Arbitrary Marginals Using an Autoregressive Technique,” ACM Transactions on Modeling and Computer Simulation, Vol. 13, pp. 211–237.
BRATLEY, P., B. L. FOX, AND L. E. SCHRAGE [1987], A Guide to Simulation, 2d ed., Springer-Verlag, New York.
CARIO, M. C., AND B. L. NELSON [1996], “Autoregressive to Anything: Time-Series Input Processes for Simulation,” Operations Research Letters, Vol. 19, pp. 51–58.
CARIO, M. C., AND B. L. NELSON [1998], “Numerical Methods for Fitting and Simulating Autoregressive-to-Anything Processes,” INFORMS Journal on Computing, Vol. 10, pp. 72–81.
CHOI, S. C., AND R. WETTE [1969], “Maximum Likelihood Estimation of the Parameters of the Gamma Distribution and Their Bias,” Technometrics, Vol. 11, No. 4, pp. 683–890.
CHAMBERS, J. M., W. S. CLEVELAND, AND P. A. TUKEY [1983], Graphical Methods for Data Analysis, CRC Press, Boca Raton, FL.
CONNOVER, W. J. [1998], Practical Nonparametric Statistics, 3d ed., Wiley, New York.
DURBIN, J. [1975], “Kolmogorov–Smirnov Tests When Parameters Are Estimated with Applications to Tests of Exponentiality and Tests on Spacings,” Biometrika, Vol. 65, pp. 5–22.
FISHMAN, G. S. [1973], Concepts and Methods in Discrete Event Digital Simulation, Wiley, New York.
GUMBEL, E. J. [1943], “On the Reliability of the Classical Chi-squared Test,” Annals of Mathematical Statistics, Vol. 14, pp. 253ff.
HINES, W. W., D. C. MONTGOMERY, D. M. GOLDSMAN, AND C. M. BORROR [2002], Probability and Statistics in Engineering and Management Science, 4th ed., Wiley, New York.
JOHNSON, M. A., S. LEE, AND J. R. WILSON [1994], “NPPMLE and NPPSIM: Software for Estimating and Simulating Nonhomogeneous Poisson Processes Having Cyclic Behavior,” Operations Research Letters, Vol. 15, pp. 273–282.
JOHNSON, M. E. [1987], Multivariate Statistical Simulation, Wiley, New York.
LAW, A. M. [2007], Simulation Modeling and Analysis, 4th ed., McGraw-Hill, New York.
LILLIEFORS, H. W. [1967], “On the Kolmogorov–Smirnov Test for Normality with Mean and Variance Unknown,” Journal of the American Statistical Association, Vol. 62, pp. 339–402.
LILLIEFORS, H. W. [1969], “On the Kolmogorov–Smirnov Test for the Exponential Distribution with Mean Unknown,” Journal of the American Statistical Association, Vol. 64, pp. 387–389.
MANN, H. B., AND A. WALD [1942], “On the Choice of the Number of Intervals in the Application of the Chi-squared Test,” Annals of Mathematical Statistics, Vol. 18, p. 50ff.
NELSON, B. L., AND M. YAMNITSKY [1998], “Input Modeling Tools for Complex Problems,” in Proceedings of the 1998 Winter Simulation Conference, D. Medeiros, E. Watson, J. Carson, and M. Manivannan, eds., Washington, DC, Dec. 13–16, pp. 105–112.
STUART, A., J. K. ORD, AND E. ARNOLD [1998], Kendall’s Advanced Theory of Statistics, 6th ed., Vol. 2, Oxford University Press, Oxford.
习题
去一家小商店,记录到达间隔时间与服务时间的分布。如果有若干名工作人员,各人的服务时间分布彼此相比如何?是否需要为每一类器具构造服务时间分布?(务必取得管理层许可后再开展此项研究。)
去一家自助餐厅,收集到达间隔时间与服务时间分布的数据。到达间隔时间分布很可能对一天三餐各不相同,并且在一餐之内也可能变化——也就是说,上午 11:00 至中午 12:00 的到达间隔时间分布可能与中午 12:00 至下午 1:00 的不同。把服务时间定义为:从顾客到达可以作出第一项选择的位置之时起,到其离开餐厅队列之时为止。(对这一定义作任何合理的修改都是可以接受的。)服务时间分布很可能对每一餐都不同。就这两种分布而言,能否把一天中的某些时段或一周中的某些日子分组,以适应数据的同质性?(务必取得管理层许可后再开展此项研究。)
去一个主要交通交叉口,记录来自各个方向的到达间隔时间分布。有些到达者要直行,有些要左转,有些要右转。到达间隔时间分布在一天之中变化,也随一周中的星期几而变化。时不时还会发生事故。为你的数据建立一个输入模型。
去一家杂货店,构造收银台处的到达分布与服务分布。这些分布可能随一天中的时段和一周中的星期几而变化。同时记录所有时间可用的服务通道数量。(务必取得管理层许可后再开展此项研究。)
去一家自助洗衣店,收集数据以建立"一位顾客使用的洗衣机与烘干机数量"(很可能相关)的输入模型。同时收集顾客到达率的数据(很可能不是平稳的)。(务必取得管理层许可后再开展此项研究。)
在同一张图上绘制四个理论正态密度函数,每个分布的均值都为零,但标准差分别为 1/4、1/2、1 和 2。
在同一张图上绘制厄兰分布的 pdf,其中 且 , 和 8。
在同一张图上绘制厄兰分布的 pdf,其中 θ = 2 且 k = 1、2、4 和 8。
绘制参数 α 取下列各值时泊松分布的 pmf:
在同一张图上绘制参数 λ 分别等于 0.6 和 1.2 时得到的两条指数分布 pdf。
在同一张图上绘制 且 和 4 时得到的三条 Weibull 分布 pdf。
下列数据是从一个伽马分布随机生成的:
| 1.691 | 1.437 | 8.221 | 5.976 |
|---|---|---|---|
| 1.116 | 4.435 | 2.345 | 1.782 |
| 3.810 | 4.589 | 5.313 | 10.90 |
| 2.649 | 2.432 | 1.581 | 2.432 |
| 1.843 | 2.466 | 2.833 | 2.361 |
计算最大似然估计量 和 。
- 下列数据是从一个 的 Weibull 分布随机生成的:
| 7.936 | 5.224 | 3.937 | 6.513 |
|---|---|---|---|
| 4.599 | 7.563 | 7.172 | 5.132 |
| 5.259 | 2.759 | 4.278 | 2.696 |
| 6.212 | 2.407 | 1.857 | 5.002 |
| 4.612 | 2.003 | 6.908 | 3.326 |
计算最大似然估计量 α 和 。(本题需要一台可编程计算器、一台计算机,或者极大的耐心。)
- 佐治亚州亚特兰大市与雅典市之间的公路沿线 100 公里内事故高发。公共安全官员称,沿线事故的发生是随机(均匀)分布的,但新闻媒体则不这么认为。佐治亚州公共安全部公布了 9 月份的记录。这些记录给出了 30 起涉及伤亡的事故发生的地点如下(数据点表示距亚特兰大市界的距离):
| 88.3 | 40.7 | 36.3 | 27.3 | 36.8 |
|---|---|---|---|---|
| 91.7 | 67.3 | 7.0 | 45.2 | 23.3 |
| 98.8 | 90.1 | 17.2 | 23.7 | 97.4 |
| 32.4 | 87.8 | 69.8 | 62.6 | 99.7 |
| 20.6 | 73.1 | 21.6 | 6.0 | 45.3 |
| 76.6 | 73.2 | 27.3 | 87.6 | 87.2 |
用 Kolmogorov–Smirnov 检验判断 9 月份事故地点的分布是否服从均匀分布。
证明例 19 的 Kolmogorov–Smirnov 检验统计量为 。
某联邦机构正在研究一座地下煤矿每月工伤事故数量的记录。过去 100 个月的数值如下:
| 每月工伤数 | 出现频数 |
|---|---|
| 0 | 35 |
| 1 | 40 |
| 2 | 13 |
| 3 | 6 |
| 4 | 4 |
| 5 | 1 |
| 6 | 1 |
(a) 对这些数据应用卡方检验,检验"底层分布为泊松分布"的假设。取显著性水平 。
(b) 对这些数据应用卡方检验,检验"该分布是均值为 1.0 的泊松分布"的假设。同样取 。
(c) (a) 与 (b) 两部分有何区别,各自可能在什么情形下出现?
- 对 50 名不同员工计算和记录本周工作小时数所需的时间进行了测量,结果如下(以分钟计):
| 员工 | 时间(分钟) | 员工 | 时间(分钟) |
|---|---|---|---|
| 1 | 1.88 | 26 | 0.04 |
| 2 | 0.54 | 27 | 1.49 |
| 3 | 1.90 | 28 | 0.66 |
| 4 | 0.15 | 29 | 2.03 |
| 5 | 0.02 | 30 | 1.00 |
| 6 | 2.81 | 31 | 0.39 |
| 7 | 1.50 | 32 | 0.34 |
| 8 | 0.53 | 33 | 0.01 |
| 9 | 2.62 | 34 | 0.10 |
| 10 | 2.67 | 35 | 1.10 |
| 11 | 3.53 | 36 | 0.24 |
| 12 | 0.53 | 37 | 0.26 |
| 13 | 1.80 | 38 | 0.45 |
| 14 | 0.79 | 39 | 0.17 |
| 15 | 0.21 | 40 | 4.29 |
| 16 | 0.80 | 41 | 0.80 |
| 17 | 0.26 | 42 | 5.50 |
| 18 | 0.63 | 43 | 4.91 |
| 19 | 0.36 | 44 | 0.35 |
| 20 | 2.03 | 45 | 0.36 |
| 21 | 1.42 | 46 | 0.90 |
| 22 | 1.28 | 47 | 1.03 |
| 23 | 0.82 | 48 | 1.73 |
| 24 | 2.16 | 49 | 0.38 |
| 25 | 0.05 | 50 | 0.48 |
用卡方检验(如例 18 那样)检验"这些服务时间服从指数分布"的假设。取类别区间数 k = 6。取显著性水平 α = 0.05。
- Studentwiser Beer Company 正在设法查明其玻璃瓶的抗破强度分布。随机抽取 50 个瓶子并测试其抗破强度,结果如下(单位:磅/平方英寸):
| 218.95 | 232.75 | 212.80 | 231.10 | 215.95 |
|---|---|---|---|---|
| 237.55 | 235.45 | 228.25 | 218.65 | 212.80 |
| 230.35 | 228.55 | 216.10 | 229.75 | 229.00 |
| 199.75 | 225.10 | 208.15 | 213.85 | 205.45 |
| 219.40 | 208.15 | 198.40 | 238.60 | 219.55 |
| 243.10 | 198.85 | 224.95 | 212.20 | 222.90 |
| 218.80 | 203.35 | 223.45 | 213.40 | 206.05 |
| 229.30 | 239.20 | 201.25 | 216.85 | 207.25 |
| 204.85 | 219.85 | 226.15 | 230.35 | 211.45 |
| 227.95 | 229.30 | 225.25 | 201.25 | 216.10 |
使用输入建模软件,应用软件中所有可用的正态性检验。如果有卡方检验可用,至少用两种不同的区间数选择来应用它。所有检验是否得出相同的结论?
- Crosstowner 是一条从亚特兰大东北部斜穿到西南部的公交线路。完成该线路所需的时间由公交司机记录。该线路周一至周五运营。最近五十次上午 8:00 班次的运行时间如下(以分钟计):
| 92.3 | 92.8 | 106.8 | 108.9 | 106.6 |
|---|---|---|---|---|
| 115.2 | 94.8 | 106.4 | 110.0 | 90.9 |
| 104.6 | 72.0 | 86.0 | 102.4 | 99.8 |
| 87.5 | 111.4 | 105.9 | 90.7 | 99.2 |
| 97.8 | 88.3 | 97.5 | 97.4 | 93.7 |
| 99.7 | 122.7 | 100.2 | 106.5 | 105.5 |
| 80.7 | 107.9 | 103.2 | 116.4 | 101.7 |
| 84.8 | 101.9 | 99.1 | 102.2 | 102.5 |
| 111.7 | 101.5 | 95.1 | 92.8 | 88.5 |
| 74.4 | 98.9 | 111.9 | 96.5 | 95.9 |
这些运行时间服从什么分布?建立并检验一个合适的模型。
- 在某通信中心以电子方式对一条报文的传输时间(以毫秒计)进行抽样。样本中最后 50 个取值如下:
| 7.936 | 4.612 | 2.407 | 4.278 | 5.132 |
|---|---|---|---|---|
| 4.599 | 5.224 | 2.003 | 1.857 | 2.696 |
| 5.259 | 7.563 | 3.937 | 6.908 | 5.002 |
| 6.212 | 2.759 | 7.172 | 6.513 | 3.326 |
| 8.761 | 4.502 | 6.188 | 2.566 | 5.515 |
| 3.785 | 3.742 | 4.682 | 4.346 | 5.359 |
| 3.535 | 5.061 | 4.629 | 5.298 | 6.492 |
| 3.502 | 4.266 | 3.129 | 1.298 | 3.454 |
| 5.289 | 6.805 | 3.827 | 3.912 | 2.969 |
| 4.646 | 5.963 | 3.829 | 4.404 | 4.924 |
这些传输时间服从什么分布?建立并检验一个合适的模型。
- 在 Gotwatts Flash and Flicker Company 精确记录了电力服务接通申请之间的时间间隔(以分钟计),最近 50 次申请的结果如下:
| 0.661 | 4.910 | 8.989 | 12.801 | 20.249 |
|---|---|---|---|---|
| 5.124 | 15.033 | 58.091 | 1.543 | 3.624 |
| 13.509 | 5.745 | 0.651 | 0.965 | 62.146 |
| 15.512 | 2.758 | 17.602 | 6.675 | 11.209 |
| 2.731 | 6.892 | 16.713 | 5.692 | 6.636 |
| 2.420 | 2.984 | 10.613 | 3.827 | 10.244 |
| 6.255 | 27.969 | 12.107 | 4.636 | 7.093 |
| 6.892 | 13.243 | 12.711 | 3.411 | 7.897 |
| 12.413 | 2.169 | 0.921 | 1.900 | 0.315 |
| 4.370 | 0.377 | 9.063 | 1.875 | 0.790 |
这些服务申请之间的时间间隔服从什么分布?建立并检验一个合适的模型。
- Earth Moving Tractor Company 保存了 D-3 拉铲挖掘机变速箱大修套件的日需求记录,结果如下:
| 0 | 2 | 0 | 0 | 0 |
|---|---|---|---|---|
| 1 | 0 | 1 | 1 | 1 |
| 0 | 1 | 0 | 0 | 0 |
| 2 | 0 | 1 | 0 | 1 |
| 0 | 1 | 0 | 0 | 2 |
| 1 | 0 | 1 | 0 | 0 |
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 1 | 0 | 1 |
| 0 | 0 | 3 | 0 | 1 |
| 1 | 0 | 0 | 0 | 0 |
这些日需求服从什么分布?建立并检验一个合适的模型。
- 将对一个执行两道工序(先铣削、再刨削)的作业车间开展仿真。本来可以分别收集两道工序加工时间的数据,然后从各自的分布中生成随机发生值。然而,车间经理说这两个时间可能是相关的;大的铣削作业需要大量刨削。对随后的 25 个订单收集了数据,结果如下(以分钟计):
| 订单 | 铣削时间(分钟) | 刨削时间(分钟) | 订单 | 铣削时间(分钟) | 刨削时间(分钟) |
|---|---|---|---|---|---|
| 1 | 12.3 | 10.6 | 14 | 24.6 | 16.6 |
| 2 | 20.4 | 13.9 | 15 | 28.5 | 21.2 |
| 3 | 18.9 | 14.1 | 16 | 11.3 | 9.9 |
| 4 | 16.5 | 10.1 | 17 | 13.3 | 10.7 |
| 5 | 8.3 | 8.4 | 18 | 21.0 | 14.0 |
| 6 | 6.5 | 8.1 | 19 | 19.5 | 13.0 |
| 7 | 25.2 | 16.9 | 20 | 15.0 | 11.5 |
| 8 | 17.7 | 13.7 | 21 | 12.6 | 9.9 |
| 9 | 10.6 | 10.2 | 22 | 14.3 | 13.2 |
| 10 | 13.7 | 12.1 | 23 | 17.0 | 12.5 |
| 11 | 26.2 | 16.0 | 24 | 21.2 | 14.2 |
| 12 | 30.4 | 18.9 | 25 | 28.4 | 19.1 |
| 13 | 9.9 | 7.7 |
(a) 以铣削时间为横轴、刨削时间为纵轴作图。这些数据看起来是否相关?
(b) 计算铣削时间与刨削时间之间的样本相关系数。
(c) 对这些数据拟合一个二元正态分布。
编写一个计算机程序,计算 Weibull 分布的最大似然估计量 。程序的输入应当包括样本量 、观测值 、停止准则 (当 $| f ( \widehat {\beta} _ {j} ) | \leq \epsilon ) $ 时停止);以及打印选项 OPT(通常设为 0)。输出为估计值 α 和 ,将打印附加输出,如表 4 那样显示收敛过程。使程序尽可能"用户友好"。
考察一个你可以访问的计算机软件库或仿真支持环境。获取其中对求解习题 7 至习题 24 有用的数据分析软件的文档。用该软件辅助求解选定的题目。
某家小旅馆连续 20 晚的住客人数被观测为 20、14、21、19、14、18、21、25、27、26、22、18、13、18、18、18、25、23、20、21。对这些数据分别拟合 AR(1) 与 EAR(1) 模型。通过查看数据的直方图判断哪个模型拟合更好。
下列数据表示在一家银行办理业务所需的时间,以分钟计:0.740、1.28、1.46、2.36、0.354、0.750、0.912、4.44、0.114、3.08、3.24、1.10、1.59、1.47、1.17、1.27、9.12、11.5、2.42、1.77。为这些数据建立一个输入模型。
两类作业(A 与 B)随订单到达而被释放到某作业车间的输入缓冲区,订单的到达是不确定的。上周的生产数据如下:
| 天 | 作业数 | A 的数量 |
|---|---|---|
| 1 | 83 | 53 |
| 2 | 93 | 62 |
| 3 | 112 | 66 |
| 4 | 65 | 41 |
| 5 | 78 | 55 |
建立每天各类作业新到达数的输入模型。
下列是某台机器上加工时间(以分钟计)的可得数据:0.64、0.59、1.1、3.3、0.54、0.04、0.45、0.25、4.4、2.7、2.4、1.1、3.6、0.61、0.20、1.0、0.27、1.7、0.04、0.34。建立加工时间的输入模型。
对于此处给出的到达计数数据,估计 NSPP 的到达率函数 λ(t),以每小时到达数计:
| 时段 | 到达数 | |||
|---|---|---|---|---|
| 第 1 天 | 第 2 天 | 第 3 天 | 第 4 天 | |
| 8:00–10:00 | 22 | 24 | 20 | 28 |
| 10:00–12:00 | 23 | 26 | 32 | 30 |
| 12:00–2:00 | 40 | 33 | 32 | 38 |
利用网络,调研本章提到的某些输入建模软件包(可以从 www.informs-sim.org 入手)。它们有哪些功能?包含哪些分布?
在外科收治流程中,有护工负责护送患者前往术前准备区。按政策规定,患者不得自行前往。一位管理工程师快步走了一遍该路线,发现走到准备区需要 2 分钟。护工说,护送一位患者到该区域有时需要长达 7 分钟,但通常需要 5 分钟。根据所给信息,构造护送患者所需时间的输入模型。
在一道插接/密封/检验作业中,电子元件被插装到电路板上,外壳被组装并密封,然后对成品进行测试。完成这一切的时间预计对 A12117c 型组件为 2 分钟,对 B33433x 型组件为 3 分钟。围绕这些值上下 20% 的平均偏差被视为标准的变异性容许量。根据所给信息,构造该插接/密封/检验作业的输入模型。
下列数据是在五个星期一按一天中的小时统计的呼叫中心来话计数。该过程看起来是否是非平稳的?如果是,则为上午 8:00 至下午 4:00 之间呼叫的到达建立一个 NSPP 输入模型。
| 8-9A.M. | 9-10A.M. | 10-11A.M. | 11-12P.M. | 12-1P.M. | 1-2P.M. | 2-3P.M. | 3-4P.M. |
|---|---|---|---|---|---|---|---|
| 27 | 37 | 58 | 68 | 65 | 33 | 37 | 21 |
| 27 | 35 | 67 | 93 | 74 | 42 | 39 | 21 |
| 25 | 39 | 58 | 75 | 82 | 34 | 46 | 19 |
| 18 | 42 | 48 | 75 | 62 | 51 | 49 | 14 |
| 29 | 42 | 65 | 88 | 70 | 43 | 45 | 22 |
10 仿真模型的验证、校准与确认
模型开发者所面临的最重要、也是最困难的任务之一,就是对仿真模型进行验证(verification)与确认(validation)。那些利用模型输出辅助提出设计建议的工程师与分析师,以及依据这些建议作出决策的管理者,出于理应对模型的有效性抱有一定程度的怀疑。模型开发者的职责在于,在开发与确认的整个过程中与最终用户密切合作,以减少这种怀疑并提高模型的可信度。
确认过程的目标有两重:(a) 造出一个能够足够贴近地再现真实系统行为的模型,使得该模型可以充当实际系统的替代物,用于对系统进行试验、分析系统行为、预测系统性能;(b) 把模型的可信度提高到可接受的水平,从而使模型能被管理者及其他决策者所采用。
确认不应当被视为模型开发之后一系列孤立的做法,而应当被视为模型开发不可分割的一部分。不过,从概念上说,验证与确认过程由下列组成部分构成:
验证(verification)关注的是把模型建造正确(building the model correctly)。它通过把概念模型(conceptual model)与实现这一概念的计算机表示进行对比来推进。它提出的问题是:模型在仿真软件中是否被正确地实现?模型的输入参数和逻辑结构是否得到了正确的表示?
确认(validation)关注的是建造正确的模型(building the correct model)。它试图证实模型是对真实系统的准确表示。确认通常通过模型的校准(calibration)来实现——这是一个迭代过程:把模型与实际系统行为作比较,利用两者之间的差异以及由此获得的见解来改进模型。这一过程反复进行,直到模型精度被认为可以接受。
本章描述在验证与确认过程中已被推荐和实际使用的各种方法。这些方法大多数是非形式化的主观比较,少数是形式化的统计程序。使用后面这些程序会牵涉到与输出分析有关的问题。输出分析(output analysis)是指对仿真所产生的数据进行分析,并从这些数据出发,就真实系统的行为作出推断。概括它们之间的关系:确认正是模型使用者获得信心的过程——即相信输出分析正在对所研究的真实系统作出有效的推断。
关于验证与确认,已有大量文章和教材章节可供阅读。关于主要问题的讨论,读者可参阅 Balci [1994, 1998, 2003]、Carson [1986, 2002]、Gass [1983]、Kleijnen [1995]、Law 与 Kelton [2000]、Naylor 与 Finger [1967]、Oren [1981]、Sargent [2003]、Shannon [1975] 以及 van Horn [1969, 1971]。关于与确认各方面相关的统计技术,读者除可获取上述文献外,还可查阅 Balci 与 Sargent [1982a,b; 1984a]、Kleijnen [1987] 和 Schruben [1980] 的文献。关于以确认为重点的案例研究,读者可参阅 Carson 等 [1981a,b]、Gafarian 与 Walsh [1970]、Kleijnen [1993] 以及 Shechter 与 Lucas [1980]。关于确认的文献书目已由 Balci 与 Sargent [1984b] 以及 Youngblood [1993] 出版。
1 模型构建、验证与确认
模型构建的第一步,是观察真实系统及其各组成部分之间的相互作用,并收集关于其行为的数据。但单靠观察很少能产生对系统行为的充分理解。应当询问熟悉该系统或其中任一子系统的人员,以利用他们的专门知识。操作员、技术员、维修与保养人员、工程师、主管和管理者都了解系统的某些方面,而这些方面可能是他人所不熟悉的。随着模型开发的推进,可能出现新的问题,模型开发者会返回这一步,以进一步了解系统的结构与行为。
模型构建的第二步,是构造概念模型——一组关于系统各组成部分及其结构的假设,外加关于模型输入参数取值的假设。如图 1 所示,概念确认(conceptual validation)就是真实系统与概念模型之间的比较。
第三步是运行模型(operational model)的实现,通常通过使用仿真软件,把概念模型中的各项假设并入仿真软件的世界观和概念之中。

图 1 模型构建、验证与确认。
实际上,模型构建并不是一个由三个步骤构成的线性过程。相反,在构建、验证和确认模型的过程中,模型构建者会多次返回上述每一个步骤。图 1 描绘的是持续进行的模型构建过程:对验证与确认的需要,促使人们不断地把真实系统与概念模型和运行模型两者进行比较,并促使人们反复修改模型以提高其精度。
2 仿真模型的验证
模型验证的目的是保证概念模型在运行模型中得到准确反映。概念模型往往涉及对系统运行的某种程度的抽象,或对实际操作作某种程度的简化。验证要提出以下问题:概念模型(关于系统组成部分与系统结构的假设、参数取值、抽象与简化)是否被运行模型准确地表示?
在验证过程中可以采用许多常识性的建议:
应当由其开发者之外的他人来检查运行模型,最好是仿真软件方面的专家。
绘制一张流程图,其中包含事件发生时系统可能采取的每一种逻辑上可能的动作,并针对每一种事件类型、沿着模型逻辑逐一跟踪每个动作。
在输入参数的各种设定下,仔细检查模型输出是否合理。让已实现的模型显示多种多样的输出统计量,并把其中每一项都仔细检查一遍。
让运行模型在仿真结束时打印出输入参数,以确保这些参数取值没有被无意改动。
尽可能使运行模型具备自我文档化的能力。对所用的每一个变量给出精确定义,并对每一个子模型、过程(或代码的主要部分)、部件或其他模型细分给出其用途的一般性说明。
如果运行模型带有动画,应核实动画中所见的情形是否模仿了实际系统。通过动画可以观察到的错误例子包括:自动导引车(AGV)在单行通道上或在交叉口处相互穿越,以及实体在仿真过程中(无意地)消失。
交互式运行控制器(Interactive Run Controller, IRC)或调试器是成功构建仿真模型不可或缺的组成部分。即使是最优秀的仿真分析师,在构建模型时也会犯错误或出现逻辑错误。IRC 通过以下方式帮助发现并纠正这些错误:
(a) 可以在仿真推进的过程中对其进行监控。做法可以是:把仿真推进到经过所期望的时间为止,然后显示该时刻的模型信息。另一种做法是:把仿真推进到某一特定条件成立为止,然后显示信息。
(b) 可以把注意力集中到某个特定实体、代码行或过程上。例如,每当一个实体进入指定过程时,仿真就会暂停,以便收集信息。再如,每当某个特定实体变为活动状态时,仿真也会暂停。
(c) 可以观察所选模型分量的取值。当仿真暂停时,可以观察变量、属性、队列、资源、计数器等的当前取值或状态。
(d) 可以暂时挂起或暂停仿真,不仅是为了查看信息,也可以是为了重新赋值或改变实体的流向。
建议使用图形界面来完成验证与确认 [Bortscheller and Saulnier, 1992]。模型的图形表示本质上就是自我文档化的一种形式,它简化了理解模型这项工作的难度。
这些建议基本上与任何软件工程师都会遵循的建议相同。
在这些常识性建议之中,有一条非常容易实现、却常常被忽视——尤其是被正在学习仿真的学生所忽视——那就是仔细而彻底地检查模型输出是否合理(即建议 3)。例如,考虑一个由许多串联和并联配置的服务中心构成的复杂排队网络模型。假定建模者主要关注响应时间(response time),其定义为顾客通过网络中某个指定部分所需的时间。在模型开发的验证(以及校准)阶段,建议程序除响应时间之外,还收集并打印出许多统计量,例如服务台的利用率、各子系统中的顾客时间平均数。例如,对某个服务台利用率的检查,可能揭示其值不合理地偏低(或偏高),这可能是一种错误,而错误的原因可能是平均服务时间规定有误,也可能是模型逻辑上的失误——它把过少(或过多)的顾客派送给了这个特定的服务台,或者是其他种种可能的参数规定不当或逻辑错误。
在能够自动收集许多标准统计量(平均队长、平均等待时间等)的仿真语言中,显示几乎所有感兴趣的统计量所需额外编程工作极少,甚至无需额外工作。而在 C、C++ 或 Java 这样的通用语言中,所需工作量就要大得多,因为它们不具备帮助程序员收集统计量的功能。
能够迅速指示模型是否合理的两组统计量是当前存量(current contents)和累计计数(total count)。这些统计量适用于任何有某种物品在其中流动的系统,不论这些物品被称为顾客、交易、库存还是车辆。当前存量是指在给定时刻系统各组成部分中物品的数量。累计计数是指在给定时刻之前进入系统各组成部分的物品总数。在某些仿真软件中,这些统计量会自动保存,并可在仿真时间的任意点显示出来。在另一些仿真软件中,则可能必须在运行模型中加入简单的计数器,并在适当的时刻显示它们。如果系统某一部分的当前存量很高,这一状况表明有大量实体被延误了。如果针对逐渐加长的仿真运行时间显示输出,并发现当前存量或多或少呈线性增长,那么极有可能某个队列是不稳定的,而服务台将随时间推移而愈发落后。这可能表明服务台的数量太少,或者某个服务时间规定有误。另一方面,若某个子系统的累计计数为零,则表明没有任何物品进入该子系统——这同样是一个极可疑的现象。另一种可能是当前计数与累计计数都等于一。这可能表明某个实体占用了某项资源却从未释放该资源。针对不同运行长度对这些统计量作仔细评估,有助于发现模型逻辑错误和数据规定不当。检查输出的合理性通常无法发现较为隐蔽的错误,但它是发现严重错误最快的方式之一。为了有助于错误检测,最好的做法是在运行模型之前,先由模型开发者预测所选输出统计量的合理取值范围。这样的预测可以减少对偏差强加合理化解释、从而不去调查异常输出原因的可能。
对于某些模型,可以考虑的不只是某一特定统计量是否合理,还可以计算某些长期性能度量。例如,分析人员可以对大量排队系统计算长期服务台利用率,而无须对到达间隔时间或服务时间分布作任何特殊假设。通常所需的信息仅仅是网络配置加上到达率与服务率。任何能够用解析方法计算、然后与其仿真值相比较的性能度量,都为验证提供了又一件有用的工具。推测仿真仿真的目标是估计某个无法用解析方法计算的性能度量,例如平均响应时间;但是,排队系统中的所有性能度量都是相互关联的。因此,如果一个仿真模型正确地预测了某一项度量(例如利用率),那么对模型预测其他相关度量(例如响应时间)之能力的信心也会随之增强(尽管这两项度量之间的确切关系一般说来是未知的,并且因模型而异)。反过来,如果一个模型错误地预测了利用率,那么它对其他量(例如平均响应时间)的预测就极值得怀疑。
有助于验证过程的另一项重要方式,是常被忽视的文档编制阶段。如果模型构建者在运行模型中写上简要注释,再加上所有变量和参数的定义,再加上运行模型各个主要部分的说明,那么他人(或日后模型构建者本人)验证模型逻辑就要容易得多。文档编制对于澄清模型逻辑、核实其完备性同样重要。
一种更为精巧的技术是使用跟踪(trace)。一般来说,跟踪给出带时间戳的详细仿真输出,表示每当事件发生时某一组选定系统状态、实体属性和模型变量的取值。也就是说,在事件发生时刻,模型会把详细的状态信息写入文件,供模型开发者事后查阅,以辅助模型验证和建模错误的发现。
例 1
在验证《电子表格中的仿真示例》一章例 5 中单服务台排队模型的运行模型时(在 C、C++ 或 Java 这样的通用语言中,或在大多数仿真语言中),一位分析人员运行了 16 个时间单位,并观察到排队线的时间平均长度为 位顾客;对于一次仅 16 个时间单位的短运行来说,这当然是合理的。尽管如此,该分析人员仍认为作一次更为细致的验证是有价值的。
图 2 中的跟踪给出了从仿真时刻 CLOCK 0 到 CLOCK 16 的假想跟踪输出,所针对的是《电子表格中的仿真示例》一章例 5 中那个简单的单服务台队列。本例说明,当从汇总输出统计量(如 )的检查中看不出任何错误时,如何借助跟踪发现错误。请注意,在仿真时刻 CLOCK 3,系统中的顾客数为 ,但服务台却是空闲的(STATUS 0)。这一错误的来源可能是逻辑不正确,也可能仅仅是没有把属性 STATUS 置为取值 1(在通用语言或大多数仿真语言中编码时)。
无论如何,这一错误必须被发现并纠正。请注意,检查汇总度量(即输出)这种较为不精细的做法并未能发现该错误。利用等式 ,读者可以核实 是如何由数据正确计算出来的( 是 NCUST 减去 STATUS 的时间平均值):
正如前面所提到的。因此,输出度量 的取值是合理的,并且是由数据正确计算出来的,但它的数值确实错了,因为属性 STATUS 没有取到正确的值。从图 2 可以看出,跟踪提供了关于模型实际历史的信息,其细节与信息量都超过仅有汇总度量所能提供的信息。
大多数仿真软件都内置了执行跟踪的能力,程序员无须作大量编程。此外,在通用语言中,可以使用一条 ‘print’(打印)或 ‘write’(写出)语句来实现跟踪功能。
不难想象,跨越很长一段仿真时间的跟踪会迅速产生极其大量的输出,而逐项详细检查其正确性将是极其麻烦的。跟踪的目的在于通过进行详尽的纸笔计算来验证计算机程序的正确性。为了使这一点切实可行,带有跟踪的仿真通常被限制在一个很短的时间段内。下面给出的是这种跟踪输出的一例。
图 2 仿真跟踪(Simulation Trace)。
当然,最好是确保每一类事件(例如 Arrival)至少发生一次,以便检查其后果以及它对模型的影响是否准确。如果某一事件特别罕见,则可能必须使用人工数据来迫使它在一次短时仿真中发生。这是合理的,因为其目的在于核实该罕见事件对系统的作用是否符合预期。
有些软件允许选择性跟踪(selective trace)。例如,可以把跟踪设置在模型中的特定位置,或者设定在某个指定的仿真时刻触发跟踪。每当一个实体经过所指定的位置时,仿真软件就向跟踪文件写入一条带时间戳的消息。有些仿真软件还允许对某个选定实体进行跟踪;每当该指定实体变为活动状态时,跟踪即被启动,并写入带时间戳的消息。这种跟踪在追踪某一个实体贯穿整个模型的过程中非常有用。选择性跟踪的另一个例子,是把跟踪设置为在某个特定条件出现时触发。例如,每当某个资源前面的队列达到五个或更多时,就打开跟踪。这样就可以让仿真一直运行到出现异常情况,然后从该时刻起考察其行为。不同的仿真软件包对跟踪的支持程度各不相同。在实践中,它往往是由模型开发者在模型中的适当位置加入打印消息来实现的。
在三类技术——常识性技术、周密的文档编制和跟踪——之中,建议前两类总是要做的。对模型输出作合理性检查,尤其有价值、也尤其有信息量。通用跟踪可能产生大量数据,远远超出可用或可供仔细检查的规模。而选择性跟踪则可以就关键模型分量提供有用信息,并把数据量维持在可管理的水平上。
3 模型的校准与确认
校准与确认虽然在概念上彼此不同,但通常是由建模者同时进行的。确认是把模型及其行为与真实系统及其行为进行对比的总体过程。校准则是把模型与真实系统作比较、对模型作出调整(甚至作出重大修改)、再把修改后的模型与现实作比较、再作进一步调整、再次比较,如此往复的迭代过程。图 3 展示了模型校准与整个确认过程之间的关系。把模型与现实作比较,是通过各种不同的检验来进行的——有些是主观的,有些是客观的。主观检验通常涉及那些对系统的一个或多个方面有所了解的人,由他们对模型及其输出作出判断。客观检验则总是需要系统行为的数据,以及模型所产生的相应数据。然后进行一项或多项统计检验,把系统数据集的某个方面与模型数据集的同一方面进行比较。这一"把模型与系统作比较、再修改概念模型和运行模型以适应所察觉到的模型缺陷"的迭代过程,将一直持续下去,直到模型被认为足够准确为止。
对校准阶段可能提出的一种批评是:如果校准就此为止,那么模型仅仅是针对所用的那一组数据完成了确认——也就是说,模型被"拟合"到了单一数据集上。减轻这一批评的一种办法,是收集一组新的系统数据(或预留原系统数据的一部分),以便在确认的最后阶段使用。也就是说,在用原系统数据集完成校准之后,用第二个系统数据集进行一次"最终"确认。如果在"最终"确认工作中发现模型与真实系统之间存在不可接受的差异,建模者就必须返回校准阶段并修改模型,直到模型变得可以接受为止。

图 3 模型的迭代校准过程。
确认不是非此即彼的命题——任何模型都不可能完全代表所研究的系统。此外,如图 3 所示,模型的每一次修订都要花费一定的成本、时间和精力。建模者必须权衡模型精度可能提高(但并无保证)与确认工作成本增加之间的得失。通常,建模者(以及模型使用者)对模型预测与系统行为之间可以容忍的最大偏差有某种约定。如果在预算约束内无法达到这一精度水平,那么要么必须降低对模型精度的期望,要么必须放弃该模型。
作为确认过程中的一种辅助手段,Naylor 与 Finger [1967] 提出了一个被广泛遵循的三步方法:
步骤 1. 构建一个具有很高表面效度(face validity)的模型。
步骤 2. 确认模型假设。
步骤 3. 把模型的输入—输出变换与真实系统相应的输入—输出变换作比较。
接下来的五个小节将详细考察这三个步骤。
3.1 表面效度
仿真建模者的第一个目标,是构造一个在表面上看对模型使用者以及其他熟悉所仿真真实系统的人而言显得合理的模型。模型的潜在使用者应当从模型概念化直到实现的整个过程中都参与模型构建,以确保通过关于系统结构的合理假设和可靠数据,把高度的现实性融入模型之中。潜在使用者以及熟悉情况的人也可以评价模型输出是否合理,并有助于识别模型的缺陷。因此,随着模型因初始模型缺陷被识别而得到的见解而迭代改进,使用者可以参与校准过程。用户参与的另一项好处,是模型被感知到的有效性与可信度得以提高;没有这种可信度,管理者便不会愿意把仿真结果作为决策的依据。
敏感性分析也可以用来检验模型的表面效度。向模型使用者提出这样的问题:当一个或多个输入变量发生改变时,模型的行为是否符合预期。例如,在大多数排队系统中,如果顾客到达率(或对服务的需求)上升,那么可以预期服务台的利用率、排队长度和延误都会趋于增加(尽管增加多少可能无从知晓)。凭经验以及对真实系统(或类似的相关系统)的观察,建模者与模型使用者大概至少对输入变量增减时模型输出变化的方向有某种概念。对大多数大规模仿真模型而言,输入变量很多,因而可能的敏感性测试也很多。如果改变所有输入变量的代价过高或耗时过长,模型构建者就必须设法选出最关键的输入变量进行测试。如果至少有两种输入参数设定下的真实系统数据可用,那么就可以通过适当的统计技术进行客观的、科学性的敏感性测试。
3.2 模型假设的确认
模型假设大致分为两类:结构假设和数据假设。结构假设涉及系统如何运行的问题,通常涉及对现实的简化与抽象。例如,考虑一家银行的顾客排队与服务设施。顾客可以排成一条队列,也可以为每个柜台员各设一条单独的队列。如果有多条队列,顾客可以严格按先到先服务接受服务,也可能在某条队列移动更快时改换队列。柜台员的数量可以是固定的,也可以是可变的。这些结构假设应通过在适当的时间段内进行实地观察,以及通过与银行管理者和柜台员就银行政策及这些政策的实际执行情况进行讨论来加以核实。
数据假设应当建立在收集可靠数据以及对数据作正确统计分析的基础上。例如,在前面提到的银行研究中,所收集的数据包括:
高峰负荷(“rush-hour”)的几个 2 小时时段内顾客的到达间隔时间;
非高峰时段内的到达间隔时间;
商业账户的服务时间;
个人账户的服务时间。
数据的可靠性通过与银行管理者协商来核实,由他们指出典型的高峰时段和典型的非高峰时段。当把两个或两个以上在不同时刻收集的数据集合并起来时,还可以借助数据同质性的客观统计检验进一步增强数据的可靠性。(在不同时刻收集的两个个人账户服务时间数据集 X 和 Y,是否来自同一个母体?若是,则这两组数据可以合并。)此外还可能需要其他检验,以检验数据中是否存在相关性。只要分析人员确信所处理的是一个随机样本(即不存在相关性),统计分析就可以开始。
无论手工完成还是借助专用软件完成,分析都由三个步骤构成:
步骤 1. 确定一个合适的概率分布。
步骤 2. 估计所假设分布的参数。
步骤 3. 用拟合优度(goodness-of-fit)检验(如卡方检验或 Kolmogorov-Smirnov 检验)以及图示方法,确认所假定的统计模型。
使用拟合优度检验是数据假设确认中的一项重要内容。
3.3 输入—输出变换的确认
对一个模型而言最根本的检验,实际上也是就整个模型而言唯一的客观检验,就是这样一项能力:当模型输入数据与实际输入相符、且模型中实现的一项政策也将在系统的某个时点得到实施时,模型能够预测真实系统未来的行为。而且,如果某些输入变量的水平(例如,到服务设施的顾客到达率)上升或下降,模型应当准确预测在类似情形下真实系统中会发生什么。换句话说,模型的结构应当足够准确,使模型不仅能针对一组输入数据作出良好预测,而且能针对所关注的一系列输入数据作出良好预测。
在确认过程的这一阶段,模型被视为一种输入—输出变换——也就是说,模型接受输入参数的取值,并把这些输入变换为输出性能度量。所确认的正是这种对应关系。
建模者也可以不去用"预测未来"的方式来确认模型的输入—输出变换,而改用专供确认之用的历史数据——也就是说,如果已有一组数据集用于开发和校准模型,那么建议另用一组独立的数据集作为最终的确认检验。这样,为了确认模型的目的,准确的"对过去的预测"就可以取代对未来的预测。
模型通常是围绕一组特定的系统响应而开发的,这些响应需要在某个输入条件范围下测量。例如,在排队系统中,响应可能是服务台利用率和顾客延误,而输入条件(或输入变量)范围可能包括某个站点有两三个服务台以及若干可选的调度规则。在生产系统中,响应可能是产出量(即每小时产量),而输入条件可能是若干台以不同速度运转的机器的可选组合,每台机器又有各自的故障与保养特性。
无论如何,建模者都应当以主要的关注响应作为确认模型的首要判据。如果模型后来被用于与其原始用途不同的目的,就应当针对新的关注响应、在可能已变化的输入条件下对模型重新确认。
确认输入—输出变换的一个必要条件是:所研究系统的某个版本必须已经存在,从而能够收集至少一组输入条件下的系统数据,以便与模型预测作比较。如果该系统尚处在规划阶段、无法收集系统运行数据,那么完整的输入—输出确认就不可能进行。此时应在可能的范围内采用其他类型的确认。在某些情形下,规划系统的某些子系统可能已经存在,从而可以进行局部的输入—输出确认。
推测该模型将被用于比较备选的系统设计,或用于考察一系列新输入条件下的系统行为。现在暂且假定系统的某个版本正在运行,并且既有系统的模型已经完成了确认。那么,当使用不同的输入时,关于模型的有效性又能说些什么呢?也就是说,如果改变模型输入以代表一种新的系统设计、一种新的系统运行方式,甚至某种假想的未来情形,那么,对于这个新的但尚不存在的拟建系统,或者对于处于新输入条件下的系统,模型的有效性能说些什么呢?
第一,在相似输入条件下两个模型的响应,将被用作比较既有系统与拟建系统的判据。确认会增强建模者对既有系统模型准确性的信心。第二,在许多情形下,拟建系统是既有系统的某种修改,建模者希望对既有系统模型的信心能够转移到新系统的模型上。若新模型相对于旧模型在运行模型方面的改动属于相对较小的改动,这种信心的转移通常是可以成立的(对实际系统而言,这可能是一次重大改动)。运行模型方面的改动从相对较小到相对较大,包括以下几类:
单个数值参数的微小改动,例如机器的速度、顾客到达率(到达间隔时间的分布形式不变)、并联服务中心的服务台数量,或机器的平均失效时间与平均修复时间;
统计分布形式的微小改动,例如服务时间的分布或机器失效时间的分布;
某个子系统逻辑结构的重大改动,例如排队模型中排队规则的改变,或作业车间模型中调度规则的改变;
涉及新系统采用不同设计的重大改动,例如用计算机化库存控制系统取代旧的非计算机化系统,或用自动存储与检索系统取代由工人使用叉车人工取件的仓库系统。
如果对运行模型的改动属于微小改动,例如第 1 项或第 2 项,那么这些改动可以经过仔细验证,新模型的输出可以相当有把握地被接受。如果别处存在足够相似的子系统,那么或许可以先确认代表该子系统的子模型,再把这个子模型与其他已确认的子模型结合起来,构成一个完整的模型。这样一来,第 3 项和第 4 项中那些实质性模型改动的部分确认就有可能实现。遗憾的是,对于一个尚不存在的系统,其模型的输入—输出变换无法得到完全确认。无论如何,在时间与预算约束之内,建模者都应当尽可能多地采用各种确认技术;如果能够收集到这类子系统的运行数据,还应当对子模型进行输入—输出确认。
例 2 将说明输入—输出确认可能采用的某些技术,并将更详细地讨论输入变量、不可控变量、决策变量、输出(响应)变量和输入—输出变换这些概念。
例 2:贾斯帕尔第五国民银行
如图 4 所示,贾斯帕尔第五国民银行正计划扩充其位于主街街角的免下车(drive-in)服务。目前只有一个免下车窗口,由一名柜台员提供服务。免下车窗口只允许一笔或两笔交易同时进行,因此曾假定每次服务时间都是来自某个潜在总体的随机样本。针对某个星期五上午 11:00 至下午 1:00 之间到达的 90 位顾客,收集了服务时间 和到达间隔时间 。这一时段是在与管理层和柜台员协商之后选定的,因为人们认为它能代表一个典型的高峰期。
数据分析得出结论:到达可用速率为每小时 45 位顾客的泊松过程来建模,而服务时间近似服从正态分布,其均值为 1.1 分钟,标准差为 0.2 分钟。

图 4 第五国民银行的免下车窗口。
因此,模型有两个输入变量:
- 到达间隔时间,服从速率为 /小时的指数分布(即泊松到达过程);
- 服务时间,假定为
每个输入变量都有一个水平:到达间隔时间的速率为 /小时,服务时间的均值为 1.1 分钟、标准差为 0.2 分钟。到达间隔时间是不可控变量(uncontrollable variable,即在真实系统中管理者无法控制)的例子。服务时间同样被当作不可控变量处理,尽管服务时间的水平可能是部分可控的。如果通过安装一台计算机终端可以把平均服务时间降低到 0.9 分钟,那么服务时间变量的水平就成为一个决策变量或可控参数。把所有决策变量都设定在某个水平上即构成一项政策。例如,当前的银行政策是:一名柜台员 、平均服务时间 分钟、以及一条供等候车辆使用的排队线 。( 用来表示决策变量。)决策变量处于管理者的控制之下;而不可控变量(如到达率和实际到达时刻)则不受管理者控制。到达率可能随时间而变化,但这种变化被视为由管理者控制之外的外部因素所造成。
表 1 当前银行运营模型的输入变量与输出变量
| 输入变量 | 模型输出变量 Y |
|---|---|
| D = 决策变量 | 管理者主要关注的变量(Y1, Y2, Y3) |
| X = 其他变量 | |
| Y1 = 柜台员利用率 | |
| 泊松到达,速率 = 45/小时 | Y2 = 平均延误 |
| X11, X12, … | Y3 = 最大队长 |
| 服务时间,N(D2, 0.22) | 次要关注的其他输出变量 |
| X21, X22, … | |
| Y4 = 观测到的到达率 | |
| D1 = 1(一名柜台员) | Y5 = 平均服务时间 |
| D2 = 1.1 分钟(平均服务时间) | Y6 = 服务时间的样本标准差 |
| D3 = 1(一条队列) | |
| Y7 = 排队线的平均长度 |
一个关于当前银行运营的模型已经开发出来,并在与银行管理层和员工的密切协商中得到验证。模型假设已按第 3.2 节所讨论的方式得到确认。由此得到的模型现在被视为一个"黑箱"(black box),它接受所有输入变量的规定,并把它们变换为一组输出(响应)变量。输出变量由仿真所生成的全部感兴趣统计量组成。例如,管理者关心免下车窗口柜台员的利用率(柜台员在窗口忙碌的时间百分比)、顾客从到达至开始服务的平均延误(以分钟计),以及高峰期内的最大队长。这些输入变量与输出变量如图 5 所示,并连同若干附加的输出变量一起列于表 1。不可控的输入变量用 X 表示,决策变量用 D 表示,输出变量用 Y 表示。从"黑箱"的角度看,模型接受输入 X 和 D 并产生输出 ,即
或
这里 f 表示由模型结构所决定的变换。对于第五国民银行的研究,模型中生成的顾客 与顾客 n 之间的指数分布到达间隔时间记为 。(不要把 与 混淆;后者是对真实系统所作的观察值。)模型中为顾客 n 生成的服从正态分布的服务时间记为 。当前运营下,决策变量集合(即政策)为 。输出(响应)变量记为 ,其定义见表 1。
要使银行模型输入—输出变换的确认成为可能,必须有真实系统数据可用,并且能与表 1 中模型输出 Y 的至少一部分相比较。系统响应应当在与输入数据 收集期间相同的时段内(同一个星期五上午 11:00 至下午 1:00)收集。这一点很重要,因为如果系统响应数据是在某个较为清淡的日子收集的(比如到达率为每小时 40),那么系统响应(例如柜台员利用率 、平均延误 、最大队长 )就会低于到达率为每小时 45 的时段内所观测到的相同变量。假定相继顾客的延误是在同一个星期五上午 11:00 至下午 1:00 之间测量的,并且发现平均延误为 分钟。就确认而言,我们把它视为真实均值 。

图 5 模型的输入—输出变换。
当模型以生成的随机变量 和 运行时,可以预期平均延误 的观测值应当接近 分钟。所生成的输入值 和 不能指望与真实系统的实际输入值 和 完全重合,但可以指望它们重现实际输入的统计模式。因此,由仿真生成的 值应当与所观测到的系统变量 分钟相一致。那么,建模者可以怎样检验这种一致性呢?
建模者对模型作少量统计上独立的重复(replication)。统计独立性通过使用随机数发生器所产生的互不重叠的随机数组,或为每次重复独立地选择种子(从随机数表中选取)来保证。六次独立重复(每次持续 2 小时)的结果见表 2。
每一次模型重复所观测到的到达率 和样本平均服务时间 也一并记录下来,以便分别与规定值 45/小时和 1.1 分钟作比较。确认检验由把系统响应(即平均延误 分钟)与模型响应 作比较构成。形式上,要对如下原假设与备择假设进行统计检验:
如果 不被拒绝,那么根据这一检验,没有理由认为模型无效。如果 被拒绝,则当前版本的模型被否决,建模者必须设法改进模型,如图 3 所示。按这里的表述,适当的统计检验是 t 检验,其进行方式如下:
选取显著性水平 α 和样本量 n。对于银行模型,选取
计算 n 次重复上的样本均值 和样本标准差 S:
以及
其中 如表 2 所示。
从附录中的表 A.5 查得 t 的临界值。对于式 (1) 这样的双侧检验,使用 ;对于单侧检验,视情形使用 或 (n − 1 为自由度)。由表 ,双侧检验时 。
表 2 银行模型六次重复的结果
| 重复 | (到达数/小时) | (分钟) | = 平均延误(分钟) |
|---|---|---|---|
| 1 | 51 | 1.07 | 2.79 |
| 2 | 40 | 1.12 | 1.12 |
| 3 | 45.5 | 1.06 | 2.24 |
| 4 | 50.5 | 1.10 | 3.45 |
| 5 | 53 | 1.09 | 3.13 |
| 6 | 49 | 1.07 | 2.38 |
| 样本均值 | 2.51 | ||
| 标准差 | 0.82 |
计算检验统计量
其中 是原假设 中所规定的取值。这里 分钟,因此
对于双侧检验,若 $ \left| t_{0} \right| > t_{\alpha / 2 , n - 1} $,则拒绝 ;否则不拒绝 。[对于单侧检验,若 ,则当 时拒绝 ;若 ,则当 时拒绝 。]由于 $ | t | = 5 . 34 > t_{0 . 025 , 5} = 2 . 571 $,拒绝 ,从而得出结论:该模型在预测顾客平均延误方面是不充分的。
请记住,在假设检验中,拒绝原假设 是一个很强的结论,因为
而显著性水平 α 取得很小,比如这里所取的 。式 (3) 表明,在 确实为真时错误地拒绝 的概率很低()——也就是说,在模型确实有效(就所检验的变量而言)的情况下判定模型无效的概率很小。使 t 检验成立的条件是:观测值 服从正态分布且相互独立。在本例中,这些条件是否得到满足呢?
第 i 个观测值 是第 i 次 2 小时仿真运行中所有开始接受服务的免下车顾客的平均延误;因此,根据中心极限定理可以合理地假定每个观测值 近似服从正态分布,前提是它所基于的顾客数量不太少。
观测值 在设计上就是统计独立的——即通过为每次重复独立地选择随机数种子,或通过使用互不重叠的随机数流来实现。
由式 (2) 计算的 t 统计量是一个稳健统计量——也就是说,即使 并非严格服从正态分布,它也近似服从自由度为 n − 1 的 t 分布,因而表 A.5 中的临界值可以被可靠地使用。
既然贾斯帕尔第五国民银行的模型被发现存在不足,建模者应当怎么办?经过进一步调查,建模者意识到模型中包含两条未言明的假设:
当一辆汽车到达时发现窗口正好空闲,柜台员就立即开始服务。
在有车辆等候的情况下,一次服务结束与下一次服务开始之间不存在延迟。
假定 2 被发现大致正确,因为一次服务时间被认为从柜台员实际开始服务时算起,但直到那辆汽车驶出免下车窗口、且下一辆汽车(如果有的话)开始服务、或者柜台员看到队列为空时,才认为服务结束。另一方面,假定 1 被发现是不正确的,因为柜台员还有其他职责——主要是在没有车辆排队时服务步行进店的顾客——而且柜台员总是先服务完上一位顾客,然后才开始为汽车服务。调查发现,高峰期内始终有步行进店的顾客在场;这些交易大多是商业性质的,所需时间比服务免下车顾客所需的时间长得多;并且,当一辆到达的汽车发现窗口前没有其他汽车时,它必须等到柜台员服务完当前的步行进店顾客之后才能接受服务。为纠正这一模型缺陷,模型的结构作了改变,把对柜台员时间的额外需求纳入其中,并收集了步行进店顾客的服务时间数据。对这些数据的分析发现,它们近似服从均值为 3 分钟的指数分布。
修改后的模型再次运行,所得结果见表 3。按照前面所列的步骤,再次对原假设 : 分钟进行检验。
选取 和 (样本量)。
计算 分钟, 分钟。
查表 A.5,得临界值 。计算检验统计量 由于 $ | t_{0} | < t_{0 . 025 , 5} = 2 . 571 $,不拒绝 ,从而暂时接受该模型为有效的。
除非已经估计出检验的功效(power)并发现其很高(接近 1),否则不拒绝 必须被视为一个薄弱的结论——也就是说,只能得出这样的结论:手头的数据 不足以拒绝假设 分钟。换言之,该检验没有发现样本数据 与所规定的均值 之间存在不一致。检验的功效是指:在确实存在偏离 的情况下,把这种偏离检测出来的概率。在确认的语境中,检验的功效就是检测出一个无效模型的概率。功效也可以表示为 1 减去第二类错误(即 错误)的概率,其中 to reject $ H_{0} | H_{1}$ is true) 是在模型无效时把模型接受为有效的概率。
表 3 修改后银行模型六次重复的结果
| 重复 | (到达数/小时) | (分钟) | = 平均延误(分钟) |
|---|---|---|---|
| 1 | 51 | 1.07 | 5.37 |
| 2 | 40 | 1.11 | 1.98 |
| 3 | 45.5 | 1.06 | 5.29 |
| 4 | 50.5 | 1.09 | 3.82 |
| 5 | 53 | 1.08 | 6.74 |
| 6 | 49 | 1.08 | 5.49 |
| 样本均值 | 4.78 | ||
| 标准差 | 1.66 |
要使"不拒绝 “成为一个强结论,建模者会希望 很小。现在, 取决于样本量 n,以及 与 分钟之间的真实差异,也就是取决于
其中 (单个 的总体标准差)用 S 来估计。表 A.10 和表 A.11 是典型的操作特性(operating-characteristic, OC)曲线,它们是在给定样本量 n 的条件下,第二类错误概率 随 δ 变化的图形。表 A.10 用于双侧 t 检验,表 A.11 用于单侧 t 检验。假定建模者希望:如果模型的真实平均延误 与系统中的平均延误 分钟相差 1 分钟,则以至少 0.90 的概率拒绝 (模型有效性)。于是 δ 估计为
对于 的双侧检验,使用表 A.10 得到
为了保证 (这正是建模者所期望的),表 A.10 表明约需 次独立重复——也就是说,对于样本量 并假定总体标准差为 1.66 的情形,当模型确实无效($ | E ( Y_{2} ) - \mu_{0} | = 1 $ 分钟)时,接受 (模型有效性)的概率为 ,这一概率相当高。如果 1 分钟的差异是关键的,而且建模者希望控制这样的风险——即在模型预测偏差多达 1 分钟时仍宣称模型有效——那么就需要 次重复才能达到 0.9 的功效。如果这个样本量太高,那么就必须考虑要么接受更高的 风险(更低的功效),要么考察更大的差异 δ。
一般而言,控制第二类错误(即 β 错误)的最佳办法,始终是规定一个临界差异 δ,并借助适当的 OC 曲线来选择样本量。(关于各种检验的功效计算以及 OC 曲线的使用,参见 Hines、Montgomery、Goldsman 与 Borror [2002]。)总而言之,在模型确认的语境下,第一类错误是指拒绝一个有效模型,它很容易通过规定一个很小的显著性水平 α(例如 、 或 0.01)来加以控制。第二类错误是指在模型无效时把模型接受为有效。对于固定的样本量 n,增大 α 会减小 (第二类错误的概率)。一旦 α 设定、并选定要检测的临界差异,减小 的唯一办法就是增大样本量。第二类错误是这两类错误中更为严重的一种;因此,设计仿真实验以控制接受无效模型的风险就十分重要。这两类错误汇总于表 4,该表把统计学术语与建模术语作了对照。
请注意,确认不应当被视为非此即彼的命题,而应当在图 3 所概念地展示的模型校准语境下来看。如果银行模型当前版本所给出的平均延误 估计值与真实系统行为()不够接近,就要去找出差异的来源,并根据这一新认识修订模型。这一迭代方案不断重复,直到模型精度被认为足够为止。
表 4 模型确认中的错误类型
| 统计学术语 | 建模术语 | 相关风险 |
|---|---|---|
| 第一类:当 为真时拒绝 | 拒绝一个有效模型 | |
| 第二类:当 为真时不拒绝 | 未拒绝一个无效模型 |
从哲学上说,假设检验方法试图评价仿真与真实系统在某一项或某几项输出性能度量上是否相同。另一种不同但密切相关的方法,是试图用置信区间来评价仿真与真实系统性能度量是否足够接近。
我们继续假定:既有系统有一个已知的输出性能度量,记为 ,以及仿真的一个未知性能度量 ,我们希望它与之接近。假设检验的表述检验的是 ;置信区间的表述则试图界定差异 $ | \mu - \mu_{0} |$ 的界限,看它是否 ,即差异是否小到足以使基于仿真的决策有效。ε 的取值由分析人员确定。
具体地说,如果 是仿真输出且 ,那么我们执行仿真并构造 的一个置信区间,例如 。究竟应当把模型接受为有效,还是进一步改进模型,取决于该置信区间所隐含的最好情形误差与最坏情形误差。
假定该置信区间不包含 。[参见图 6(a)。]
(a) 如果最好情形误差 ,那么即使在最好情形下,性能差异也足够大,足以表明我们需要改进该仿真模型。
(b) 如果最坏情形误差 ,那么我们可以接受该仿真模型足够接近,因而可视为有效。
(c) 如果最好情形误差 ,但最坏情形误差 ,那么就需要增加仿真重复次数,以缩小置信区间,直到能够得出结论。
假定该置信区间包含 。[参见图 6(b)。]
(a) 如果最好情形误差或最坏情形误差 ,那么就需要增加仿真重复次数,以缩小置信区间,直到能够得出结论。
(b) 如果最坏情形误差 ,那么我们可以接受该仿真模型足够接近,因而可视为有效。
在例 2 中, 分钟,而"足够接近"取为 分钟的预期顾客延误。基于表 2 中 6 次重复的一个 95% 置信区间为


图 6 输入—输出变换的确认:(a) 已知值落在置信区间之外的情形;(b) 已知值落在置信区间之内的情形。
得到的区间为 [1.65, 3.37]。如图 6(a) 所示, 落在置信区间之外。由于最好情形下 $ | 3 . 37 - 4 . 3 | = 0 . 93 < 1 $,但最坏情形下 $ | 1 . 65 - 4 . 3 | = 2 . 65 > 1 $,因此需要增加重复次数才能作出决策。
3.4 输入—输出确认:使用历史输入数据
在使用人工生成的数据作为输入数据时——正如在第 3.3 节中检验银行模型有效性时所做的那样——建模者期望模型产生的事件模式与真实系统在数据收集期间所发生的事件模式相容,但并不完全相同。因此,在银行模型中,针对到达间隔时间和服务时间生成了人工输入数据 ,并用式 (1) 所述的假设检验把输出数据 的各次重复与真实系统中所观测到的结果作比较。生成输入数据的一种替代做法,是使用实际的历史记录 来驱动仿真模型,然后把模型输出与系统数据作比较。
要在银行模型中实施这一技术,就必须把数据 和 输入到模型中的数组,或存入文件以备需要时读取。就在顾客 n 于时刻 到达之后,顾客 n + 1 就被安排在未来事件列表上,将在未来时刻 到达(不生成任何随机数)。如果顾客 n 在时刻 开始接受服务,则把一次服务完成事件安排在时刻 发生。这种不生成随机数的事件调度,在通用编程语言或大多数仿真语言中,利用数组存储数据或从文件读取数据即可相当容易地实现。
使用这一技术时,建模者希望仿真能尽可能贴近地重现真实系统中发生的重要事件。在贾斯帕尔第五国民银行的模型中,到达时刻与服务时长将完全重现那个星期五上午 11:00 至下午 1:00 期间真实系统中实际发生的情况。如果模型足够准确,那么模型所预测的顾客延误、队长、服务台利用率和顾客离开时刻都将接近真实系统中实际发生的情况。当然,所需精度水平由模型构建者和模型使用者的判断来决定。
要利用历史输入数据开展确认检验,有一点很重要:所有输入数据 和所有系统响应数据(如平均延误 )都必须采集自同一个时间区间。否则,把模型响应与系统响应作比较(例如把模型中的平均延误 与系统中的平均延误 作比较)就可能产生误导。响应 和 既取决于输入 和 ,也取决于系统(或模型)的结构。由于需要同时收集所有输入变量以及那些主要关注的响应变量的数据,对大型系统实施这一技术可能是困难的。在有些系统中,人们会使用电子计数器和装置,通过自动记录某些类型的数据来减轻数据收集的任务。下面的例子基于 Carson 等 [1981a, b] 报告的两个仿真模型,在这两个模型中,同时数据收集与随后的确认都成功完成。
例 3:糖果工厂
位于迪凯特(Decatur)的 Sweet Lil’ Things 糖果工厂的生产线由三台机器组成,分别制造、包装和装盒其著名的糖果。第一台机器(制糖机)制造并包装单粒糖果,并用输送带把它们送往包装机。第二台机器(包装机)把单粒糖果装入盒中。第三台机器(制盒机)成型纸盒,并用输送带把它们送往包装机。系统如图 7 所示。
每台机器都会因卡料和其他原因发生随机故障。这些故障导致输送带开始变空或被装满。两台制造机器与包装机之间的输送带被用作在制品库存的临时存储缓冲器。除了随机发生的故障之外,如果糖果输送带变空,包装机的运行时间就会被打断,包装机保持空闲直到生产出更多糖果为止。如果盒子输送带因为制盒机的长时间随机故障而变空,则由操作员人工把一架子盒子放到包装机上。如果某条输送带被装满,相应的那台制造机器就会变为空闲。该模型的目的是考察:随着单机与输送带长度的各种组合,那些需要人工装上一架子盒子的操作员干预,其发生频率如何变化。不同机器有不同的生产速度和故障特性,较长的输送带可以容纳更多的在制品库存。目标是在最大化产量的同时,把操作员干预维持在可接受的水平上。机器停机(无论是由输送带装满还是变空引起)都会造成产品损坏,因此这也是生产中的一个影响因素。

图 7 糖果工厂的生产线。
糖果工厂的仿真模型已经开发出来,并开展了使用历史输入的确认工作。糖果工厂的工程师们留出了上午 7:00 至上午 11:00 的 4 小时时段,用于收集一条既有生产线的数据。对每台机器——设机器为 i——收集了失效时间和停机时长 。对机器 , 是第 j 次运行时间(或失效时间), 是随后的停机时长。运行时间 可能因输送带装满或变空(视情况而定)而被打断,但在条件合适时会恢复。上午 7:00 的初始系统状况被记录下来,以便在模型中作为时刻 0 的初始状况予以复现。此外,还记录了主要的系统响应——生产水平 ,以及操作员干预的次数 和发生时刻 ——以便与模型预测作比较。
系统输入数据 和 被送入模型,用作运行时间和随机停机时间。模型的结构决定了因输送带装满或变空而发生停机的情形,也决定了操作员干预的发生。模型响应变量 被收集起来,以便与相应的系统响应变量 作比较。模型预测与系统实际表现之间的接近程度,大大帮助了工程人员说服管理层相信模型的有效性。这些结果如表 5 所示。像表 5 这样一份简单的对照表,在说服持怀疑态度的工程师和管理者相信模型有效性方面可能相当有效——也许比最精密的统计方法还要有效!
表 5 糖果工厂模型的确认
| 响应 i | 系统 | 模型 |
|---|---|---|
| 1. 生产水平 | 897,208 | 883,150 |
| 2. 操作员干预次数 | 3 | 3 |
| 3. 发生时刻 | 7:22, 8:41, 10:10 | 7:24, 8:42, 10:14 |
只有一组历史输入与输出数据时,只能得到一组仿真输出数据,因而无法进行基于汇总度量的简单统计检验。然而,如果收集了 K 组历史输入数据集,并且收集了某一系统响应变量 的 K 个观测值 ,使得输出度量 与第 j 组输入数据相对应,那么客观统计检验就成为可能。例如, 可以是在第 j 组输入数据收集期间所有接受服务的顾客的平均延误。有了这 K 组输入数据集,建模者现在把模型运行 K 次,每组输入数据运行一次,并观测到与 相对应的仿真结果 。继续以上面的例子, 就是模型为第 j 组输入数据所预测的平均延误。可供比较的数据如下表 6 所示。
表 6 相同历史输入下系统输出度量与模型输出度量的比较
| 输入数据集 | 系统输出 | 模型输出 | 观测差异 | 相对均值的平方偏差 |
|---|---|---|---|---|
| 1 | ||||
| 2 | ||||
| 3 | ||||
| . | . | . | . | . |
| . | . | . | . | . |
| . | . | . | . | . |
| K | ||||
如果这 K 组输入数据集是相当同质的,那么有理由认为 K 个观测差异 是同分布的。而且,如果这 K 组输入数据的收集在时间上是分开的——比如在不同日子——那么有理由认为 K 个差异 是统计独立的,因而这 K 个差异构成一个随机样本。在许多情形下,每个 和 都是对顾客的样本平均,因此(由中心极限定理)差异 近似服从均值为 、方差为 的正态分布。适当的统计检验于是就是针对"无均值差异"这一原假设的 t 检验:
以及备择假设"存在显著差异”:
恰当的检验是配对 t 检验( 与 配对,两者都由第一组输入数据产生,依此类推)。首先,用表 6 给出的公式计算样本平均差异 d¯ 和样本方差 。然后按下式计算 t 统计量
(其中 ,并从表 A.5 查得临界值 ,其中 α 是预先规定的显著性水平, 是自由度数目。若 $ | t_{0} | > t_{\alpha / 2 , K - 1} $,则拒绝"无均值差异"的假设 ,并得出模型不充分的结论。若 $ | t_{0} | \leq t_{\alpha / 2 , K - 1}$,则不拒绝 ,从而得出结论:该检验没有提供模型不充分的证据。
Sweet Lil’ Things 糖果工厂的工程师们决定扩展例 3 所报告的初步确认工作。他们安装了电子装置,用以自动监测其中一条生产线,并以 K = 5 组输入数据重复了例 3 的确认工作。系统与模型以生产水平为基准作比较,结果如表 7 所示。
进行了配对 t 检验以检验 ,等价地即检验 ,其中 是系统生产水平, 是仿真模型所预测的生产水平。取显著性水平 。利用表 7 中的结果,由式 (4) 给出检验统计量
由表 A.5,临界值为 。由于 $ | t_{0} | = 1 . 37 < t_{0 . 025 , 4} = $2.78,不能基于这一检验拒绝原假设——也就是说,就平均生产水平而言,系统响应与模型预测之间未发现不一致。如果 被拒绝,那么建模者就会本着图 3 的精神去寻找差异的原因并修订模型。
表 7 糖果工厂模型的确认(续)
| 输入数据集 j | 系统产量 | 模型产量 | 观测差异 | 相对均值的平方偏差 |
|---|---|---|---|---|
| 1 | 897,208 | 883,150 | 14,058 | |
| 2 | 629,126 | 630,550 | -1,424 | |
| 3 | 735,229 | 741,420 | -6,191 | |
| 4 | 797,263 | 788,230 | 9,033 | |
| 5 | 825,430 | 814,190 | 11,240 | |
3.5 输入—输出确认:使用图灵检验
除统计检验之外,或者在难以直接套用统计检验的情形下,还可以利用熟悉系统行为的人员来比较模型输出与系统输出。例如,假定准备了 5 份关于系统性能的报告(分别对应 5 个不同的日子),并用仿真输出数据生成 5 份"伪造"报告。这 10 份报告的格式应当完全相同,并且应当包含管理者和工程师此前在系统上见过的信息类型。这 10 份报告被随机打乱后交给那位工程师,请他判断哪些报告是伪造的、哪些是真实的。如果这位工程师识别出了相当数量的伪造报告,模型构建者就要向工程师询问情况,并利用所获得的信息改进模型。如果工程师无法有一致地区分出伪造报告与真实报告,建模者就会得出结论:该检验没有提供模型不充分的证据。关于进一步的讨论以及在一个真实仿真中的应用,读者可参阅 Schruben [1980]。这类确认检验通常称为图灵检验(Turing test)。随着模型开发的推进加以运用,它可以是发现模型缺陷、乃至在模型得到改进和精炼之后提高模型可信度的一件有价值的工具。
4 小结
仿真模型的确认极为重要。决策是基于仿真结果作出的,因此,这些结果的准确性应当成为质疑与考察的对象。
仿真在表面上常常显得很逼真,因为仿真模型与解析模型不同,它可以纳入关于真实系统的任何精细程度。为避免被这种表面逼真性所"迷惑",最好的做法是把系统数据与模型数据作比较,并且尽可能采用多种多样的技术(包括客观统计检验)来进行这种比较。
如 Van Horn [1969, 1971] 所讨论的,某些可供选用的确认技术,按成本—收益比递增的顺序排列如下:
通过向熟悉系统行为的人员咨询模型结构、模型输入和模型输出,开发具有高表面效度的模型。要利用一切已有的知识形式,包括以往的研究与调查、观察和经验。
对输入数据进行简单的统计检验,检验其同质性、随机性以及对所假定分布形式的拟合优度。
进行图灵检验。让熟悉情况的人员(工程师、管理者)比较模型输出与系统输出,力图发现其中的差别。
用统计检验把模型输出与系统输出作比较。
模型开发完成之后,收集新的系统数据,并重复第 2 至第 4 项技术。
按照仿真结果建造新系统(或重新设计旧系统),收集新系统的数据,并用这些数据来确认模型(若只采用这一项技术,则不推荐)。
几乎或完全不做确认。不经确认即实施仿真结果。(不推荐。)
对每一个所开发的模型而言,要把所有可能的确认技术都用上,通常都太困难、太昂贵或太耗时。从建模者的任务来看,选择那些最为合适的确认技术——既保证模型精度,又提升模型可信度——是一项重要的工作。
参考文献
BALCI, O. [1994], “Validation, Verification and Testing Techniques throughout the Life Cycle of a Simulation Study,” Annals of Operations Research, Vol. 53, pp. 121–174.
BALCI, O. [1998], “Verification, Validation, and Testing,” in Handbook of Simulation, J. Banks, ed., John Wiley, New York.
BALCI, O. [2003], “Verification, Validation, and Certification of Modeling and Simulation Applications,” in Proceedings of the 2003 Winter Simulation Conference, S. Chick, P. J. Sánchez, D. Ferrin, and D. J. Morrice, eds., New Orleans, LA, Dec. 7–10, pp. 150–158.
BALCI, O., AND R. G. SARGENT [1982a], “Some Examples of Simulation Model Validation Using Hypothesis Testing,” in Proceedings of the 1982 Winter Simulation Conference, H. J. Highland, Y. W. Chao, and O. S. Madrigal, eds., San Diego, CA, Dec. 6–8, pp. 620–629.
BALCI, O., AND R. G. SARGENT [1982b], “Validation of Multivariate Response Models Using Hotelling’s Two-Sample T^2 Test,” Simulation, Vol. 39, No. 6, pp. 185–192.
BALCI, O., AND R. G. SARGENT [1984a], “Validation of Simulation Models via Simultaneous Confidence Intervals,” American Journal of Mathematical Management Sciences, Vol. 4, Nos. 3 & 4, pp. 375–406.
BALCI, O., AND R. G. SARGENT [1984b], “A Bibliography on the Credibility Assessment and Validation of Simulation and Mathematical Models,” Simuletter, Vol. 15, No. 3, pp. 15–27.
BORTSCHELLER, B. J., AND E. T. SAULNIER [1992], “Model Reusability in a Graphical Simulation Package,” in Proceedings of the 24th Winter Simulation Conference, J. J. Swain, D. Goldsman, R. C. Crain, and J. R. Wilson, eds., Arlington, VA, Dec. 13–16, pp. 764–772.
CARSON, J. S. [1986], “Convincing Users of Model’s Validity is Challenging Aspect of Modeler’s Job,” Industrial Engineering, June, pp. 76–85.
CARSON, J. S. [2002], “Model Verification and Validation,” in Proceedings of the 34th Winter Simulation Conference, E. Yücesan, C.-H. Chen, J. L. Snowdon, and J. M. Charnes, eds., San Diego, Dec. 8–11, pp. 52–58.
CARSON, J. S., N. WILSON, D. CARROLL, AND C. H. WYSOWSKI [1981a], “A Discrete Simulation Model of a Cigarette Fabrication Process,” Proceedings of the Twelfth Modeling and Simulation Conference, University of Pittsburgh, PA, Apr. 30–May 1, pp. 683–689.
CARSON, J. S., N. WILSON, D. CARROLL, AND C. H. WYSOWSKI [1981b], “Simulation of a Filter Rod Manufacturing Process,” Proceedings of the 1981 Winter Simulation Conference, T. I. Oren, C. M. Delfosse, and C. M. Shub, eds., Atlanta, GA, Dec. 9–11, pp. 535–541.
GAFARIAN, A. V., AND J. E. WALSH [1970], “Methods for Statistical Validation of a Simulation Model of Freeway Traffic near an On-Ramp,” Transportation Research, Vol. 4, pp. 379–384.
GASS, S. I. [1983], “Decision-Aiding Models: Validation, Assessment, and Related Issues for Policy Analysis,” Operations Research, Vol. 31, No. 4, pp. 601–663.
HINES, W. W., D. C. MONTGOMERY, D. M. GOLDSMAN, AND C. M. BORROR [2002], Probability and Statistics in Engineering, 4th ed., Wiley, New York.
KLEIJNEN, J. P. C. [1987], Statistical Tools for Simulation Practitioners, Marcel Dekker, New York.
KLEIJNEN, J. P. C. [1993], “Simulation and Optimization in Production Planning: A Case Study,” Decision Support Systems, Vol. 9, pp. 269–280.
KLEIJNEN, J. P. C. [1995], “Theory and Methodology: Verification and Validation of Simulation Models,” European Journal of Operational Research, Vol. 82, No. 1, pp. 145–162.
LAW, A. M., AND W. D. KELTON [2000], Simulation Modeling and Analysis, 3d ed., McGraw-Hill, New York.
NAYLOR, T. H., AND J. M. FINGER [1967], “Verification of Computer Simulation Models,” Management Science, Vol. 2, pp. B92–B101.
OREN, T. [1981], “Concepts and Criteria to Assess Acceptability of Simulation Studies: A Frame of Reference,” Communications of the Association for Computing Machinery, Vol. 24, No. 4, pp. 180–189.
SARGENT, R. G. [2003], “Verification and Validation of Simulation Models,” in Proceedings of the 2003 Winter Simulation Conference, S. Chick, P. J. Sánchez, D. Ferrin, and D. J. Morrice, eds., New Orleans, LA, Dec. 7–10, pp. 37–48.
SCHECTER, M., AND R. C. LUCAS [1980], “Validating a Large Scale Simulation Model of Wilderness Recreation Travel,” Interfaces, Vol. 10, pp. 11–18.
SCHRUBEN, L. W. [1980], “Establishing the Credibility of Simulations,” Simulation, Vol. 34, pp. 101–105.
SHANNON, R. E. [1975], Systems Simulation: The Art and Science, Prentice-Hall, Englewood Cliffs, NJ.
VAN HORN, R. L. [1969], “Validation,” in The Design of Computer Simulation Experiments, T. H. Naylor, ed., pp. 232–235, Duke University Press, Durham, NC.
VAN HORN, R. L. [1971], “Validation of Simulation Results,” Management Science, Vol. 17, pp. 247–258.
YOUNGBLOOD, S. M. [1993], “Literature Review and Commentary on the Verification, Validation and Accreditation of Models,” in Proceedings of the 1993 Summer Computer Simulation Conference, J. Schoen, ed., Boston, MA, July 19–21, pp. 10–17.
习题
开发了一个作业车间(job shop)的仿真模型,用以研究不同的调度规则。为了确认该模型,把当前使用的调度规则并入模型,并把所得输出与观测到的系统行为作比较。通过查阅上一年的数据库记录,估计在某一天车间内的平均在制品(作业)数为 22.5。对模型作了 7 次独立重复,每次持续 30 天,车间内平均作业数的结果如下:
18.9 22.0 19.4 22.1 19.8 21.9 20.2
(a) 设计并实施一项统计检验,用以评价模型输出是否与系统行为一致。采用显著性水平 。
(b) 若把 2 个作业的差异视为关键差异,该检验的功效是多少?需要多大的样本量才能保证功效达到 0.8 或更高?(采用 。)
习题 1 中作业车间的系统数据表明,一个作业在车间内所花费的平均时间约为 4 个工作日。模型在 7 次独立重复中对车间内平均停留时间给出了如下预测:
3.70 4.21 4.35 4.13 3.83 4.32 4.05
(a) 模型输出与系统行为是否一致?采用显著性水平 进行统计检验。
(b) 如果检出 0.5 天的差异是重要的,则需要多大的样本量才能达到 0.90 的功效?请就模型的有效或无效来解释你的结果。(采用 。)
对于习题 1 的作业车间,在四个不同的 10 天时段内收集了四组输入数据,同时收集了每个时段车间内的平均作业数 。这些输入数据被用来驱动仿真模型,作四次各 10 天的运行,并收集到车间内平均作业数的模型预测值 ,结果如下:
| i | 1 | 2 | 3 | 4 |
|---|---|---|---|---|
| 21.7 | 19.2 | 22.8 | 19.4 | |
| 24.6 | 21.1 | 19.7 | 24.9 |
(a) 进行一项统计检验,以核查系统输出与模型输出的一致性。采用显著性水平 。
(b) 若把 2 个作业的差异视为值得检出的重要差异,为保证在差异确实存在时至少有 0.80 的概率把它检出,需要多大的样本量?(采用 α = 0.05。)
获取参考文献中至少两篇论述确认与验证的论文或报告。写一篇短文,比较和对照关于验证与确认这一主题的各种理念与方法。
在文献中查找若干作者讨论了其模型确认的实际仿真实例。所给出的细节是否足以判断确认工作的充分性?如果是,请把所报告的确认工作与本章所提出的判据作比较。作者是否使用了本章未讨论的确认技术?[提示:关于仿真应用文章的若干潜在来源包括 Interfaces 和 Simulation 两刊,以及 www.informs-cs.org 上的冬季仿真会议论文集。]
比较和对照各种仿真软件包在帮助建模者完成调试与验证这一往往相当艰巨的任务方面的能力。[提示:讨论仿真软件包性质的论文可在 www.informs-cs.org 上的冬季仿真会议论文集中找到。]
(a) 把仿真中的确认与物理科学中理论的确认作比较。
(b) 比较物理系统模型的确认与社会系统模型的确认各自涉及的问题和可用的技术。
(c) 对照在确认一个使用叉车和其他人工操作车辆的仓库模型时,与确认一个配备自动导引车、输送带和自动存取系统的设施模型时,各自面临的困难并比较其技术。
(d) 对一个涉及大量人工作业和人工决策的生产系统模型,与该生产系统在实现自动化之后的模型,重复 (c)。
使用置信区间方法,利用表 3 中的输出数据评价例 2 中修改后银行模型的有效性。
11 绝对性能估计
输出分析(output analysis)是对仿真所生成数据的考察。其目的要么是预测某一系统的性能,要么是比较两个或多个备选系统设计的性能。本章讨论绝对性能(absolute performance)的估计,所谓绝对性能是指估计一个或多个系统性能度量的取值,而不是对两个或多个系统作比较——换言之,不是相对性能(relative performance)。
之所以需要统计输出分析,是基于如下观察:当使用随机数发生器生成输入变量的取值时,仿真的输出数据会表现出随机变异性——也就是说,两条不同的随机数流或随机数序列会产生两组输出,而这两组输出(很可能)彼此不同。如果用参数 来度量系统的性能,那么一组仿真实验的结果将是 θ 的一个估计量 。估计量 的精度可以用 的标准误来度量,也可以用 θ 的置信区间(confidence interval)的宽度来度量。统计分析的目的,要么是估计这一标准误或置信区间,要么是弄清楚需要多少次观察才能获得给定大小的标准误或置信区间——或者两者兼而有之。
考虑一个典型的输出变量 Y,即某库存系统每周的总成本;Y 应当被视为一个分布未知的随机变量。一段长度为 1 周的仿真运行,提供了对 Y 的所有可能观察值所构成总体的一次单样本观察。通过延长运行长度,样本量可以增加到 n 个观察值 , 这对应于 n 周的运行长度。然而,这些观察值并不构成经典意义上的随机样本,因为它们在统计上并不独立。在本例中,一周结束时的在手库存就是下一周开始时的在手库存,因此 的取值会对 的取值产生某种影响。于是,随机变量序列 可能是自相关的(autocorrelated,即与自身相关)。这种自相关是统计独立性缺失的一种度量,它意味着以独立性为前提的经典统计方法不能直接用于这些输出数据的分析。必须对这些方法作恰当的修正,并且必须对仿真实验作恰当的设计,才能作出有效的推断。
除了大多数仿真输出数据中存在的自相关之外,在时间 0 对系统初始条件的规定也会给仿真分析人员带来问题,并可能影响输出数据。所谓"时间 ",指的是仿真运行起点所代表的任一时刻。例如,时间 0(星期一早晨)的在手库存量和缺货(backorder)数量很可能会影响 的取值,即第 1 周的总成本。由于自相关的存在,这些初始条件也会影响随后各周的成本 。若初始条件选择不当,就会对仿真模型稳态(steady-state,即长期运行)性能的估计产生影响。就统计分析而言,初始条件的影响表现在:输出观察值可能不是同分布的,并且初始的若干观察值可能不能代表系统的稳态行为。
第 1 节区分两类仿真——暂态(transient)仿真与稳态(steady-state)仿真——并就每一类仿真定义常用的系统性能度量。第 2 节用例子说明随机(即概率性)离散事件仿真中固有的变异性,从而说明对输出作统计分析的必要性。第 3 节讨论性能度量的统计估计。第 4 节讨论终止型仿真的分析,第 5 节讨论稳态仿真的分析。为支持本章的计算,www.bcnn.net 上提供了一个名为 SimulationTools.xls 的电子表格。SimulationTools.xls 是一个菜单驱动的应用程序,允许用户粘贴自己的数据——由任意仿真应用所生成的——并对其执行统计分析。书籍网站上也提供了详细的用户指南,且 SimulationTools.xls 带有集成的帮助功能。
1 按输出分析划分的仿真类型
在分析仿真输出数据时,要区分终止型(terminating)或暂态仿真与稳态仿真。
终止型仿真(terminating simulation)是这样一种仿真:它运行一段持续时间 ,其中 E 是使仿真停止的指定事件(或事件集)。这样被仿真的系统在时间 0 于明确规定的初始条件下"开门营业",并在停止时刻 “关门歇业”。下面四个例子都是终止型仿真。
例 1
Shady Grove 银行于上午 8:30(时间 0)开门,此时没有顾客在场,11 名柜员中有 8 名在工作(初始条件),并于下午 4:30(时间 分钟)关门。这里,事件 E 仅仅是银行已经营业 480 分钟这一事实。仿真分析人员希望对顾客与柜员之间在整个营业日内的交互作用建模,包括开门启动和临近下班收尾的影响。
例 2
考虑例 1 中的 Shady Grove 银行,但只关注上午 11:30(时间 0)到下午 1:30 这一特别繁忙的时段。仿真运行长度为 分钟。时间 0(上午 11:30)的初始条件基本上可以用两种方式来规定:(a) 在若干不同日子的上午 11:30 观察真实系统,估计(上午 11:30 时)系统中顾客人数的分布,然后利用这些数据在时间 0 为仿真模型装入顾客;或者 (b) 从上午 8:30 到上午 11:30 对模型进行仿真而不收集输出统计量,并把上午 11:30 的结束条件用作上午 11:30 至下午 1:30 仿真的初始条件。
例 3
某通信系统由若干部件以及若干备份部件组成,其示意图见图 1。考虑该系统在一段时间 , 之内、直到系统失效为止的运行情况。停止事件 E 定义为 失效,或 D 失效,或(B 与 C 二者均失效)。初始条件是:所有部件在时间 0 都是新的。

图 1 通信系统示例。
注意,在例 1 的银行模型中,停止时刻 分钟是已知的;但在例 3 中,停止时刻 一般是事先无法预测的。事实上, 很可能就是人们所关注的输出变量,因为它代表了直到系统崩溃为止的总时间。该仿真的一个目标可能是估计 , 即系统失效前的平均时间。
例 4
某制造过程从星期一早晨一直连续运行到星期六早晨。每个工作周的第一个班次用来向库存缓冲区和化学罐中装入生产最终产品所需的组分和催化剂。除星期五夜间的最后一个班次用于清理和维护之外,这些组分和催化剂在一周当中被持续不断地生产出来。因此,到一周结束时,大多数库存缓冲区都接近于空。在星期一的第一个班次,会建立起缓冲库存,以防过程中某个环节发生故障。现在希望对该系统在第一班次(时间 0 到时间 小时)内的运行作仿真,以研究装载库存缓冲区的各种调度策略。
在对一个终止型系统作仿真时,必须规定系统在时间 0 的初始条件,并且必须明确定义停止时刻 (或者等价地)停止事件 E。尽管例 1 中的 Shady Grove 银行第二天当然还会开门,但仿真分析人员选择把它当作一个终止型系统来处理,因为所关注的对象是一天的运营,包括启动与收尾。另一方面,如果仿真分析人员关心的是银行运营的另一些方面,例如资金流或自动柜员机的运行,那么该系统就可能被看作一个非终止型(nonterminating)系统。类似的说明也适用于例 3 的通信系统。如果失效的部件被更换、系统继续运行,并且最重要的是,如果仿真分析人员关心的是研究它的长期行为,那么它就可能被看作一个非终止型系统。然而在例 3 中,人们关心的是它的短期行为,即从时间 0 到首次系统失效的时刻 。因此,一个仿真是否被视为终止型,既取决于仿真研究的目标,也取决于系统本身的性质。
例 4 也是一个终止型系统。它同时还是一个暂态(transient,或非平稳 nonstationary)仿真的例子:所关注的变量是在制品库存水平,它从零或接近零(时间 0)增长到满或接近满(时间 8 小时)。
非终止型系统是指持续运行、或至少运行非常长一段时间的系统。例子包括很少停机的装配线、多种不同类型的连续生产系统、电话以及诸如互联网之类的其他通信系统、医院急诊室、警务调度与巡逻作业、消防部门,以及持续运行的计算机网络。
对一个非终止型系统所作的仿真,在仿真时间 0 于分析人员所定义的初始条件下启动,并运行分析人员指定的一段时间 。(关于这些初始条件和停止条件的规定会产生一些重大问题,这些问题我们将在后面讨论。)通常,分析人员希望研究系统的稳态即长期性质——也就是说,不受模型在时间 0 的初始条件所影响的那些性质。稳态仿真(steady-state simulation)就是以研究非终止型系统的长期或稳态行为为目标的仿真。
下面两个例子是稳态仿真。
例 5
考虑例 4 中的制造过程,但从第二个班次开始,此时完整的生产过程已经全面展开。希望估计长期的生产水平和生产效率。对于 13 个班次这一相对较长的时期,可以把它看作一次稳态仿真。为了获得足够精确的生产效率估计值以及其他响应变量的估计值,分析人员可以决定仿真任意长的时间 (甚至长于 13 个班次)。也就是说, 不是由问题的性质决定的(这与终止型仿真不同);相反,它是由分析人员设定的,是仿真实验设计中的一个参数。
例 6
HAL 公司是一家大型的基于 Web 的订单处理公司,在世界各地拥有众多客户。因此,它那由许多服务器、工作站和外设组成的大型计算机系统每天 24 小时持续运行。为了应对增加的工作负载,HAL 正在考虑以各种配置增加 CPU、内存和存储设备。尽管 HAL 计算机上的负载在一天当中不断变化,管理层希望系统能够承受持续出现的峰值负载期。此外,HAL 的业务发生任何实质性变化的时间框架是未知的,因此不存在固定的规划期。于是,在峰值负载条件下作稳态仿真是恰当的。HAL 的系统人员针对现有系统在当前峰值工作负载下建立了一个仿真模型,然后探索扩容的若干可能方案。HAL 关心的是每台计算机的长期平均吞吐量和利用率。停止时刻 不是由问题的性质决定的,而是由仿真分析人员决定的,要么是任意选定的,要么是心中带着某种统计精度来选定的。
2 输出数据的随机性质
考虑仿真模型在一段时间 T_{E} ]$ 上的一次运行。由于模型是一个输入—输出变换,并且由于模型的某些输入变量是随机变量,因此模型的输出变量也是随机变量。下面给出两个例子,用以说明随机仿真的输出数据的性质,并对这些数据的若干重要性状作初步讨论。如果初次阅读时其中某些性状和相关术语还不十分清楚,也不必担心;本章后面会仔细加以解释。
例 7:Software Made Personal
Software Made Personal(SMP)公司在两个领域为客户定制软件产品:财务跟踪和联系人管理。他们设有一个客户支持呼叫中心,在东部时间上午 8 点到下午 4 点之间处理其软件用户提出的问题。客户来电后,使用一个自动系统在两条产品线中进行选择。每条产品线都有自己的话务员,如果有合适的话务员空闲,来电就被立即转接给该话务员;否则,来电者被放入等待(hold)队列。SMP 希望通过对话务员作交叉培训,使他们能够接听任意产品线的来电,从而减少所需话务员的总数。预计这会使处理一次来电的时间增加约 10%。不过,在考虑裁减话务员之前,SMP 想知道:如果只是对现有话务员作交叉培训,其服务质量会如何。利用历史数据,来话被建模为一个非平稳泊松到达过程,并且已为话务员解答问题的时间拟合了分布。他们的服务质量度量是来电者响应时间(response time,从发起呼叫到与话务员通话的时间)以及等待中的来电者人数。超过 30 秒的响应时间差异才是重要的。
这显然是一个终止型仿真实验,时间 0 对应上午 8 点, 对应下午 4 点(另一种终止仿真的方式是:等到下午 4 点之前到达的最后一个呼叫结束时终止,此时 是一个随机值)。表 1 给出了 SMP 仿真 4 次重复实验的结果;每一行给出在一次仿真的 8 小时工作日中,来电者等待的平均分钟数以及等待的平均来电者人数。
表 1 SMP 呼叫中心四次独立重复实验的结果
| 重复实验 r | 平均等待时间 (分钟) | 平均等待人数 (人) |
|---|---|---|
| 1 | 0.88 | 0.68 |
| 2 | 5.04 | 4.18 |
| 3 | 4.13 | 3.26 |
| 4 | 0.52 | 0.34 |
该表说明,这些平均值在不同日之间存在着显著变异,这意味着可能需要相当多次的重复实验,才能精确地估计诸如均值 和 。即便重复实验次数很多,仍然会存在一定的估计误差,这正是我们不仅要报告一个单一数值(点估计),还要以置信区间或标准误的形式报告其误差度量的原因。
这些问题在第 4 节中针对例 7 这类终止型仿真加以讨论。可以使用经典统计方法,因为 和 构成一个随机样本——也就是说,它们是独立同分布的。此外, 就是待估计的参数,因此每个 都是真实平均等待时间 的无偏估计。例 7 的分析放在第 4 节的例 10 中讨论。适用于终止型仿真的统计方法综述由 Law [1980] 给出。更多的指导可见 Alexopoulos 与 Seila [1998]、Kleijnen [1987]、Law [2007] 以及 Nelson [2001]。
下一个例子说明相关性与初始条件对系统长期平均性能度量估计的影响。
例 8
半导体晶圆制造是一个极其昂贵的过程,涉及数亿美元的加工设备、物料搬运和人力资源。FastChip 公司希望用仿真来设计一座新的"晶圆厂"(fab),方法是评估在两种不同产品(称为 C 芯片和 D 芯片)的某种特定投料下所能期望的稳态平均周期时间(cycle time,从晶圆投料到完工的时间)。晶圆制造过程由扩散和光刻两个基本步骤组成,每一步又包含许多子步骤,并且制造过程需要多轮次地经历这些步骤。产品以片盒(cassette)为单位、按每小时 1 个片盒的速率投料,每周 7 天、每天 24 小时,以达到每小时 1 个片盒的期望吞吐量。希望当前设计能使 C 芯片的长期平均周期时间小于 45 小时,D 芯片小于 30 小时。
图 2 给出了该晶圆厂仿真模型一次运行所得到的前 30 个 C 芯片周期时间。目标是估计长期平均周期时间,从概念上讲,就是所生产片盒数趋于无穷时的平均周期时间。注意,最初几个周期时间看起来低于其后的那些;出现这种情况,是因为仿真启动时晶圆厂处于"空且空闲"(empty and idle)状态,而这并不代表长期或稳态条件。还要注意,当出现一个较低的周期时间(比如 40 小时左右)时,其后往往跟着几个额外的低周期时间。因此,相继片盒的周期时间可能是相关的。这些特征表明,周期时间数据不是一个随机样本,因此经典统计方法可能并不适用。例 8 的分析放在第 5 节讨论。

图 2 一次仿真运行的前 30 个 C 芯片周期时间。
3 绝对性能度量及其估计
考虑对被仿真系统的某个性能参数 θ(或 φ)的估计。希望得到 θ(或 φ)的点估计和区间估计。区间估计的长度是点估计误差的一种度量。用于估计 的仿真输出数据具有 的形式,我们把这类输出数据称为离散时间数据(discrete-time data),因为指标 n 取离散值。用于估计 φ 的仿真输出数据具有 的形式,我们把这类输出数据称为连续时间数据(continuous-time data),因为指标 t 取连续值。例如, 可以是顾客 i 的延误,或第 周的总成本; 可以是时刻 t 的队长,或时刻 t 的欠交订单数。参数 是一个普通均值(ordinary mean); 则被称为时间加权均值(time-weighted mean)。我们把性能参数称作 还是 其实无关紧要;这里使用两个不同的符号,只是为了区分普通均值与时间加权均值。为了使讨论更具体,我们考虑排队系统的输出度量。
3.1 点估计
基于数据 的 θ 的点估计量定义为
其中 是基于样本量为 n 的样本的样本均值。计算机仿真语言可能称之为"离散时间"(discrete-time)、“收集”(collect)、“计数”(tally)或"观察"(observational)统计量。
称点估计量 θ 对 θ 是无偏的(unbiased),如果它的期望值等于 即如果
然而一般地,
并且 称为点估计量 中的偏差(bias)。我们希望估计量是无偏的,如果做不到这一点,则希望相对于 θ 的量级而言偏差较小。形如式 (1) 的估计量的例子包括 与 ,其表达式为 和 ,当 时成立,此时 是顾客 i 在(子)系统中度过的那段时间。基于数据 、其中 为仿真运行长度的 φ 的点估计量定义为
并称为 在 上的时间平均。仿真语言可能称之为"连续时间"(continuous-time)、“离散变化”(discrete-change)或"时间持续"(time-persistent)统计量。一般地,
并且称 对 φ 是有偏的。同样,我们希望得到无偏估计量或低偏差估计量。时间平均的例子包括式 (当 时)中的 和式 (当 时)中的 ,以及式 (11.4) 中的 。
一般地,θ 和 φ 被视为被仿真系统的均值类性能度量。其他度量通常也可以纳入这一共同框架。例如,考虑估计因缺货而损失销售的天数所占的比例。在仿真中,令
当 n 等于总天数时,由式 (1) 所定义的 就是 即缺货天数比例的点估计量。第二个例子,考虑估计队长大于 10 名顾客的时间所占的比例。如果 表示仿真中时刻 的队长,那么(在仿真中)定义
于是由式 (4) 所定义的 就是 , 即队长大于 10 名顾客的时间比例的点估计量。因此,比例或概率的估计是均值估计的一个特例。
有一类性能度量不属于这一共同框架,那就是分位数(quantile)或百分位数(percentile)。分位数描述的是能够以给定概率 交付的性能水平。例如,设 Y 表示服务系统中顾客所经历的排队延误,以分钟计。那么 Y 的 分位数就是满足下式的 θ 值:
用百分比表示, 就是顾客延误的第 100p 百分位数,即第 85 百分位数。因此,85% 的顾客将经历不超过 θ 分钟的延误。换一种说法,一位顾客经历超过 θ 分钟延误的概率只有 0.15。一种被广泛使用的性能度量是中位数(median),即 0.5 分位数或第 50 百分位数。
分位数估计问题是比例或概率估计问题的逆问题。在估计比例时,给定 θ 而要估计概率 ;然而在估计分位数时,给定 而要估计 θ。
估计分位数最直观的方法是:作出 Y 的观察值的直方图,然后找出一个值 , 使得直方图的 100p% 位于 的左侧(即小于它)。例如,如果我们观察 个顾客延误 -, 那么延误的第 85 百分位数的一个估计值就是这样一个 :使得 个观察值小于或等于 - 因此,一个显然的估计是令 等于样本中第 213 小的值(这需要对数据排序)。当输出是一个连续时间过程时,例如队长过程 ,直方图给出该过程在每一个可能水平(本例中即队长)上所度过的时间比例。不过,分位数估计的方法保持不变:找出一个值 , 使得直方图的 100p% 位于 的左侧。
3.2 置信区间估计
要充分理解置信区间,重要的是理解误差度量与风险度量之间的区别。弄清这一区别的一种方法,是把置信区间与预测区间(prediction interval,另一种有用的输出分析工具)加以对照。
置信区间与预测区间都以如下前提为基础:仿真所产生的数据能够用一个概率模型很好地表示。假设该模型是均值为 θ、方差为 的正态分布,两者均未知。为使例子具体化,令 为第 i 次重复实验(代表一个生产日)中所生产零件的平均周期时间。于是, 是 的数学期望,而 σ 表示平均周期时间的日间变异。
假设我们的目标是估计 θ。如果我们打算长期经营,日复一日地生产零件,那么 就是一个有意义的参数,因为它是长期的日平均周期时间。我们的平均周期时间会随日子不同而变化,但从长期看,这些平均值的平均值会接近 θ。
θ 的自然估计量是 n 次独立重复实验的总样本均值 。但 并不等于 θ,它是一个基于样本的估计,并且带有误差。置信区间就是这一误差的度量。令
为 R 次重复实验之间的样本方差。假定 服从正态分布的通常置信区间为
其中 是自由度为 的 t 分布的分位数,它使得每个尾部截去 的面积。(见附录表 A.5。)我们无法确切知道 距离 θ 到底有多远,但置信区间试图为这一误差定界。遗憾的是,置信区间本身也可能是错的。诸如 95% 这样的置信水平告诉我们,该区间真正为 Y¯ 与 θ 之间的误差定界的把握有多大。我们作的重复实验越多, 中的误差就越小,而我们的置信区间也反映了这一点,因为 会随着 n 的增大而变小,并在 n 趋于无穷时收敛到 0。
现在假设我们需要对某一天的平均周期时间作出承诺。一个好的猜测值是我们的估计量 , 但它不太可能恰好正确。即便是 θ 本身——分布的中心——也不太可能恰好是某一天的实际平均周期时间,因为日平均周期时间是变动的。而预测区间则被设计得足够宽,能够以很高的概率包含任意某一天的实际平均周期时间。
基于正态理论的预测区间为
该区间的长度不会随着 n 的增大而趋于 0。事实上,在极限情形下它变为
这反映了如下事实:无论我们仿真多少次,我们的日平均周期时间仍然是变动的。
总之,预测区间是风险的度量,而置信区间是误差的度量。我们可以通过作越来越多的重复实验来"仿真掉"误差,但我们永远无法"仿真掉"风险,因为风险是系统所固有的。不过,我们确实可以通过作更多次重复实验来更好地评估风险。
例 9
假设某制造仿真在 120 次重复实验上所得的平均周期时间的总平均为 5.80 小时,样本标准差为 1.60 小时。由于 , 长期期望日平均周期时间的 95% 置信区间为 ,即 小时。因此,我们对日平均周期时间的长期平均值的最佳猜测是 5.80 小时,但这一估计中可能有多达 0.29 小时的误差。
对任意某一天,我们有 95% 的把握认为当天生产的所有零件的平均周期时间将为
即 小时。3.18 小时反映了日平均周期时间中固有的变异性,以及这样一个事实:我们希望以 95% 的把握覆盖某一天的实际平均周期时间,而不仅仅是覆盖长期平均值。
一点告诫:无论在哪一种情形下(预测区间还是置信区间),我们都不能对单个产品的周期时间作出论断,因为我们观察的是日平均值。要对单个产品的周期时间作出有效的论断,分析必须以单个周期时间为基础。
4 终止型仿真的输出分析
考虑在仿真时间区间 上运行、并产生观察值 的一次终止型仿真。样本量 n 可以是一个固定的数,也可以是一个随机变量(例如,在时间 内发生的观察次数)。仿真中的一个常见目标是估计
当输出数据具有 的形式时,目标是估计
两种情形下所使用的方法都是独立重复实验(independent replications)法。仿真被重复共 R 次,每次运行使用不同的随机数流和独立选择的初始条件(这也包括所有运行具有相同初始条件的情形)。下面我们就来讨论这一问题。
4.1 统计背景
仿真输出分析中最令人困惑的方面,大概就是区分重复实验内(within-replication)数据与重复实验间(across-replication)数据,并理解各自的性质与用途。而仿真语言往往只提供汇总度量——如样本均值、样本方差和置信区间——而不是全部原始数据,这一事实会使问题更加混乱。有时候,这些汇总度量就是仿真语言所能提供的全部,除非额外做大量工作。
为说明关键思想,设想对一个制造系统作仿真,并考虑该系统的两个性能度量:零件的周期时间(从投料进入工厂到完工的时间)和在制品(WIP,任一时刻工厂中零件的总数)。在计算机应用中,这两个度量可以对应于响应时间和 CPU 处任务队列的长度;在服务应用中,它们可以是满足一位顾客请求所需的时间和"待办"清单上的请求数;在供应链应用中,它们可以是订单履行时间和库存水平。类似的度量出现在许多系统中。
对于周期时间这类指标,通常的设定如下:令 为第 i 次重复实验中生产的第 j 个零件的周期时间。如果每次重复实验代表两个班次的生产,那么每次重复实验中生产的零件数可能不同。表 2 以符号方式给出了 R 次重复实验的结果。
表 2 重复实验内与重复实验间的周期时间数据
| 重复实验内数据 | 重复实验间数据 | |||
|---|---|---|---|---|
重复实验间数据是通过汇总重复实验内数据而形成的:^1 是第 i 次重复实验中 个周期时间的样本均值, 是同一批数据的样本方差,而
是基于该数据集的置信区间半宽(half-width)。
由重复实验间数据,我们计算总体统计量:日平均周期时间平均值的均值
日平均周期时间平均值的样本方差
以及最后的置信区间半宽
量 是标准误,它有时被解释为 作为 θ 的估计量时的平均误差。注意, 并不是重复实验内样本方差 的平均;相反,它是重复实验内平均值 的样本方差。
表 3 重复实验内与重复实验间的在制品数据
| 重复实验内数据 | 重复实验间数据 |
|---|---|
在一次重复实验内部,在制品是一个连续时间输出,记为 。第 i 次重复实验的停止时刻 一般地可以是一个随机变量;在本例中,它是第二个班次的结束时刻。表 3 是所产生数据的一个抽象表示。
对于连续时间数据,重复实验内的样本均值与方差有相应的定义:
以及
的定义则更成问题,但为具体起见,取它为
很难设想出 派得上用场的情形,这一点我们后面再讨论。尽管对于连续时间数据,重复实验内数据的定义发生了变化,但重复实验间的统计量并不改变,这是一个关键性的观察。
以下是必须理解的几个要点:
总样本平均 与单次重复实验的样本平均 总是期望日平均周期时间或日期望在制品数量的无偏估计量。
重复实验间数据是独立的,因为它们基于不同的随机数;是同分布的,因为我们在每次重复实验上运行同一个模型;并且往往近似服从正态分布,如果它们是重复实验内数据的平均值(此处正是如此)。这意味着置信区间 通常相当不错。
另一方面,重复实验内数据可能完全不具备这些性质。各个周期时间可能不是同分布的,如果一天当中最初几个零件到达时系统是空的;它们几乎肯定不是独立的,因为一个零件紧接着另一个零件;而且它们是否服从正态分布事先很难知道。由于这个原因,在独立同分布 数据假定下计算出来的 和 往往没有用处,尽管也有例外。
在某些情形下,Y¯ 和 是单个零件期望周期时间或任意时刻期望在制品数量的有效估计量,而不是日平均值的有效估计量。(见关于稳态仿真的第 5 节。)即便如此,置信区间 是有效的,而 却不是。困难的产生是因为 是周期时间方差的一个合理估计量,但 和 却不是 的良好估计量,关于这一点详见第 5.2 节。
例 10:Software Made Personal(续)
考虑例 7 的 SMP 呼叫中心问题,其 次重复实验的数据见表 1。四个等待人数估计值 是形如式 (11) 的时间平均,其中 -, 即时刻 t 等待的顾客数。类似地,四个平均系统时间 类似于表 2 中的 ,其中 是第 次重复实验中顾客 i 实际等待的时间。假设分析人员想要得到等待时间均值 的 95% 置信区间。利用式 (8),计算总点估计量
利用式 (9),计算其估计方差:
于是, 的标准误估计为 。由表 A.5 查得 - -3.18,并由式 (10) 计算 95% 置信区间半宽为
从而以 95% 的置信度得到 分钟。显然,4 次重复实验远远不足以对 作出任何有用的估计,因为平均等待时间为负是不可能的。本章后面我们还会回到这一问题,并确定需要多少次重复实验才能得到有意义的估计。
4.2 具有指定精度的置信区间
由式 (10),基于 t 分布的均值 θ 的 置信区间的半长 H 由下式给出:
其中 是样本方差,R 是重复实验次数。在仿真中,我们很少只是选定 R 然后就接受由此得到的置信区间半长。相反,我们可以把重复实验次数推得足够大,使 H 小到足以支持仿真本应支撑的决策。H 的可接受大小取决于手头的问题:在金融仿真中它可能是 5000 美元,对产品周期时间可能是 6 分钟,在呼叫中心可能是 1 位等待的顾客。
假设规定了一个误差准则 ,换言之,希望以 估计 θ 到 以内,且具有很高的概率——比如说至少 。于是,希望取足够大的样本量 R,使得
当样本量 R 固定时,无法对所产生的误差给出任何保证。但如果样本量可以增加,就可以规定一个误差准则(例如 、6 分钟或 1 位顾客)。
假定已经观察到规模为 次重复实验的初始样本——也就是说,仿真分析人员首先作了 次独立重复实验。必须有 ,而 10 次或更多则是较为理想的。这 次重复实验将用于获得总体方差 的一个初始估计 。为了满足半长准则,必须选择样本量 R,使得 且
就不等式 (14) 解出 R 可知,R 是满足 和
的最小整数。R 的一个初始估计由下式给出:
其中 是标准正态分布的 百分位点,取自附录表 A.3。并且由于当 R 较大时(比如 )有 ,因此在 R 较大时,关于 R 的第二个不等式是足够好的。在确定了最终样本量 R 之后,收集 个追加观察值(即再作 次追加重复实验,或者从头开始共作 R 次重复实验),并由下式构造 θ 的 置信区间:
其中 和 是依据全部 R 次重复实验计算的, 按式 (8) 计算, 按式 (9) 计算。由不等式 (17) 给出的置信区间半长应当近似等于 或更小;然而,随着追加了 个观察值,方差估计量 可能与初始估计 有某种差异,从而可能导致半长大于所期望的值。如果由不等式 (17) 得到的置信区间过大,则可以重复上述过程,利用不等式 (15) 确定一个更大的样本量。
例 11
假设希望以 95% 的置信度把例 7 中 SMP 等待队列的平均等待时间估计到 0.5 分钟以内。我们将用 SimulationTools.xls 的"获取样本量(Get Sample “工具来演示这一计算。输入对话框如图 3 所示,结果如图 4 所示。注意,“绝对精度(Absolute Precision)“是指直接指定置信区间的半宽(本例中为 0.5 分钟);“相对精度(Relative Precision)“则把半宽的长度指定为均值的某个比例。
取规模为 的初始样本,程序确定 是满足不等式 (16) 的最小整数。因此,还需要 次追加重复实验。在获得追加的输出之后,我们还需要再次计算半宽 H,以确保它小到所期望的程度。本例中的结果(也可在 www.bcnn.net 上找到)为 分钟。

图 3 SimulationTools.xls 中"获取样本量"工具的输入对话框。
| 获取样本量 | 已完成 | 数据列 | 最小样本量 | ||||
|---|---|---|---|---|---|---|---|
| 1 | 0.880897931 | 175 | |||||
| 观察值个数 | 20 | 2 | 5.04340304 | ||||
| Alpha | 0.05 | 3 | 4.132638545 | ||||
| 精度类型 | 1 | 4 | 0.517418075 | ||||
| 精度值 | 0.5 | 5 | 2.584490259 | ||||
| 6 | 0.860547939 | ||||||
| 7 | 1.544612493 | ||||||
| 8 | 1.762676832 | ||||||
| 9 | 6.925242515 | ||||||
| 10 | 2.201491896 | ||||||
| 11 | 2.915438392 | ||||||
| 12 | 0.486246064 | ||||||
| 13 | 1.792947434 | ||||||
| 14 | 1.244455641 | ||||||
| 15 | 4.278579049 | ||||||
| 16 | 13.91696167 | ||||||
| 17 | 0.235565331 | ||||||
| 18 | 0.685156864 | ||||||
| 19 | 1.577792626 | ||||||
| 20 | 1.070626537 |
图 4 用 SimulationTools.xls 中的"获取样本量"计算样本量。
4.3 分位数
为了给出分位数的区间估计量,回顾一下在均值表示比例或概率 这一特殊情形下均值的区间估计量是有帮助的。在本书中,我们选择把比例或概率当作均值的一个特例来处理。然而,在许多统计学教材中,概率是被分开处理的。
当独立重复实验的次数 大到足以使 时,概率 的置信区间通常写作
其中 是样本比例(代数推导表明,在用于估计比例时,这一半宽公式与式 (10) 完全等价)。
正如第 3 节所述,分位数估计问题是概率估计问题的逆问题:找出 θ,使得 。因此,为了估计 分位数,我们要找出这样一个值 , 使得 Y 的直方图中 100p% 的数据位于 , 的左侧,或者换一种说法,即 中第 np 小的值。把这一思想加以推广,可以找到 θ 的一个近似的 置信区间,方法是找出两个值:,它截去直方图的 %;以及 ,它截去直方图的 ,其中
(回想一下, 是已知的。)用排序后的值来表示, 是第 小的值(向下取整), 是第 小的值(向上取整),均取自 。
例 12
假设我们想要估计 SMP 等待队列中日平均等待时间的 0.75 分位数,并基于 次重复实验构造它的 95% 置信区间。数据可见 www.bcnn.net 上的电子表格 Quantile.xls。点估计量为 分钟,因为它是排序后数据的第 - 小的值。其解释是:从长期看,在 75% 的日子里,顾客平均等待时间将小于或等于 3.39 分钟。
为了得到置信区间,我们首先计算
置信区间的下界是 分钟(第 10 小的值,向下取整);置信区间的上界是 .98 分钟(第 -240 小的值,向上取整)。因此,以 95% 的置信度,3.39 分钟这一点的估计与真实的 0.75 分位数相差不超过 分钟。
重要的是要理解:3.39 分钟是日平均顾客延误的 0.75 分位数(第 75 百分位数)的估计值,而不是单个顾客延误的估计值。由于呼叫中心在一天开始时是空且空闲的,并且系统上的顾客负载在一天当中不断变化,单个顾客等待时间的 0.75 分位数在一天当中也是变化的,不可能用一个单一的数字给出。
4.4 由汇总数据估计概率与分位数
如果仿真软件所提供的全部信息只是 Y¯ 和 H,而你需要推算出达到预先指定精度所需的重复实验次数,或者你需要估计一个概率或分位数,那么了解置信区间半宽的公式就很重要。你知道重复实验的次数,因此可以利用下式由 H 提取出样本标准差:
有了这一信息,就可以采用第 4.2 节中的方法。
更困难的问题是由汇总数据估计概率或分位数。当我们手头只有样本均值和置信区间半宽(由此得到样本标准差)时,一种做法是对所要求的概率或分位数使用正态理论近似,具体地
以及
下面的例子说明如何做到这一点。
例 13
由某制造仿真的 25 次重复实验得到日平均在制品的 90% 置信区间为 218 32。日平均在制品小于 350 的概率是多少?日平均在制品的第 85 百分位数是多少?
首先,我们提取标准差:
然后,利用正态近似和表 A.3 得到
以及
用这种方式获得概率和分位数是有缺陷的。该近似在很大程度上取决于所关注的输出变量是否服从正态分布。如果输出变量本身不是一个平均值,那么这一近似就值得怀疑。因此,我们预期该近似对关于日平均周期时间的论断效果良好,但对单个零件周期时间的论断效果很差。
5 稳态仿真的输出分析
考虑仿真模型的一次运行,其目的是估计系统的一个稳态即长期特征。假设这一次运行产生观察值 ,一般地,它们是一个自相关时间序列的样本。稳态(或长期)性能度量 θ 由下式定义:
以概率 1 成立,其中 θ 的值与初始条件无关。(“以概率 ” 这一说法是指:对该模型所作的、使用不同随机数的几乎所有仿真,都会产生一个序列 . 其样本平均收敛到 θ。)例如,如果 是顾客 i 与话务员通话所花的时间,那么 θ 就是顾客与话务员通话的长期平均时间;并且由于 θ 被定义为一个极限,它不依赖于呼叫中心在时间 0 的状态。类似地,对于连续时间输出度量 ,例如呼叫中心等待队列中等待的顾客数,其稳态性能定义为
以概率 1 成立。
当然,仿真分析人员可以决定在收集了若干个(比如说 n 个)观察值之后停止仿真;也可以决定仿真一段时间长度 ,由它决定 n(不过 n 可能随运行而不同)。样本量 n(或 是一个设计选择;它并不是由问题的性质内在地决定的。仿真分析人员在选择仿真运行长度(n 或 时,头脑中会有以下几方面的考虑:
点估计量中由人为或任意的初始条件所造成的偏差。(如果运行长度太短,偏差可能很严重,但一般地它随运行长度的增加而减小。)
点估计量所期望的精度,用标准误或置信区间半宽度量。
执行仿真可用时间上的预算约束。
下一小节讨论初始化偏差,随后的几个小节概述估计点估计量变异性的两种方法。为叙述清晰,我们只讨论由离散时间输出过程估计 θ 的问题。因此,在讨论一次重复实验(或一次运行)时,将使用记号
;如果作了若干次重复实验,则第 r 次重复实验的输出数据记为
5.1 稳态仿真中的初始化偏差
有几种方法可以减小稳态仿真中因使用人为且不现实的初始条件而造成的点估计量偏差。第一种方法是把仿真初始化在一个更能代表长期条件的状态。这种方法有时称为智能初始化(intelligent initialization)。例子包括
在库存仿真中设定库存水平、缺货数量,以及已订购物品的数量及其到货日期;
在排队仿真中把顾客放入队列并置于服务之中;
在可靠性仿真中让某些部件已经发生故障或已经退化。
智能地规定初始条件至少有两种途径。如果系统确实存在,就收集关于它的数据,并用这些数据来规定更接近典型的初始条件。这种方法有时需要大量的数据收集工作。此外,如果被建模的系统并不存在——例如,它是现有系统的一个变体——那么这种方法就无法实施。尽管如此,仍建议仿真分析人员利用现有系统的任何可用数据来帮助初始化仿真,因为这通常优于假定系统在时间 0 是"完全备货”、“空且空闲"或"全新"的。
一个相关的想法是:从系统的第二个模型获得初始条件,该模型被简化到足以能用数学方法求解。排队模型对此非常有用。可以对简化后的模型求解,找出长期期望的或最可能的条件——例如队列中的期望顾客数——然后用这些条件来初始化仿真。
减小初始条件影响的第二种方法(可以与第一种方法结合使用)是:把每次仿真运行划分为两个阶段——首先是从时间 0 到时间 的初始化阶段,随后是从时间 到停止时刻 的数据收集阶段;也就是说,仿真在时间 0 于规定的初始条件 下启动,并运行一段规定的时间 。对感兴趣的响应变量的数据收集直到时间 才开始,并一直持续到时间 。 的选择相当重要,因为在时间 的系统状态(记为 )应当比时间 0 的原始初始条件 更接近稳态行为。此外,数据收集阶段的长度 应当足够长,以保证对稳态行为的估计具有足够的精度。注意,时间 时的系统状态 I 是一个随机变量;说系统已经达到近似稳态,就是说时间 时系统状态的概率分布与稳态概率分布足够接近,从而使得响应变量点估计中的偏差可以忽略不计。图 5 说明了稳态仿真运行的两个阶段。下面的例子给出了以"空且空闲"状态启动一个排队系统仿真运行所产生的影响,以及一种有助于仿真分析人员为 , 选择恰当取值的有用图形。

图 5 稳态仿真运行的初始化阶段与数据收集阶段。
例 14
考虑例 8 中所讨论的 FastChip 晶圆制造问题。假设共作了 次独立重复实验,每次运行的时间足够长,使得对 C 芯片和 D 芯片各收集到 250 个周期时间。我们将聚焦于 C 芯片。
通常,我们把每次重复实验内的所有数据加以平均,得到一个重复实验平均值。然而,我们当前阶段的目标是识别数据中由初始化偏差造成的趋势,并弄清该趋势何时消散。为此,我们将对各个相应的周期时间在重复实验之间求平均并绘图(这一思想通常归功于 Welch [1983])。这类平均值称为总体平均(ensemble average)。具体地,令 为第 r 次重复实验中按完工顺序排列的 250 个 C 芯片周期时间。对第 j 个周期时间,定义在所有 R 次重复实验上的总体平均为
(此处 R 10)。这些总体平均被绘为图 6 中的实线(虚线将在下面讨论)。该图由 SimulationTools.xls 电子表格生成,我们将称之为均值图(mean plot)。
注意开头处逐渐上升的趋势。仿真分析人员可能会怀疑,这是由于这些估计量中的向下偏差所致,而该偏差又源于晶圆厂在时间 0 处于空且空闲状态。随着时间变长(从而记录的周期时间个数增加),初始条件对后续观察值的影响减弱,观察值似乎围绕一个共同的均值上下波动。当仿真分析人员认为已经到达这一点时,数据收集阶段就开始了。这里大约 120 个 C 芯片周期时间可能就足够了。
尽管我们已经确定了 120 个周期时间这一删除量,但初始化阶段几乎总是以仿真时间 来规定的,因为我们需要针对每个性能度量分别考虑初始化阶段,而它们可能各不相同。在 FastChip 的例子中,我们还需要考察 D 芯片的周期时间。如果我们把初始化阶段规定为每个输出的计数,那么就必须跟踪这些计数。另一方面,当初始化阶段按时间规定时,则可以在时间 , 安排一个单一事件,并且只保留该时点之后的数据。
为了按时间规定 ,我们必须把相应的计数换算为近似的时间,并取其中最大的一个。例如,对于 FastChip 仿真,120 个 C 芯片周期时间大约对应 200 小时的仿真时间,因为片盒以每小时 1 个的速率投料,并且投料中 60% 是 C 芯片:120 个周期时间 / 0.6 次投料每小时 200 小时(我们也可以把它略微增大一些,以计入第 120 个 C 芯片投料穿越晶圆厂所需的时间)。结果这比 D 芯片的初始化阶段更长,于是我们设定 小时。
绘制总体平均是额外的工作(尽管 SimulationTools.xls 使之变得容易),因此人们可能会想走捷径。例如,有人可能只绘制第 1 次重复实验的输出 ,或者第 1 次重复实验的累积平均
其中 。图 7 同时给出了这两者。注意,来自单次重复实验的原始数据可能变异性过大,以致无法察觉趋势;而累积图则明显向下偏倚,因为它保留了运行开始以来的全部数据。因此,应当避免这些捷径,而改用均值图。

图 6 250 个 C 芯片周期时间在 10 次重复实验上的均值图。

图 7 来自 1 次重复实验的 250 个 C 芯片周期时间图,原始值与累积平均。
在使用均值图确定初始化阶段时,还需牢记以下几个附加因素:
在开始考察初始化阶段时,运行长度和重复实验次数都只能靠猜测。诸如(图 6 那样的)总体平均会随着重复实验次数 R 的增加而呈现出更平滑、更精确的趋势,并且可能需要多次增加 R,直到趋势变得清晰。也有可能所猜测的运行长度不足以越过初始化阶段(如果均值图中的趋势没有消失,就表明了这一点),因此运行长度可能也必须增加。
总体平均还可以通过绘制移动平均而非原始总体平均来加以平滑。在移动平均中,每个绘制点实际上是若干个相邻总体平均的平均值。具体地,第 j 个绘制点将是
其中 ,而不是原始总体平均 。m 的取值通常用试错法选定,直到得到平滑的图形为止。图 6 中的均值图是用 得到的。
由于每个总体平均(或移动平均)都是在 R 次重复实验上独立同分布观察值的样本均值,因此可以围绕每个点放置一个基于 t 分布的置信区间,如图 中的虚线所示,并可利用这些区间判断该图是否已足够精确、足以判定偏差已经消失。这是确定删除点的首选方法。
累积平均(如图 7 中那样)随着被平均的数据增多而变异性变小。因此,可以预期曲线的左侧总是比右侧更不平滑。请记住,累积平均收敛到长期性能的速度往往比总体平均更慢,因为累积平均包含了所有观察值,其中包括运行开始时偏差最大的那些。由于这个原因,只有在无法计算总体平均时才应使用累积平均,例如当只能作一次重复实验时。
关于初始化偏差问题,从来不缺少解决方案。遗憾的是,对于每一个在某些情形下效果良好的"解决方案”,都存在另一些情形,在其中它要么不适用,要么表现很差。重要的思想包括:对偏差作检验(例如 Kelton 与 Law [1983]、Schruben [1980]、Goldsman、Schruben 与 Swain [1994]);对偏差建模(例如 Snell 与 Schruben [1985]);以及在多次重复实验上对初始条件随机抽样(例如 Kelton [1989])。
5.2 稳态仿真的误差估计
如果 在统计上不独立,那么由式 , 给出的 就是真实方差 的一个有偏估计量。当 是来自单次重复实验内部的一个输出观察值序列时,情况几乎总是如此。在这种情形下,. 是一个自相关序列,有时被称为时间序列(time series)。
假设我们对 θ 的点估计量是样本均值 。数理统计中的一个一般结果^2 是: 的方差为
其中 cov 。为了构造 θ 的置信区间,需要对 作出估计。但要对式 (22) 作出估计是徒劳的,因为一般地每一项 cov 都可能不同。幸运的是,具有稳态的系统,如果仿真得足够长以越过暂态阶段,所产生的输出过程将是近似协方差平稳的。直观地说,平稳性意味着 依赖于 的方式,与 依赖于 的方式相同。特别地,时间序列中两个随机变量之间的协方差只取决于它们之间相隔的观察值个数,这个个数称为滞后(lag)。对于一个协方差平稳时间序列 ,定义滞后 k 自协方差为
由协方差平稳性的定义,它不是 i 的函数。当 , γ 变为总体方差 即,
滞后 k 自相关是相隔 k 的任意两个观察值之间的相关。它定义为
并具有以下性质:
$$
- 1 \leq \rho_{k} \leq 1, \quad k = 1, 2, \dots $$
如果一个时间序列是协方差平稳的,那么式 (22) 就可以大大简化。代数推导表明
其中 是式 (25) 给出的滞后 k 自相关。
当对所有 k(或大多数 k)都有 时,称该时间序列为正自相关(positively autocorrelated)。在这种情况下,大的观察值往往跟着大的观察值,小的观察值跟着小的观察值。这样的序列往往会缓慢地漂移到其均值之上,然后又漂移到均值之下。图 8(a) 是一个表现出正自相关的平稳时间序列的例子。大多数排队仿真的输出数据都是正自相关的。



图 8 (a) 表现出正自相关的平稳时间序列 ;(b) 表现出负自相关的平稳时间序列 ;(c) 具有上升趋势的非平稳时间序列。
另一方面,如果某些 ,则序列 . 将表现出负自相关的特征。在这种情况下,大的观察值往往跟着小的观察值,反之亦然。图 8(b) 是一个表现出负自相关的平稳时间序列的例子。某些库存仿真的输出可能是负自相关的。
图 8(c) 还给出了一个具有上升趋势的时间序列的例子。这样的时间序列不是平稳的; 的概率分布随指标 i 而变化。
为什么自相关会使 的估计变得困难?回顾一下,样本均值方差的标准估计量是 。利用式 (26) 可以证明 [Law, 1977],方差估计量 的期望值为
其中
而 c 是式 (26) 中方括号内的那个量。自相关对估计量 的影响,可以通过考察式 (26) 和式 (28) 得出。本质上存在三种可能:
情形 1
如果 是独立的,那么对 . 有 。因此,,而式 (26) 退化为熟悉的 。还要注意 ,所以 是 V(Y¯ ) 的无偏估计量。当 取自不同的重复实验时,它们总是独立的;这种独立性正是我们偏好要求进行多次重复实验的实验设计的主要原因。
情形 2
如果自相关 主要是正的,那么 ,于是 , 从而 。因此, 作为 的估计量是向下偏的。如果忽略这种相关性,由式 (10) 给出的名义 置信区间就会过短,其真实置信系数将小于 。实际后果是:由于置信区间过短,仿真分析人员会对点估计量表面上的精度产生毫无根据的信心。如果相关 很大,B 可能相当小,这意味着严重的低估。
情形 3
如果自相关 显著为负,那么 ,于是 ,并且 对 是向上偏的。换言之,点估计量 的真实精度将高于其方差估计量 所显示的精度,因为
结果是,由式 (10) 给出的名义 置信区间的真实置信系数将大于 。这一错误不如情形 2 严重,因为如果我们的估计实际上比我们以为的更精确,我们就不大可能作出错误的决策。
一个简单的例子说明了我们为什么特别关注正相关:假设你想知道一所大学校园里的学生在即将到来的选举中会如何投票。为了估计他们的偏好,你计划征集 100 个回答。标准实验是随机选取 100 名学生进行民意调查;称之为实验 A。另一种做法是随机选取 20 名学生,让每个人在同一天把他们的偏好陈述 5 次;称之为实验 B。两个实验都获得 100 个回答,但显然基于实验 B 的估计不如基于实验 A 的估计精确(具有更大的方差)。实验 A 获得 100 个独立的回答,而实验 B 只获得 20 个独立的回答和 80 个相依的回答。来自任一学生的 5 个意见是完全正相关的(假定该学生 5 次都报出同一位候选人)。尽管这是一个极端的例子,它说明了基于正相关数据的估计比基于独立数据的估计具有更大的变异性。因此,置信区间或其他误差度量应当正确地考虑相依数据,而 却没有做到这一点。
下面两节给出两种消除或减小自相关对均值估计的有害影响的方法。遗憾的是,某些仿真语言在所有情形下都使用 作为 )(样本均值的方差)的估计量,或者促使其被这样使用。如果在输出数据正自相关的仿真中不加鉴别地使用它,那么 中的向下偏倚以及由此造成的 θ 的置信区间过短,会传达出一种远好于实际存在的精度印象。当输出数据中存在这种正自相关时,点估计量 的真实方差可能比 所显示的要大许多倍。
5.3 稳态仿真的重复实验法
如果点估计量中的初始化偏差已经通过智能初始化与数据删除的某种组合被减小到可以忽略的水平,那么就可以用独立重复实验法来估计点估计量的变异性并构造置信区间。其基本思想很简单:作 R 次重复实验,每一次都以相同的方式初始化并删除数据。
然而,如果点估计量中仍存在显著偏差,并且用大量重复实验来减小点估计量的变异性,那么所得到的置信区间就可能是误导性的。之所以如此,是因为偏差不受重复实验次数 R 的影响;它只受删除更多数据(即增大 或延长每次运行的长度(即增大 的影响。因此,增加重复实验次数 R 可能得到围绕"错误点"的更短置信区间。所以,彻底地考察初始条件偏差是很重要的。
如果仿真分析人员决定在重复实验的 n 个观察值中删除 d 个观察值,那么 θ 的点估计量为
也就是说,点估计量是剩余数据的平均值。基本的原始输出数据 如表 4 所示。例如, 可以是第 r 次重复实验中顾客 j 在队列中的延误,或者作业车间中作业 j 的响应时间。被删除的观察值个数 d 和观察值总数 n 在不同重复实验之间可能不同,此时把 d 替换为 、把 n 替换为 。为简单起见,假定 d 和 n 在各次重复实验上保持不变。
表 4 稳态仿真的原始输出数据
| 重复实验 | 观察值 | 重复实验平均值 | |||||
|---|---|---|---|---|---|---|---|
| 1 | d | n | |||||
| 1 | |||||||
| 2 | |||||||
| . | . | . | . | . | . | ||
| . | . | . | . | . | . | ||
| . | . | . | . | . | . | ||
| R | |||||||
在使用重复实验法时,为了估计 θ,每次重复实验都被视为一个单独的样本。对于重复实验 ,定义
为重复实验 r 中所有(未删除)观察值的样本均值。由于所有重复实验使用不同的随机数流,并且都通过在时间 0 的同一组初始条件 , 进行初始化,因此各重复实验的平均值
是独立同分布的随机变量;也就是说,它们构成来自某个具有未知均值
的潜在总体的一个随机样本。由式 (29) 给出的总点估计量也可以写成
这可以从表 4 看出,也可以由式 (21) 得到。于是同样有
如果 d 和 n 选得足够大,那么 ,并且 是 θ 的一个近似无偏估计量。 中的偏差是 。为方便起见,当 n 和 d 的取值已经明确时,把 (第 r 次重复实验中未删除观察值的均值)和 [即 的均值] 分别简记为 和 。为了估计 的标准误,首先计算样本方差:
的标准误由下式给出:
基于 t 分布的 , 的 置信区间为
其中 是自由度为 的 t 分布的 百分位点。该置信区间只有在 的偏差近似为零时才是有效的。
作为一个粗略的规则,每次重复实验在删除点之后的长度,至少应为所删除数据量的十倍。换言之, 至少应为 10d(或者更一般地, 至少应为 。在这一运行长度下,重复实验的次数应在时间允许的前提下尽可能多,最多约 25 次。Kelton [1986] 指出,把可用时间划分为超过 25 次重复实验几乎没有价值,因此,如果时间允许作多于 25 次长度为 的重复实验,那么就改作 25 次长度超过 , 的重复实验。同样,这些都是粗略的规则,不必机械地照搬。
在本节中,我们把结果表述为运行长度是 n 个观察值、其中删除 d 个。正如前面所讨论的,在实践中我们作一次长度为 时间单位的运行,并删除前 个时间单位。在这种情形下, 变为直到时间 为止所获得的观察值个数,而 是在时间 与 , 之间所记录的观察值个数,两者都是随机变量,并且通常在不同重复实验之间各不相同。在下面的例子中,我们将在记号中使用 而不是 ,以明确这一点。
例 15
再次考虑例 8 和例 14 中的 FastChip 晶圆厂仿真。假设仿真分析人员决定作 次重复实验,每次长度为 小时,在数据收集开始之前删除前 小时,如例 14 中所确定的那样。请记住,原始输出数据由 C 芯片片盒的周期时间组成,每次重复实验的输出是在时间 小时与 小时之间完工的所有 C 芯片片盒的平均值(每次重复实验大约有 个周期时间)。仿真的目的是估计长期平均周期时间(记为 ),并用 95% 置信区间度量估计的误差。
表 5 FastChip 仿真按重复实验汇总的数据
| 重复实验 r | 重复实验 r 的样本均值 |
|---|---|
| 1 | 46.86 |
| 2 | 46.09 |
| 3 | 47.64 |
| 4 | 47.43 |
| 5 | 46.94 |
| 6 | 46.43 |
| 7 | 47.11 |
| 8 | 46.56 |
| 9 | 46.73 |
| 10 | 46.80 |
| 46.86 | |
| S | 0.46 |
各重复实验的平均值 , 如表 5 所示。由式 (32) 计算点估计量为
其标准误由式 (34) 给出:
取 和 , 长期平均队长(queue length)的 95% 置信区间由不等式 (35) 给出:
即
仿真分析人员可以有很高的把握断定:C 芯片的长期平均周期时间在 46.52 小时与 47.20 小时之间。这里由不等式 (35) 计算得到的置信区间应当谨慎使用,因为其有效性背后的一个关键假设是:已经删除了足够多的数据,从而消除了由初始条件造成的任何显著偏差——也就是说, 和 足够大,使得偏差 可以忽略不计。
5.4 稳态仿真中的样本量
假设希望以 的置信度把某个长期性能度量 θ 估计到 以内。在稳态仿真中,达到指定精度既可以靠增加重复实验次数 R,也可以靠增加运行长度 。第一种解法——控制 R——按第 4.2 节中对终止型仿真所给出的方式实施。
例 16
把表 5 中 FastChip 晶圆厂仿真的数据看作一个规模为 的初始样本。标准差初始估计为 小时。假设希望以 95% 的置信度把 C 芯片的长期平均周期时间 w 估计到 1 小时(6 分钟)以内。在不等式 (16) 中取 ,得到 R 的初始估计为
因此,至少将需要 82 次重复实验。
增加 R 之外的另一种选择,是增加每次重复实验内的总运行长度 。如果第 4.2 节中的计算(如例 16 所示)表明在初始的 , 次之外还需要 次追加重复实验,那么一种替代做法是按同样的比例 把运行长度 增加到新的运行长度 。于是,将有更多数据被删除,即从时间 0 到时间 , 的数据,同时将有更多数据被用于计算点估计,如图 9 所示。然而,总的仿真工作量与简单地增加重复实验次数而保持运行长度不变时是相同的。增加每次重复实验的总运行长度、并删除总运行长度中固定比例 的数据,其优点是:点估计量中任何残余偏差都会因在运行开始处额外删除数据而进一步减小。该方法的一个可能缺点是,为了把全部 R 次重复实验继续运行下去(从时间 到时间 ),就必须保存模型在时间 的状态,并且能够重新启动模型并让它运行所需的额外时间。否则,这些仿真就必须从时间 0 重新运行,而对于一个复杂的模型来说,这可能是很耗时的。某些仿真语言具有保存足够信息的能力,使一次重复实验能够从时间 往后继续,而不必从时间 0 重新开始。

图 9 通过增加运行长度达到指定精度。
例 17
在例 中,假设要通过增加运行长度来达到所期望的 0.1 小时误差。由于 , 运行长度应为 小时。从时间 0 到时间 小时所收集的数据将被删除,而时间 1640 到时间 18,040 之间的数据将用于计算新的点估计和置信区间。
5.5 稳态仿真的批均值法
重复实验法的一个缺点是:每次重复实验都必须删除数据,并且在某种意义上,被删除的数据是被浪费的数据,或者至少是丢失的信息。这提示我们,采用基于单次长时间重复实验的实验设计或许有其可取之处。单次重复实验设计的缺点在我们试图计算样本均值的标准误时显现出来:由于我们只有来自一次重复实验内部的数据,这些数据是相依的,而通常的估计量是有偏的。
批均值(batch means)法试图解决这一问题:把一次重复实验的输出数据(经过恰当删除之后)划分为少数几个大批,然后把这些批的均值当作独立的观察值来处理。当删除后的原始输出数据构成一个连续时间过程 时(例如队列长度或库存水平),我们构造 k 个规模为 的批,并计算批均值为
。换言之,第 j 个批均值就是该过程在时间区间 上的时间加权平均。
当删除后的原始输出数据构成一个离散时间过程 时(例如队列中的顾客延误或库存系统每个周期的成本),我们构造 k 个规模为 的批,并计算批均值为
其中 (假定 k 能整除 ,否则向下取整到最接近的整数)。也就是说,批均值按下所示的方式构成:
无论从连续时间数据还是离散时间数据出发,样本均值的方差都由下式估计:
其中 是删除后数据的总样本均值。各批均值 并不独立;不过,如果批的规模足够大,相继的批均值将近似独立,而方差估计量也将近似无偏。
遗憾的是,并不存在被广泛接受且相对简单的方法来选择一个可接受的批规模 m(或等价地,选择批数 。不过,从研究文献中还是可以梳理出一些一般性的指导原则:
a. Schmeiser [1982] 发现,在总样本量固定的情况下,把它划分为超过 k 30 个批几乎没有什么收益,即便我们能够做到这一点并且仍能保持批均值之间的独立性。因此,无论有多少原始数据可用,都没有理由考虑远大于 30 的批数。他还发现,就置信区间的宽度及其宽度的变异性而言,当批数少于 10 时其表现很差。因此,在大多数应用中应当使用介于 10 与 30 之间的批数。
b. 尽管通常在所有滞后上批均值之间都存在自相关,但人们一般考察滞后 1 自相关 ,以评估批均值之间的相依性。当滞后 1 自相关接近于 0 时,就把批均值当作独立的来处理。这一做法基于如下观察:许多随机过程中的自相关随滞后的增大而减小。因此,所有滞后自相关的绝对值都应当小于滞后 1 自相关。
c. 批均值之间的滞后 1 自相关可以被估计(见下文)。然而,不应依据少量的批均值(例如上面推荐的 )来估计自相关;自相关估计量中存在偏差。Law 与 Carson [1979] 建议:先基于较小的批规模、用大量的批均值(或许 )来估计滞后 1 自相关。当这些批均值之间的自相关近似为 0 时,如果我们把数据重新分批为基于更大批规模的 10 到 30 个批均值,那么自相关将更小。检验自相关为 0 的假设检验方法是有的,如下所述。
d. 如果总样本量要序贯地确定(比如说为了达到指定精度),那么让批规模和批数随运行长度的增加而增长是有帮助的。可以证明,一个好的策略是:先找到一个使滞后 1 自相关近似为 0 的批规模,然后让批数随样本量的平方根而增加。尽管我们不打算进一步讨论这一点,但基于它的一个算法可见 Fishman 与 Yarberry [1997];另见 Steiger 与 Wilson [2002] 以及 Lada、Steiger 与 Wilson [2006]。
鉴于上述认识,我们推荐下面的一般策略:
从一次重复实验获得输出数据,并作恰当的删除。回顾我们的指导原则:所收集的数据至少应为所删除数据的 10 倍。
用保留下来的数据构造至多 个批(但至少 100 个批),并计算批均值。把批均值的样本滞后 1 自相关估计为
检查该相关是否足够小。
(a) 如果 , 则把数据重新分批为 个批,并用 个自由度的 t 分布以及式 (36) 估计 的方差,从而构造置信区间。
(b) 如果 , 则把该次重复实验延长 50% 到 100%,并回到步骤 2。如果无法延长该次重复实验,则把数据重新分批为大约 个批,并用 个自由度的 t 分布以及式 (36) 估计 的方差,从而构造置信区间。
作为对置信区间的一项附加检查,用下述检验考察批均值(在较大或较小的批规模下)的独立性。例如见 Alexopoulos 与 Seila [1998]。计算检验统计量
如果 ,则接受批均值相互独立,其中 是该检验的第 I 类错误水平,如 0.1、0.05、0.01。否则,把该次重复实验延长 50% 到 100%,并回到步骤 2。如果无法延长该次重复实验,则把数据重新分批为大约 个批,并用 个自由度的 t 分布以及式 (36) 估计 Y 的方差,从而构造置信区间。
这一流程(包括最后的检查)在若干方面是保守的。首先,如果滞后 1 自相关显著为负,我们仍然继续构造置信区间。占主导地位的负相关倾向于使置信区间比必要的更宽,这是一个错误,但不是会导致我们作出错误决策的那种错误。在 - 个批时要求 是相当严格的,只要存在一点正相依的迹象,它就会迫使我们获取更多数据(从而形成更大的批)。最后,末尾的假设检验有 的概率迫使我们在其实并不需要更多数据时去获取更多数据。但这种保守性是有意设计的;作出错误决策的代价,通常远高于增加一些计算机运行时间的代价。
下面用一个例子说明用批均值法估计置信区间。
例 18
重新考虑例 8 中的 FastChip 晶圆厂仿真。假设我们希望用 95% 置信区间估计 C 芯片的稳态平均周期时间 w。为了说明批均值法,假定已经作了一次模型运行,在删除点之后仿真了 5000 个周期时间。然后我们用 个规模为 的批构造批均值,并估计滞后 1 自相关为 。于是我们决定把仿真延长到删除点之后的 10,000 个顾客,并再次估计滞后 1 自相关。这一基于 个规模为 的批的估计值为 。通过了相关性检查之后,我们把数据重新分批为 个规模为 的批。点估计是总均值
的方差由这 40 个批均值计算得到:
于是,95% 置信区间为
即
因此,我们以 95% 的置信度断言:真实平均周期时间 w 介于 46.55 小时与 47.45 小时之间。如果这些结果的精度不够,那么就应该增加运行长度以获得更高的精度。
作为对置信区间有效性的一项进一步检查,我们可以应用相关性假设检验。为此,我们用构造置信区间所用的那 个规模为 的批来计算检验统计量。这给出
这证实了在 0.05 显著性水平上不存在相关性。注意,在批数这么少的情况下,滞后 1 自相关的估计值看起来略微为负,这正印证了我们前面关于用少量观察值估计相关性的困难所在的论点。
5.6 稳态分位数
在稳态仿真中构造分位数估计的置信区间可能很棘手,特别是当所关注的输出过程是一个连续时间过程时,例如 ), 即时刻 t 队列中等待的顾客数。在本节中,我们概述其中的主要问题。
先考虑较容易的情形。假设一次重复实验的输出过程(在恰当删除初始数据之后)是 。具体地说, 可以是第 i 位顾客在队列中的延误。那么 p 分位数的点估计可以像前面那样得到,既可以由数据的直方图得到,也可以由排序后的值得到。当然,只使用删除点之后的数据。假设我们作了 次重复实验,并令 为第 r 次的分位数估计。那么这 R 个分位数估计 -, 是独立同分布的。它们的平均值为
它可以用作 的点估计量,而一个近似的置信区间为
其中 是 - - 的通常样本方差。如果只作了单次重复实验呢?那么同样的推理仍然适用,只要令 为第 i 批数据内部的分位数估计。这需要在每一批内部对数据进行排序或作出直方图。如果批足够大,那么这些批内分位数估计也将近似独立同分布。
当我们面对一个连续时间输出过程时,原则上同样的方法也是适用的。然而,我们必须注意不要以改变问题的方式对数据进行变换。特别地,我们不能像本章通篇所做的那样先构造批均值,然后再由这些批均值估计分位数。 的批均值的 p 分位数,并不等于 本身的 p 分位数。因此,分位数点估计必须由原始数据的直方图构成,如果我们作了重复实验,就由每次运行构成;如果我们只作单次重复实验,则在每一批内部构成。
6 小结
本章强调这样一个思想:一次随机离散事件仿真就是一次统计实验。因此,在能够基于仿真所生成的输出数据得出可靠的结论之前,必须先作恰当的统计分析。仿真实验的目的是获得对所研究系统性能度量的估计。统计分析的目的是获得某种保证,即这些估计对于模型的预期用途而言具有足够的精度。
本章区分了终止型仿真与稳态仿真。稳态仿真的输出数据分析起来更困难,因为仿真分析人员必须处理初始条件问题和运行长度的选择问题。关于这些问题已经给出了一些建议,但遗憾的是,并不存在简单、完备且令人满意的解决方案。尽管如此,仿真分析人员应当意识到这些潜在的问题,以及可能的解决办法——即删除数据和增加运行长度。更高级的统计技术(本书不予讨论)见 Alexopoulos 与 Seila [1998]、Bratley、Fox 与 Schrage [1996] 以及 Law [2007]。
点估计量的统计精度可以用标准误估计来度量,也可以用置信区间来度量。本章着重讨论了独立重复实验法。用这种方法,仿真分析人员生成统计上独立的观察值,从而可以采用标准的统计方法。对于稳态仿真,本章还讨论了批均值法。
要点在于:仿真输出数据含有一定量的随机变异性;如果不对其大小作出某种评估,那么点估计就无法被有把握地使用。
参考文献
ALEXOPOULOS, C.,ANDA. F. SEILA [1998], “Output DataAnalysis,” Chapter 7 in Handbook ofSimulation, J. Banks, ed., Wiley, New York.
BRATLEY, P., B. L. FOX, AND L. E. SCHRAGE [1996], A Guide to Simulation, 2d ed., Springer-Verlag, New York.
FISHMAN, G. S.,AND L. S.YARBERRY [1997], “An Implementation ofthe Batch Means Method,” INFORMS Journal on Computing, Vol. 9, pp. 296–310.
GOLDSMAN, D., L. SCHRUBEN, AND J. J. SWAIN [1994], “Tests for Transient Means in Simulated Time Series,” Naval Research Logistics, Vol. 41, pp. 171–187.
KELTON, W. D. [1986], “Replication Splitting and Variance for Simulating Discrete-Parameter Stochastic Processes,” Operations Research Letters, Vol. 4, pp. 275–279.
KELTON, W. D. [1989], “Random Initialization Methods in Simulation,” IIETransactions,Vol. 21, pp. 355–367.
KELTON, W. D., AND A. M. LAW [1983], “A New Approach for Dealing with the Startup Problem in Discrete Event Simulation,” Naval Research Logistics Quarterly, Vol. 30, pp. 641–658.
KLEIJNEN, J. P. C. [1987], Statistical Toolsfor Simulation Practitioners, Dekker, New York.
LADA, E. K., N. M. Steiger, AND J. R. WILSON [2006], “Performance Evaluation of Recent Procedures for Steady-state Simulation Analysis,” IIE Transactions, Vol. 38, pp. 711-–727.
LAW, A. M. [1977], “Confidence Intervals in Discrete Event Simulation: A Comparison of Replication and Batch Means,” Naval Research Logistics Quarterly, Vol. 24, pp. 667–78.
LAW, A. M. [1980], “Statistical Analysis of the Output Data from Terminating Simulations,” Naval Research Logistics Quarterly, Vol. 27, pp. 131–43.
LAW, A. M. [2007], Simulation Modeling and Analysis, 4th ed., McGraw-Hill, New York.
LAW,A. M.,AND J. S. CARSON [1979], “A Sequential Procedure for Determining the Length of a Steady-State Simulation,” Operations Research, Vol. 27, pp. 1011–1025.
NELSON, B. L. [2001], “Statistical Analysis of Simulation Results,” Chapter 94 in Handbook of Industrial Engineering, 3d ed., G. Salvendy, ed., Wiley, New York.
SCHMEISER, B. [1982], “Batch Size Effects in the Analysis of Simulation Output,” Operations Research, Vol. 30, pp. 556–568.
SCHRUBEN, L. [1982], “Detecting Initialization Bias in Simulation Output,” Operations Research, Vol. 30, pp. 569–590.
SNELL, M., AND L. SCHRUBEN [1985], “Weighting Simulation Data to Reduce Initialization Effects,” IIE Transactions, Vol. 17, pp. 354–363
STEIGER, N. M., AND J. R. Wilson [2002], “An Improved Batch Means Procedure for Simulation Output Analysis,” Management Science, Vol. 48, pp. 1569–1586.
WELCH, P. D. [1983], “The StatisticalAnalysis ofSimulation Results,” in The Computer Performance Modeling Handbook, S. Lavenberg, ed., Academic Press, New York, pp. 268–328.
习题
对下述每一个系统,在什么情况下适于用终止型仿真来分析它,又在什么情况下适于用稳态仿真来分析它?
(a) 一家免预约诊所(walk-in medical clinic),仿真目的是确定人员配备水平。
(b) 一个由股票、债券和衍生证券构成的投资组合,仿真目的是估计长期收益。
(c) 一家每天运行两个班的喷油器装配厂,仿真目的是估计吞吐量。
(d) 美国空中交通管制系统,仿真目的是评估安全性。
假设某排队仿真的输出过程是 , 即时刻 t 队列中的总人数。一个连续时间输出过程可以被转换为本章所描述的那种离散时间过程 , 方法是先构造 个长度为 m 个时间单位的批均值:
其中 。可以绘制这些批均值的总体平均,以检查是否存在初始条件偏差。
(a) 用代数方法证明:2m 个时间单位上的批均值,可以通过对两个相邻的 m 时间单位上的批均值求平均而得到。(提示:这意味着我们可以从相当短的时间区间 m 上的批均值出发,逐步构建更长时间区间上的批均值,而无须重新分析全部数据。)
(b) 仿真一个 \(\lambda = 1\)、\(\mu = 1 . 25\) 的 \(M / M / 1\) 队列,运行长度为 4000 个时间单位,计算队列中总人数的批均值,批规模为 \(m = 4\) 个时间单位。作重复实验并用一个均值图确定应当删除多少个批。把这个要删除的批数换算为一个删除时间。
利用上面习题 2 的结果,设计并实施一个实验,以 95% 的置信度把这个 队列的稳态期望队长 L 估计到 名顾客以内。把你的估计与真实值 ) 作对照检查。
在例 7 中,假设管理层希望对平均周期时间的估计给出一个 95% 置信区间,且允许的误差为 小时(3 分钟)。利用表 5 中给出的同一组初始数据,估计所需的总样本量。尽管我们把误差减小了一半,所需样本量增加了多少?
再次仿真一个 、 的 队列,但这次把顾客在系统中的时间(从到达到离开)记录为性能度量,共记录 4000 名顾客。作重复实验并用一个均值图确定:当系统从空启动、系统中初始有 4 名顾客、以及系统中初始有 8 名顾客时,分别应当删除多少名顾客。预热期(warm-up period)随这些不同初始条件如何变化?这提示我们应当如何初始化仿真?
考虑一个 (M, L) 库存系统,其中采购量 Q 由下式定义:
其中 I 是一个月末在手加上已订购的库存水平,M 是最大库存水平,L 是再订货点。M 和 L 受管理层控制,因此数对 (M, L) 被称为库存策略。在某些条件下,这类模型有可能求得解析解,但并不总是如此。用仿真研究具有以下性质的 库存系统:每月末检查库存状态。允许缺货(backordering),每月每件缺货的成本为 4 美元。当订单到达时,将首先用于缓解缺货。提前期服从区间 [0.25, 1.25] 个月上的均匀分布。设期初库存水平为 50 件,且没有未到货的订单。设持有成本为每月每件在库库存 1 美元。假定每月盘点库存状况。如果下达订单,其成本为 $60 + $5Q,其中 60 美元是订货成本,5 美元是每件物品的成本。需求间隔时间服从指数分布,均值为 1/15 个月。需求量服从如下分布:
需求量的分布
| 需求量 | 概率 |
|---|---|
| 1 | 1/2 |
| 2 | 1/4 |
| 3 | 1/8 |
| 4 | 1/8 |
(a) 对 (M, L) (50, 30) 策略作十次独立重复实验,每次运行长度为 100 个月,并在其前加一段 12 个月的初始化期。用 90% 置信区间估计长期月平均成本。
(b) 利用 (a) 的结果,估计把月平均成本估计到 5 美元以内所需的重复实验总次数。
重新考虑习题 6,但增加一点:如果在每月盘点时库存水平为零或负,则下达一个 单位的紧急订单。紧急订单的成本为 ,其中 120 美元是订货成本,12 美元是每件物品的成本。紧急订单的提前期服从区间 [0.10, 0.25] 个月上的均匀分布。
(a) 对该 (M, L) 策略作十次独立重复实验,并用 90% 置信区间估计长期月平均成本。
(b) 利用 (a) 的结果,估计把月平均成本估计到 5 美元以内所需的重复实验总次数。
假设习题 6 中的物品是易腐的,其售价由下列数据给出:
在架时长与售价
| 在架时间(月) | 售价 |
|---|---|
| 0-1 | $10 |
| 1-2 | 5 |
| >2 | 0 |
因此,任何在架上超过 2 个月的物品都无法售出。货龄在需求发生时度量。如果某件物品已过期,就将其丢弃,并取用下一件物品。对该系统仿真 100 个月。
(a) 对 (M, L) (50, 30) 策略作十次独立重复实验,并用 90% 置信区间估计长期月平均成本。
(b) 利用 (a) 的结果,估计把月平均成本估计到 5 美元以内所需的重复实验总次数。
首先假定期初库存中的所有物品都是新鲜的。这是一个好的假定吗?这一"全部新鲜"的假定对长期月平均成本的估计有什么影响?可以做些什么来改进这些估计?请完成一份完整的分析。
考虑如下库存系统:
(a) 每当库存水平降到或低于 10 件时,就下达一份订单。任一时刻只能有一份订单未到货。
(b) 每份订单的规模为 Q。持有库存的成本为每天每件在库库存 0.50 美元。下达一份订单发生 10.00 美元的固定成本。
(c) 提前期服从 0 到 5 天之间的离散均匀分布。
(d) 如果在库存水平为零的期间发生需求,则该笔销售损失,每件损失 2.00 美元。
(e) 每天顾客人数服从如下分布:
每天顾客人数的分布
| 每天顾客人数 | 概率 |
|---|---|
| 1 | 0.23 |
| 2 | 0.41 |
| 3 | 0.22 |
| 4 | 0.14 |
(f) 每位顾客的需求量服从泊松分布,均值为 3 件。
(g) 为简单起见,假定所有需求都在正午发生,且所有订单都在此后立即下达。
进一步假定订单在下午 5:00 收到,或者晚于当天发生的需求之后收到。考虑 的策略。作十次独立重复实验,每次长度为 100 天,并计算长期日平均成本的 90% 置信区间。考察初始库存水平以及是否存在未到货订单对日平均成本估计的影响。开始时取初始库存为 ,且没有未到货订单。
- 一家销售母亲节贺卡的商店必须提前 6 个月决定要进多少张贺卡。不允许再订货。贺卡进价 0.45 美元,售价 1.25 美元。到母亲节仍未售出的贺卡以 0.50 美元的价格促销 2 周。然而,剩余贺卡的销售在性质上是概率性的,服从如下分布:
32% 的情况下,剩余的所有贺卡都售出。
40% 的情况下,剩余的贺卡售出 80%。
28% 的情况下,剩余的贺卡售出 60%。
2 周之后剩下的贺卡以 0.25 美元售出。贺卡店老板不确定能卖出多少张贺卡,但认为在 200 与 400 之间(即均匀分布)。假设贺卡店老板决定订购 300 张贺卡。估计期望总利润,误差至多 5.00 美元。(提示:先作十次初始重复实验。用这些数据估计所需的总样本量。每次重复实验由一个母亲节构成。)
一家非常大的采矿企业决定用"定期检查、订货至 M"的策略来控制高压管道的库存,其中 M 是目标水平。这种管道的年需求服从正态分布,均值为 600,方差为 800。这一需求在一年当中相当均匀地发生。补货提前期服从 阶厄兰分布,其均值为 2 个月。每件物品的成本为 400 美元。库存持有费用(按年、以物品成本的比例计)预计围绕均值 0.25(单利)正态波动,标准差为 0.01。作一次盘点并下达一份订单的成本为 200 美元,一件缺货的成本估计为每缺货一件 100 美元。假设每 2 个月盘点一次库存水平,并令 。
(a) 作十次独立重复实验,每次运行长度为 100 个月,用 90% 置信区间估计长期月平均成本。
(b) 考察初始条件的影响。计算一个恰当的、应予以删除的月度观察值个数,以把初始化偏差减小到可以忽略的水平。
考虑若干个(设为 N 个)串联的 M/M/1 队列。M/M/1 队列具有速率为每小时 λ 名顾客的泊松到达、均值为 1/µ 的指数分布服务时间,以及单个服务台。(回想一下,“泊松到达"是指到达间隔时间服从指数分布。)所谓串联的 M/M/1 队列,是指在某个服务台完成服务之后,顾客就加入下一个服务台的排队线。该系统可以表示如下:

所有服务时间都服从指数分布,均值为 , 并且假定每条排队线的容量为无限。假设 名顾客每小时,且 1 小时。性能度量是响应时间,其定义为一名顾客在系统中的总时间。
(a) 通过作恰当的仿真运行,比较 \(N = 1\)(即一个 M/M/1 队列)与 \(N = 2 ( {\mathrm{i . e .}}\), 两个串联的 M/M/1 队列)的初始化偏差。启动每个系统时各服务台均空闲且没有顾客在场。仿真的目的是估计平均响应时间。
(b) 考察初始化偏差作为 \(N ,\) 的函数的行为,取 \(N = 1 , 2 , 3 , 4 ,\), 和 5。
(c) 就"大型"排队系统在时间 0 被假定为空且空闲时的初始化偏差,得出一些一般性结论。
- 作业以随机方式按泊松过程进入一个作业车间,总体速率是平稳的,每 8 小时工作日两个作业。作业有四种类型。它们按类型决定的固定顺序从一个工作站流向另一个工作站,如下所示。每种类型的比例也一并给出。
作业类型及其流经工作站的顺序与比例
| 类型 | 流经的工作站 | 比例 |
|---|---|---|
| 1 | 1, 2, 3, 4 | 0.4 |
| 2 | 1, 3, 4 | 0.3 |
| 3 | 2, 4, 3 | 0.2 |
| 4 | 1, 4 | 0.1 |
每个作业在每个工作站上的加工时间取决于类型,但所有时间都近似服从正态分布,其均值与标准差(以小时计)如下:
各类型在各工作站的加工时间(均值, 标准差)
| 类型 | 工作站 | |||
|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |
| 1 | (20, 3) | (30, 5) | (75, 4) | (20, 3) |
| 2 | (18, 2) | (60, 5) | (10, 1) | |
| 3 | (20, 2) | (50, 8) | (10, 1) | |
| 4 | (30, 5) | (15, 2) |
工作站 i 有 名工人,4。每个作业在加工时间内占用一个工作站的一名工人。所有作业都按先进先出(first-in–first-out)方式加工,并且假定所有等待作业的队列容量为无限。对系统仿真 800 小时,其前加一段 200 小时的初始化期。假定 。基于 次重复实验,计算四个工作站中每一个的平均工人利用率的 95% 置信区间。另外,计算每种作业类型的平均总响应时间的 95% 置信区间,其中总响应时间就是一个作业在车间中度过的总时间。
修改习题 13,在每个工作站按作业类型赋予优先级。I 型作业优先于 II 型,II 型优先于 III 型,III 型优先于 IV 型。使用 800 小时作为运行长度,200 小时作为初始化期, 次重复实验。计算按类型分组的四个平均总响应时间的 95% 置信区间。另外,在不设优先级的情况下运行模型,并计算同样的置信区间。讨论采用先进先出与采用优先级系统之间的权衡。
考虑一个单服务台队列,泊松到达速率为每分钟 ,服务时间服从正态分布,均值为 5.1 秒,方差为 0.98 秒^2。希望估计这样一位顾客在系统中的平均时间:该顾客到达时发现系统中另有 i 位顾客;也就是说,要估计
其中 W 是一个典型的系统时间,N 是到达者所发现的顾客数。例如, 是那些发现系统为空的顾客的平均系统时间, 是那些到达时发现另有 1 位顾客在场的顾客的平均系统时间,依此类推。 的估计 将是所有发现系统中有 i 人的到达者的系统时间的样本均值。绘制 对 i 的图形。提出一个关于 与 i 之间关系的假设,并尝试加以验证。
(a) 以空且空闲为初始条件,仿真 10 小时。
(b) 经过 1 小时的初始化之后,仿真 10 小时。(a) 与 \((\mathrm {b} )\) 的结果是否存在可观察到的差异?
(c) 用均值为 5.1 秒的指数分布服务时间重复 (a) 和 (b)。
(d) 用等于 5.1 秒的确定性服务时间重复 (a) 和 (b)。
(e) 求出估计 w_0、\(w_{1} , \ldots , w_{6}\)(每个的标准误至多为 3 秒)所需的重复实验次数。重复 (a)–(d),但使用这一重复实验次数。
在 Smalltown 大学,有一台供学生使用的专用图形工作站,位于校园另一侧、远离计算机中心的地方。某天凌晨 2:00,六名学生来到该工作站完成一份作业。每名学生使用工作站 108 分钟,然后离开去计算机中心取他们的图形输出。有 25% 的可能性这次运行没问题,学生就去睡觉。如果不行,该学生就返回工作站并等待,直到工作站空闲。从工作站到计算机中心再返回的往返路程耗时 分钟。计算机在凌晨 5:00 变得不可用。估计六名学生中至少有五名在这 3 小时内完成作业的概率 p。首先作 次重复实验,并计算 的 95% 置信区间。接着,求出把 估计到 0.02 以内所需的重复实验次数,并作这么多次重复实验。重新计算 的 95% 置信区间。
四名工人沿一条输送带均匀间隔地排开。需要加工的物品按速率为每分钟 2 件的泊松过程到达。加工时间服从指数分布,均值为 1.6 分钟。如果某名工人变为空闲,他或她就取走输送带上过来的第一件物品。如果某名工人在物品过来时正忙,该物品就沿输送带向下移动到下一名工人,在相继两名工人之间耗时 20 秒。当一名工人加工完一件物品时,该物品离开系统。如果一件物品经过了最后一名工人,它就在一条环形输送带上被再循环,并在 5 分钟后回到第一名工人处。
管理层希望有均衡的工作负载——也就是说,管理层希望各工人的利用率相等。令 为工人 i 的长期利用率,令 为所有工人的平均利用率。于是,。根据排队论,ρ 可以由 , 估计,其中 次到达每分钟, 个服务台, 分钟是平均服务时间。于是, 因此,平均而言,一名工人有 80% 的时间是忙碌的。
(a) 作 10 次独立重复实验,每次运行长度为 40 小时,其前加一段 1 小时的初始化期。计算 \(\rho_{1}\) 和 \(\rho_{4}\) 的 95% 置信区间。就工作负载的均衡性得出结论。
(b) 基于同样的 10 次重复实验,在显著性水平 \(\alpha = 0 . 05\) 下检验假设 \(H_{0} {:} \rho_{1} = 0 . 8\)。如果检出 0.05 的差异很重要,确定这样的偏差被检出的概率。此外,如果希望以至少 0.9 的概率检出这样的偏差,求出所需的样本量。(提示:关于假设检验的指导,可参见任何一本基础统计学教材。)
(c) 对 \(H_{0} ; \rho_{4} = 0 . 8\) 重复 (b)。
(d) 根据 (a)–(c) 的结果,就工作负载的均衡性为管理层得出结论。
- 在一个小型采石场,一台单斗电铲大约每 10 分钟往装料区倾倒一铲斗石块,两铲之间的实际时间用均值为 10 分钟的指数分布建模很合适。三铲斗石块堆成一堆;每当一堆石块完成,电铲就开始堆新的一堆。
采石场有一辆卡车,一次能运一堆(3 铲斗)。把一堆石块装上车、开到加工厂、卸料并返回装料区,大约需要 27 分钟。做完这些事的合计实际时间用均值为 27 分钟、标准差为 12 分钟的正态分布建模很合适。
当卡车返回装料区时,如果有等待装车的一堆,它就装载并运输另一堆;否则它就保持空闲,直到另一堆准备好。出于安全原因,在完整的一堆等待之前,不发生装车作业。
采石场按这种方式运行一个 8 小时工作日。我们感兴趣的是:如果再购买一辆卡车,估计卡车的利用率以及等待运输的石堆的期望数量。
- Big Bruin 公司计划在北卡罗来纳州 Juneberry 开一家小型杂货店。他们预计会有两条结账通道,其中一条留给用现金付款的顾客。他们想回答的问题是:需要多少辆购物车?
在营业时间(上午 6 点至晚上 8 点),预计付现金的顾客以每小时 8 人的速率到达。所有其他顾客预计以每小时 9 人的速率到达。每种类型的到达间隔时间可以建模为指数分布的随机变量。
购物所花的时间用正态分布建模,均值为 40 分钟,标准差为 10 分钟。购物后结账所需时间可以用对数正态分布建模:(a) 对付现金的顾客,均值为 4 分钟,标准差为 1 分钟;(b) 对所有其他顾客,均值为 6 分钟,标准差为 1 分钟。
我们假定每位顾客都使用一辆购物车,并且一位购物完毕的顾客把购物车留在店内,使它立即可供另一位顾客使用。我们还假定任何无法立即取得购物车的顾客会恼怒地离开商店。
Big Bruin 关心的首要性能度量是使用中的购物车的期望数量,以及每天损失的顾客的期望数量。请为该店推荐一个购物车数量,记住购物车很贵,但失去顾客同样代价高昂。
建立一个 M/M/1 队列中系统总时间的仿真模型,服务速率为 因此流量强度为 , 即到达率。用该仿真结合绘制总体平均的技术,研究当队列从空启动时的流量强度对初始化偏差的影响。具体地,观察初始化阶段 对 如何变化。
许多仿真软件工具都带有对输出分析的内置支持。利用网络调研其中某一个产品的功能。
www.bcnn.net 上可用材料清单
SimulationTools.xls
12 相对性能估计
本章讨论可用于比较两个或多个系统设计的相对性能(relative performance)的众多统计方法中的若干种。这是仿真最重要的用途之一。由于响应变量的观测值含有随机变异,因此需要借助统计分析来判别:所观察到的差异究竟源于设计上的差异,还是仅仅源于模型中固有的随机波动。
两个系统设计的比较比多个系统设计的同时比较更为容易。第 1 节讨论两个系统设计的情形,使用两种可能的统计技术:独立抽样(independent sampling)与相关抽样(correlated sampling)。相关抽样也称为公共随机数(common random numbers, CRN)技术;简言之,就是用同一组随机数去仿真两个备选的系统设计。如果实施得当,CRN 通常会降低性能度量之差的估计量的方差,从而在给定样本量下,能够比独立抽样给出更精确的均值之差估计。第 2 节把第 1 节的统计技术推广到多个(多于两个)系统设计的比较,使用同时置信区间(simultaneous confidence intervals)、筛选(screening)与选择最佳方案(selection of the best)。这些方法在所能考虑的系统设计数量方面有一定局限,因此第 3 节说明如何用更简单的元模型(metamodel)来表示数量庞大的复杂系统设计。最后,对于以较无结构的方式彼此关联的极大量系统设计的比较与评价,第 4 节给出基于仿真的优化(optimization via simulation)。
1 两个系统设计的比较
假设仿真分析人员希望比较一个系统的两种可能配置。在排队系统中,或许要比较两种可能的排队规则,或两组可能的服务台。在供应链库存系统中,或许要比较两种可能的订货策略。一个作业车间可以有两种可能的调度规则;一个生产系统可以有容量各异的在制品缓冲区。还可以举出许多其他备选系统设计的例子。
将采用重复法(method of replications)来分析输出数据。系统 的均值性能度量记为 如果是稳态仿真,则假定已采用数据删除或其他恰当的技术,以确保点估计量是均值性能度量 的近似无偏估计量。仿真实验的目标是得到均值性能之差,即 的点估计与区间估计。下面将讨论计算 的置信区间的两种方法,但首先给出一个例子和总体框架。
例 1
Software Made Personal(SMP)公司设有一个客户支持呼叫中心,7 名话务员在东部时间上午 8:00 至下午 4:00 处理其软件用户的问题。客户来电时,会通过一套自动系统在两条产品线——财务软件与客户关系管理软件——之间进行选择。目前每条产品线都有自己的话务员(财务软件 4 名,客户关系管理 3 名)和各自的等候队列。SMP 想知道:能否通过交叉培训让话务员可以接听任一产品线的来电,从而减少所需的话务员总数。预计这样做会使处理一次通话的时间增加约 10%。现有系统如图 1(a) 所示,备选系统设计如图 1(b) 所示。在考虑减少话务员之前,SMP 想知道:如果只是对现有 7 名话务员进行交叉培训,其服务质量会怎样。来电被建模为非平稳泊松到达过程,话务员回答问题时间的分布也已拟合完成。比较将基于从发起呼叫到客户问题得到解答的平均时间。

图 1 (a) 现有 SMP 呼叫中心与 (b) 一种备选设计。
表 1 用于比较两系统的仿真输出数据与汇总度量
| 系统 | 重复 | 样本均值 | 样本方差 | |||
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 1 | ||||||
| 2 |
在比较两个系统(如例 1 中的两个系统)时,仿真分析人员必须为每个模型 确定运行长度 、每个模型要做的重复次数 ,或二者都确定。从系统 的第 次重复中,仿真分析人员得到均值性能度量 的一个估计 。在例 1 中, 是在系统 的第 次重复中所观察到的平均呼叫响应时间,其中 且 。这些数据连同两个汇总度量——样本均值 与样本方差 ——在表 1 中给出。假定估计量 至少近似无偏,则有
在例 1 中,SMP 最初关心的是两个系统设计的比较(话务员人数相同,但专业化分工与交叉培训之别),因此仿真分析人员决定计算 (即两个均值性能度量之差)的置信区间。这将导致三种可能的结论之一:
若 的置信区间(c.i.)完全位于零的左侧,如图 2(a) 所示,则有强有力的证据支持 的假设,或者说 。在例 1 中, 意味着系统 1(现有系统)的平均响应时间小于系统 2(备选系统)。
若 的置信区间完全位于零的右侧,如图 2(b) 所示,则有强有力的证据支持 ,或者说 。在例 1 中, 可解释为系统 2 优于系统 1,即系统 2 的平均响应时间更小。
若 的置信区间包含零,则依据现有数据,没有强有力的统计证据表明某一个系统设计优于另一个。

图 2 两系统比较中可能出现的三种置信区间。
有些统计学教科书说可以得出 这一弱结论,但这类说法可能具有误导性。“弱"结论往往根本不是结论。最可能的情况是:如果收集到足够多的补充数据(即增大 ),置信区间就会移动,并且其长度肯定会缩短,直至得出第 1 条或第 2 条结论。由于置信区间给出了 之估计量精度的度量,因此我们希望把它压缩到这样一种程度:要么能断定存在一个值得关注的差异,要么差异小到我们无须把二者区分开来。
在本章中, 的双侧 置信区间始终具有以下形式
其中 是系统 在所有重复上的样本均值性能度量
ν 是与方差估计量相联系的自由度, 是自由度为 ν 的 t 分布的 百分位点,而 表示所给点估计量的标准误差。为得到标准误差与自由度,分析人员使用两种统计技术之一。两种技术都假定表 1 中的基础数据 近似服从正态分布。只要每个 本身是第 次重复中观测值的样本均值,这一假定就是合理的,而例 1 的情形正是如此。
由仿真实验的设计所决定, 独立同分布(i.i.d.),其均值为 、方差设为 。同理, 独立同分布,其均值为 、方差设为 。计算式 (1) 中置信区间的两种技术基于不同的假设集,将在以下各小节中讨论。
系统性能上的统计显著性差异与实际显著性差异之间存在着重要区别。统计显著性回答这样一个问题:所观察到的差异 是否大于 中的变异性?这个问题也可以表述为:我们是否已经收集到足够的数据,可以有把握地断定所观察到的差异是真实的,而不仅仅是偶然?上述第 1 条与第 2 条结论意味着存在统计上显著的差异,而第 3 条结论则意味着所观察到的差异在统计上不显著,即便这些系统确实可能存在差异。统计显著性是仿真实验与输出数据的函数。
实际显著性回答这样一个问题:真实的差异 是否大到足以影响我们需要作出的决策?在例 1 中,我们可能得出 的结论,并判定系统 2 更好(期望响应时间更小)。然而,如果实际的差异 非常小——比如说小到客户根本察觉不到改善的程度——那么用系统 2 替换系统 1 可能就不值得付出相应的代价。实际显著性是系统之间实际差异的函数,且与仿真实验无关。
置信区间并不直接回答实际显著性的问题。相反,它们以 的概率把真实差异 界定在如下范围
处于这些界限之内的差异是否具有实际显著性,取决于具体的问题。
1.1 独立抽样
独立抽样(independent sampling)是指用不同且相互独立的随机数流去仿真两个系统。这意味着仿真系统 1 的全部观测值,即 ,与仿真系统 2 的全部观测值,即 ,在统计上相互独立。由式 (2) 以及各重复之间的独立性,样本均值 的方差为
对于独立抽样, 与 在统计上独立;因此,
当两个方差相等但数值未知时,即 ,存在一些适用的置信区间程序。然而,由于在实践中我们很少知道这一点成立,而且只要重复次数不太少,利用方差相等所带来的好处也很有限,因此这一情形请读者参阅任一统计学教科书(例如 Hines 等人 [2002])。
的近似 置信区间可如下计算。点估计由下式计算
其中 由式 (2) 给出,而系统 的样本方差为
因此,点估计的标准误差由下式给出
自由度 ν 由下式近似
并四舍五入为整数。于是,置信区间由表达式 给出,并使用式 (6) 的标准误差。建议该程序至少使用 和 的重复次数。
1.2 公共随机数(CRN)
CRN(也称为相关抽样,correlated sampling)是指:在每一次重复中,用同一组随机数去仿真两个系统。因此, 与 必须相等,设为 。于是,对每一次重复 两个估计量 与 不再独立,而是彼此相关。不过,不同的重复使用独立的随机数,因此当 时,各对 相互独立。例如,在表 1 中,观测值 与 相关,但 与所有其他观测值独立。使用 CRN 的目的在于对每一个 在 与 之间诱发正相关,从而在均值之差的点估计量 上实现方差缩减。一般而言,该方差由下式给出
其中 是 与 之间的相关系数。(按定义,,它不依赖于 。)
现在,把使用 CRN 所产生的 的方差[式 ,记为 ]与使用等样本量独立抽样所产生的方差[式 (3) 中 ,记为 ]作比较。注意
如果 CRN 如预期般发挥作用,相关系数 将为正;因此,式 (9) 右侧的第二项为正,从而
也就是说,在点估计量上使用 CRN 的方差将小于使用独立抽样的方差。在相同样本量 下,方差更小意味着基于 CRN 的估计量更精确,从而得到更短的差异置信区间,这又意味着能够探测到更小的性能差异。
要用相关数据计算 置信区间,首先计算差值
由 CRN 的定义,这些差值是独立同分布的;然后计算样本均值之差为
于是,。差值 的样本方差计算如下
其自由度为 。 的 . 由表达式 (1) 给出,其中 的标准误差估计为
由于式 (13) 中的 是 的估计,而表达式 (6) 是 的估计,因此若 ,CRN 在给定样本量下所产生的置信区间通常会比独立抽样所产生的置信区间更短。事实上,只要 ,当 时,使用 CRN 的置信区间期望长度就会更短。 越大,能产生更短期望长度所要求的 就可以越小 [Nelson 1987]。
对任何一个问题,实施公共随机数的方法都有很多种。仅仅在随机数发生器上使用相同的种子是远远不够的。在一个模型中用于某种目的的每一个随机数,都应当在第二个模型中用于同样的目的——也就是说,随机数的使用必须是同步的(synchronized)。例如,若第 个随机数在模型 1 中用于生成第 5 位来电者的话务员服务时间,那么第 个随机数在模型 2 中就应当用于完全相同的目的。对于排队系统或服务设施,公共随机数的同步保证两个系统面对完全相同的工作负荷:两个系统在相同的时刻面临到达,且这些到达要求等量的服务。(在给定到达在两个模型中的实际服务时间未必相等;如果一个模型中的服务台比另一个模型中的服务台更快,它们可以成比例。)对于库存系统,在比较不同的订货策略时,同步保证两个系统对某种给定产品面对完全相同的需求。对于生产系统或可靠性系统,同步保证给定机器的停机在两个模型中恰好在相同时刻发生,且持续时间相同。另一方面,如果其中一个系统的某个方面与另一个系统完全不同,那么同步可能就是不恰当的——甚至根本无法实现。总之,两个系统设计中那些足够相似的方面,应当用公共随机数来仿真,使两个模型表现相似;而那些完全不同的方面,则应当用独立的随机数来仿真。
公共随机数的实施依赖于具体模型,但可以给出若干准则,使 CRN 更有可能产生正相关。这些准则的目的在于确保同步得以实现:
把一条随机数流专门用于某个特定目的,并按需要使用尽可能多的不同流。(可以用不同的随机数发生器,或同一发生器上相隔很远的种子,来获得两条不同的、不重叠的流。)此外,在每一次重复开始时为每条流指定独立选取的种子。仅在第一次重复开始时指定种子,然后让随机数发生器在第二次及以后的重复中继续往下走,这是不够的。如果以这种方式进行仿真,第一次重复将是同步的,但后续的重复可能就不是了。
对于带有外部到达的系统(或子系统):每当一个实体进入系统,就生成下一个到达间隔时间,然后立即按固定顺序生成该到达实体所需的、且在两个模型中相同的所有随机变量(如服务时间、订货量等),并把它们作为该实体的属性存储起来,以便之后按需使用。应用准则 1:把一条随机数流专门用于这些外部到达及其全部属性。
对于有实体以循环或重复方式执行给定活动的系统,为这个实体指定一条随机数流。(例如:一台机器在两个状态之间循环:运行—停机—运行—停机—……。用一条专用随机数流来生成运行时间与停机时间。)
如果同步不可能实现,或者对两个模型的某一部分而言同步并不恰当,那么就对这一子集的变量使用独立的随机数流。
遗憾的是,并不能保证 CRN 总能在两个模型的可比运行之间诱发正相关。已知的是:若对于每个输入随机变量 ,估计量 与 都是 的增函数(或都是 的减函数),则 为正。直观的想法是:两个模型,即 与 对每个输入随机变量都沿相同方向作出响应,这就导致了正相关。响应变量相对于输入随机变量的这种递增或递减性质称为单调性(monotonicity);已知它对某些排队系统成立,例如当响应变量为顾客延误时的 排队,因此有证据表明公共随机数对排队仿真是一种值得采用的技术。(对于简单排队,顾客延误是服务时间的增函数、到达间隔时间的减函数。)然而,Wright 与 Ramsay [1979] 报告了某些库存仿真出现了负相关。总之,应当遵循上述准则,并且应当能够看出所关心的响应变量是随机输入变量的单调函数,这一点要有合理的把握。
例 1(续)
图 1 中 SMP 呼叫中心的两种设计将用 CRN 进行仿真比较。为说明若干问题,我们考察两个比较:现有 7 名话务员的系统与交叉培训的 7 名话务员系统;以及交叉培训的 7 名话务员系统与交叉培训的 6 名话务员系统。我们还将评估使用 CRN 相对于独立抽样所获得的收益有多大。
SMP 问题中有四个驱动性的输入过程:来电者的到达间隔时间、来电者类型、财务软件来电者的通话时间,以及客户关系管理软件来电者的通话时间。这里所谓"通话时间”,是指话务员与来电者相处的时间,不包括来电者在线等待的时间。
为了实现 CRN,我们为每个输入过程专门指定一条不同的随机数流。这保证在每一次重复中,每个备选方案都会看到完全相同的来电序列与来电者类型。不过,通话时间可以用两种方式之一生成:要么按需生成(即当来电者接通话务员时,从相应的分布生成通话时间),要么在来电者到达的瞬间生成通话时间,把它作为来电者的一个属性保存起来,并在来电者接通话务员时使用它。后一种做法(在到达时生成通话时间并保存)在本例中提供了更好的同步;事实上,如果交叉培训方案下的通话时间是用现有系统的通话时间乘以 1.1 得到的,那么这种做法就保证交叉培训方案中每一位来电者的通话时间恰好比其在现有设计下所经历的通话时间多 10%。
表 2 给出了三种系统设计在 300 次重复运行中前 10 次重复的结果(完整数据可从 www.bcnn.net 获取)。图 3 绘出了同样这 10 次重复中现有系统与交叉培训 7 人系统的平均响应时间。CRN 的预期效果在图中显而易见:两种系统设计的响应均值倾向于同升同落,使其差异更易于观察。基于全部 300 次重复,它们之间的样本相关系数为 0.24,表明 CRN 的影响并不大。然而,同样基于全部 300 次重复,7 人与 6 人两个备选系统之间的样本相关系数高达 0.94。如图 4 所示,这两种系统设计的响应明显地同升同落,呈现出强正相关。

图 3 SMP 呼叫中心现有方案与备选方案(7 名话务员)前 10 次重复的平均响应时间。
观察 CRN 影响的更定量化的方式是考察标准误差,因为它们直接影响置信区间的长度。例如,两个备选系统比较的标准误差为 0.88 分钟。我们可以利用样本方差和式 (6) 来近似独立抽样情形下本应有的标准误差:
降低幅度接近 50%,使得差异更容易被探测出来。
表 2 SMP 呼叫中心各系统设计的比较
| 平均响应时间 | 差值 | ||||
|---|---|---|---|---|---|
| 重复 | 现有方案 | 备选 7 人 | 备选 6 人 | 现有 − 备选7 | 备选7 − 备选6 |
| 1 | 6.24 | 6.19 | 8.35 | 0.05 | -2.16 |
| 2 | 9.06 | 10.64 | 18.03 | -1.59 | -7.39 |
| 3 | 8.02 | 9.53 | 16.17 | -1.51 | -6.64 |
| 4 | 5.93 | 6.15 | 7.40 | -0.22 | -1.25 |
| 5 | 8.31 | 7.83 | 12.70 | 0.48 | -4.87 |
| 6 | 5.91 | 6.09 | 8.26 | -0.17 | -2.17 |
| 7 | 8.74 | 7.62 | 12.32 | 1.12 | -4.70 |
| 8 | 7.78 | 7.03 | 11.40 | 0.75 | -4.37 |
| 9 | 7.15 | 12.79 | 23.04 | -5.64 | -10.24 |
| 10 | 5.72 | 7.57 | 14.30 | -1.85 | -6.73 |
| 样本均值 | 7.29 | 8.14 | 13.20 | -0.86 | -5.05 |
| 样本方差 | 1.60 | 4.86 | 23.99 | 3.87 | 7.72 |
| 标准误差 | 0.62 | 0.88 |

图 4 SMP 呼叫中心备选设计中 7 人与 6 名话务员前 10 次重复的平均响应时间。
理解这两种情形下由 CRN 诱发的相关强度为何不同,有助于理解 CRN 何时最为有效。两个备选设计(6 人与 7 人)在结构上是同一系统,仅在话务员人数上不同。因此,当随机输入使得 7 人系统发生拥堵时,6 人系统必定至少同样拥堵,而且很可能更加拥堵。现有系统与各备选方案在结构上不同,它为每种来电者设置了独立的队列。当财务软件队列发生拥堵时,客户关系管理队列未必发生拥堵,于是财务来电者的长响应时间可能会与客户关系管理来电者的短响应时间相平均。因此,它与采用单一队列的备选方案之间的关系就不那么强。
令下标 C 表示现有呼叫中心,P7 表示 7 名话务员的备选方案,P6 表示 6 名话务员的备选方案。那么 的 95% 置信区间为
$$
- 86 \pm 2. 26 (0. 62) $$
即
$$
- 26 \leq \theta_{C} - \theta_{P 7} \leq 0. 54\tag{14} $$
因此,根据这 10 次重复,我们不能断定哪一种设计的响应时间更低,尽管我们可以很有把握地说,差异在 1.4 分钟以内。
另一方面,正如我们所预料的,7 人与 6 人系统明显不同,其 95% 置信区间为
$$
- 02 \leq \theta_{P 7} - \theta_{P 6} \leq - 3. 06 $$
这表明,拥有第 7 名话务员平均至少比只有 6 名要快 3 分钟。
1.3 具有规定精度的置信区间
假设我们希望 的估计误差小于 ( 可以是具有实际显著性的差异)。因此,我们的目标是找到重复次数 ,使得
我们首先对每个系统做 次重复,以得到 的初始估计。然后近似出达到式 (15) 半长准则所需的总重复次数 。最后,再对每个系统做 次追加重复(或重新做 次重复),计算置信区间,并检验半长准则是否已经达到。
例 1(续)
回顾一下, 次重复且采用 CRN 得到了式 (14) 中现有系统与 7 名交叉培训话务员系统期望响应时间之差的 95% 置信区间;该区间可改写为 分钟。虽然现有呼叫中心设计似乎具有更小的期望响应时间,但由于置信区间包含 0,该差异在统计上并不显著。假设大于 0.25 分钟的差异被认为具有实际显著性,因此我们希望做足够多的重复以获得 。例 1 中所用的置信区间形式为 ,具体取值为 ,以及 。为获得所需的精度,我们需要找到满足下式的
我们可以通过寻找满足 且满足下式的最小整数 来近似求解
代入 与 ,得到
这意味着需要 238 次重复,比初始实验多 228 次。www.bcnn.net 上提供了 300 次重复的数据,鼓励读者去检验这一结果。
2 多个系统设计的比较
假设仿真分析人员希望比较 K 个备选的系统设计。比较将基于系统 的某个指定性能度量 来进行,。已经发展出许多不同的统计程序,可用于分析仿真数据并作出关于参数 的统计上可靠的推断。这些程序可分为固定样本量(fixed-sample-size)程序与序贯抽样(sequential-sampling,或称多阶段)程序。
在第一类程序中,使用预先确定的样本量(即运行长度与重复次数),通过假设检验或置信区间作出推断。固定样本量程序的例子包括:均值性能度量的区间估计,以及两个系统均值性能度量之差的区间估计[如第 1 节中的表达式 (1)]。固定样本量程序的优点包括:在开展实验之前,其以计算机时间计的成本是已知的或易于估计的。当计算机时间有限,或正在进行一项预研(pilot study)时,固定样本量程序可能是恰当的。在某些情况下,明显处于劣势的系统设计可以在这一早期阶段就被排除。一个主要缺点是:可能得不出强有力的结论。例如,置信区间可能过宽而无实用价值,因为区间宽度是点估计量精度的指示。假设检验可能导致无法拒绝原假设,这一般是一个弱结论,意味着无论原假设为真还是为假,都没有强有力的证据。
序贯抽样方案是指:不断收集越来越多的数据,直至得到一个具有预先规定精度的估计量,或者直至从若干备选方案中选出一个,且正确选择的概率大于预先规定的值。两阶段(或多阶段)程序是指:用初始样本来估计还需要多少补充观测,才能以规定的精度得出结论。第 1.3 节给出了一个用于估计两个系统性能度量的两阶段程序的例子。
应当使用哪一种合适的程序,取决于仿真分析人员的目标。可能的目标如下:
估计每一个参数 ;
把每一个性能度量 与一个对照 作比较(其中 可以表示现有系统的均值性能);
所有两两比较 ,;
选择最佳的 (最大或最小)。
前三个目标将通过构造置信区间来实现。这类置信区间的个数分别为 、 和 。Hochberg 与 Tamhane [1987] 以及 Hsu [1996] 是关于这类多重比较(multiple comparison)程序的详尽参考文献。第四个目标需要使用一类称为多重排序与选择(multiple ranking and selection)程序的统计程序。Kleijnen [1975,第 II 章与第 V 章] 讨论了实现这些目标及其他目标的程序,并讨论了它们的相对优缺点。Goldsman 与 Nelson [1998] 以及 Law [2007] 讨论了与仿真最相关的那些选择程序。Bechhofer、Santner 与 Goldsman [1995] 是一份详尽的参考文献。下一小节给出一个可用于实现目标 1、2、3 且在很广的情形下都适用的固定样本量程序。第 2.2 小节给出一个实现目标 4 的程序。
2.1 多重比较的 Bonferroni 方法
假设计算了 C 个置信区间,第 个区间的置信系数为 。令 表示"第 个置信区间包含所估计的参数(或两个参数之差)“这一陈述。对给定的一组数据,这一陈述可能为真也可能为假,但导出该区间的程序设计使得陈述 将以概率 为真。当希望对若干参数同时作出陈述时(如目标 1、2、3),分析人员希望对所有陈述同时为真有较高的把握。Bonferroni 不等式指出
其中 称为总体错误概率(overall error probability)。表达式 (16) 可以改写为
或等价地,
于是, 提供了作出错误结论之概率的上界。要开展一项涉及 C 次比较的实验,首先选定总体错误概率,比如 或 。各个 可以选为相等的 ,也可以按需取为不相等。 的值越小,第 个置信区间就越宽。例如,若构造两个 95% 置信区间 0.05),总体置信水平将为 90% 或更高 。若构造十个 95% 置信区间 ,所得到的总体置信水平可能低至 50%,这远低于实用的要求。为在进行 10 次比较时保证 95% 的总体置信水平,一种做法是为所关心的参数(或差值)构造十个 99.5% 的置信区间。
多重置信区间的 Bonferroni 方法以表达式 (16) 为基础。它的一个主要优点是:无论各备选设计的模型是用独立抽样运行还是用公共随机数运行,它都成立。
Bonferroni 方法在进行大量比较时的主要缺点是每一个单独区间的宽度都会增加。例如,对于给定的一组数据和较大的样本量,99.5% 置信区间将是 95% 置信区间长度的 倍。对于小样本量,比如说样本量为 99.5% 置信区间将是单个 95% 置信区间的 倍。置信区间的宽度是估计精度的度量。由于这些原因,建议只在比较次数较少时使用 Bonferroni 方法。20 次左右似乎是其实际的上限。
对应于目标 1、2、3,在比较 K 个备选系统设计时,使用 Bonferroni 不等式 (16) 至少有三种可能的方式:
单独的置信区间:利用表达式 为参数 构造 置信区间,此时区间个数为 。如果使用的是独立抽样,这 K 个置信区间将相互独立,因此总体置信水平将是 ,它比表达式 (16) 的右侧更大,但大不了多少。这类程序最常用于估计单一系统的多个参数,而不是用于比较系统;由于来自同一系统的多个参数估计很可能是相关的,因此通常需要 Bonferroni 不等式。
与现有系统比较:把所有设计与某一个特定设计作比较,通常是与现有系统作比较。即,利用表达式 (1) 为 构造 。(假定系统 1 的性能度量 为现有系统。)在这种情形下,区间个数为 。这类程序最常用于把若干个竞争方案与现行系统作比较,以了解哪些更好。
所有两两比较:把所有设计彼此作比较。即,对任意两个系统设计 为 构造 置信区间。有 K 个设计时,所计算的置信区间个数为 。总体置信系数的下界为 (这由表达式 (16) 推出)。通常认为,CRN 会使真实的总体置信水平大于表达式 (16) 的右侧,且通常大于独立抽样时的水平。可以把表达式 (16) 的右侧看作给出了最坏的情形,即可能达到的最低总体置信水平。
例 2
重新考虑例 1 的呼叫中心设计问题。备选的系统设计如下:
a. C:现有系统(各自独立的话务员队列);
b. P7:7 名交叉培训话务员的系统(单一队列);
c. P6:6 名交叉培训话务员的系统(单一队列)。
利用表 2 中的数据,将为 和 构造置信区间,使总体置信水平为 95%。回顾一下,所有模型都使用了 CRN,但这并不影响总体置信水平,因为如前所述,无论数据在统计上独立还是相关,Bonferroni 不等式 (16) 都成立。
由于总体错误概率为 ,且要构造 个置信区间,取 。然后用经过适当修改的表达式 (1) 构造 个置信区间,其中 ,自由度 。值 由附录表 A.5 插值得到;点估计与标准误差取自表 2。
三个置信区间(总体置信系数至少为 95%)由下式给出
或
仿真分析人员有较高的把握(至少 95%)相信三条置信陈述都正确。注意 的置信区间仍然包含零;因此,现有设计与拥有 7 名交叉培训话务员的备选方案之间不存在统计上显著的差异,这一结论支持了例 1 中先前的结果。其余置信区间完全位于 0 的左侧,表明 C 与 P7 都优于 P6。
本章末的部分习题提供了比较 CRN 与独立抽样、以及在 Bonferroni 方法下计算同时置信区间的机会。
2.2 选择最佳方案
假设有 K 个系统设计,第 个系统性能的未知期望值为 。我们关心哪一个系统设计最佳,其中"最佳"是指 最大或最小,取决于具体的问题。例如,在例 3 中我们将比较《绝对性能估计》一章中所描述的半导体制造设施的 个设计,其中 是第 个设计下某一个产品族的稳态平均周期时间,而 越小越好。我们希望有一种能够处理很大 K(比如说 100 量级)的程序。
令 B 表示最佳系统设计的(未知)下标。真实差异 $| \theta_{B} - \theta_{i} | , i \neq B $ 越小,并且我们越想确保找到最佳系统,那么实现目标所需的重复次数就越多。因此,我们不去要求无论如何都必须找到最佳设计 B,而是作出折中:当系统 B 与其他系统之间的差异足够大时,以高概率找到 B。更准确地说,我们希望:只要 $| \theta_{B} - \theta_{i} | \geq \epsilon $ 对所有 成立(其中 取决于具体问题),选到最佳系统的概率就至少为 。如果存在与最佳方案相差在 以内的系统,那么选到最佳方案或其中任一接近最佳的设计,我们都会感到满意。正确选择的概率 与具有实际显著性的差异 都在我们的掌控之下。
下面的程序通过两个阶段的仿真来实现这一目标:在第一阶段,从每一个系统设计各获得 次重复。那些在统计上显著劣于其他系统的系统被筛选掉,即它们以 的置信度被排除,不再作进一步考虑。如果筛选后仍有不止一个系统存活,那么存活者获得足够的追加重复,以便以 的置信度选出最佳者,或与最佳者相差在 以内的某个系统设计。于是,利用与 Bonferroni 不等式有关的推理,所选出的系统在筛选与选择两者的组合下,以至少 的置信度是最佳系统或接近最佳的系统。
第一阶段的筛选可能非常重要,因为正如例 3 将要说明的,第二阶段为选出最佳方案所需的重复次数可能相当大,而没有理由把时间和精力浪费在明显没有竞争力的系统设计上。当 K 很大时,这一点尤为重要。
下面的程序在 SimulationTools.xls 中实现,该文件可从 www.bcnn.net 获取。SimulationTools.xls 的实现会引导用户了解每一阶段需要获得哪些数据。
选择最佳方案程序(Select-the-Best Procedure)
- 指定所需的正确选择概率 、具有实际显著性的差异 、初始重复次数 ,以及竞争系统的个数 K。令
并取得 Rinott 常数 。[提示:这两个临界值都由 SimulationTools.xls 自动计算;附录中给出了 t 和 h 的小规模数值表。]
- 对每个系统做 次重复。计算第一阶段的样本均值与样本方差
对 。
- 计算筛选阈值
对所有 。
(a) 若越大越好,则构造存活子集 ,使其包含满足下式的每一个系统设计
也就是说,保留每一个样本均值比其他任何系统的样本均值小不超过 的系统 。
(b) 若越小越好,则构造存活子集,使其包含满足下式的每一个系统设计
也就是说,保留每一个样本均值比其他任何系统的样本均值大不超过 的系统 。
- 若该集合只包含一个系统,则停止并返回该系统作为最佳系统。否则,对 中的所有设计 ,计算第二阶段样本量
其中 表示向上取整。
从 中的所有系统 再取 次追加重复;或者,如果更方便的话,从头开始从系统 获得总共 次重复。
计算总样本均值
对 中的所有 。若越大越好,则选择 最大的系统为最佳。否则选择 最小的系统为最佳。
临界值 t 与 h 通常无法直接从表中查得,因此常常需要插值。作为一种替代,多数的数值分析软件和电子表格软件都提供了计算 t 分布分位数的算法;遗憾的是,Rinott 常数 h 却不是这样。因此,强烈建议使用 SimulationTools.xls 来执行这一程序。
Nelson 等人 [2001] 证明:只要数据服从正态分布且各系统独立仿真,选择最佳方案程序就能以至少 的置信水平找到具有最大或最小 的系统,或找到与最佳 相差在 以内的系统。如果应用了 CRN,该程序同样有效。
例 3
回顾《绝对性能估计》一章中 FastChip 公司的半导体制造例子。FastChip 公司希望用仿真来设计一个新的"晶圆厂”(fab),评估在两种不同产品(称为 C 芯片与 D 芯片)的某种特定装载下所能期望得到的稳态平均周期时间(从晶圆投料到完工的时间)。我们在《绝对性能估计》一章中所评价的那个系统设计实际上是一个基准情形,此外还有七个备选设计,它们来自对制造过程中某些步骤实施方式的不同选择;这些步骤称为清洗(Clean)、装石英(Load Quartz)、氧化(Oxidize)、卸石英(Unload Quartz)、涂胶(Coat)和显影(Develop)。问题是:哪一个设计带来最小的稳态平均周期时间?我们将关注 C 芯片的周期时间,并使用在那里得到的预热期和运行长度。

图 5 SimulationTools.xls 中选择最佳方案程序的输入界面。
包括基准情形在内共有 个系统设计,性能度量 是各设计下 C 芯片的稳态平均周期时间。FastChip 认定即使是很小的周期时间改善也很重要,因此他们设定 小时(即 9 分钟)。当周期时间平均在 45 小时左右时,这是一个非常严格的要求,我们将在下面看到这一选择的后果。FastChip 希望有 95% 的把握选到最佳设计,或选到与最佳设计相差 9 分钟以内的设计。图 5 显示了在 SimulationTools.xls 中设置该问题的输入界面,其中用"无差异水平"(indifference level)一词来表示具有实际显著性的差异 。
表 3 包含从每个系统设计的 次重复中得到的第一阶段结果。调整氧化步骤的那个备选方案似乎给出了最小的平均周期时间,但所有备选方案看起来都很接近。本例的完整数据可从 www.bcnn.net 获取。
筛选所需的 t 值为
表 3 FastChip 仿真的第一阶段数据
| 方案 | 基准 1 | 清洗 2 | 装石英 3 | 氧化 4 | 卸石英 5 | 涂胶 6 | 步骤 7 | 显影 8 |
|---|---|---|---|---|---|---|---|---|
| 46.86 | 45.70 | 47.23 | 45.13 | 46.80 | 47.81 | 47.41 | 46.94 | |
| 0.21 | 0.37 | 0.29 | 0.09 | 0.28 | 0.98 | 0.12 | 0.28 |
表 4 FastChip 仿真的筛选阈值
| 方案 | 基准 1 | 清洗 2 | 装石英 3 | 氧化 4 | 卸石英 5 | 涂胶 6 | 步骤 7 | 显影 8 |
|---|---|---|---|---|---|---|---|---|
| 46.86 | 45.70 | 47.23 | 45.13 | 46.80 | 47.81 | 47.41 | 46.94 | |
| 0.60 | 0.74 | 0.68 | 0.67 | 1.13 | 0.50 | 0.67 | ||
| 45.58 | 45.72 | 45.66 | 45.65 | 46.11 | 45.48 | 45.65 |
该子集总会包含样本最优系统,这里是系统 (氧化)。为避免被筛选掉,其他系统的样本均值必须足够小,以满足 对所有 ,特别是满足 。表 4 给出了阈值 max ;只有样本均值为 45.70 小时的备选方案 2 小到足以存活,因此 。为了确定备选方案 2 和 4 的第二阶段样本量,我们需要 ,它可以由 SimulationTools.xls 获得。于是 ,。因此,备选方案 2 需要追加 次重复,而备选方案 4 需要追加 次重复。注意备选方案 2 的重复次数相当大。一般而言,如果样本方差大(使得差异难以探测),或者 很小(连很小的差异也要计较,如本例所示),第二阶段样本量就会很大。
在获得追加重复之后,,;因此选择备选方案 4,即氧化。该程序保证:以 95% 的置信度, 是 8 个备选方案中最小的稳态平均周期时间;或者,如果它不是,那么它与最佳值相差在 小时以内。
这里所介绍的选择最佳方案程序同时执行筛选与选择。这使它特别适用于从大量备选方案中寻找最佳系统设计,因为其中许多方案可能在第一阶段就被筛选掉。如果目标是淘汰那些没有竞争力的设计,该程序也可以只用于筛选而不作选择。当我们希望基于均值性能之外的准则,从一组有竞争力的备选方案中作出选择时,这样做可能是值得的。若只作筛选,程序在第 3 步停止,并可使用临界值
它给出的筛选稍紧一些。
类似地,如果系统设计个数 K 较小,且目标是选出最佳者,那么可以跳过筛选,让所有系统都获得第二阶段重复。若只作选择,则跳过第 3 步,并使用稍小一些的临界值 。
3 元建模
假设存在一个仿真输出响应变量 Y,它与 k 个自变量,比如说 相关。因变量 Y 是一个随机变量,而自变量 称为设计变量(design variable),通常受控。变量 Y 与 x 之间的真实关系由那个往往相当复杂的仿真模型所表示。我们的目标是用一个更简单的数学函数——称为元模型(metamodel)——来近似这一关系。在某些情况下,分析人员知道 Y 与 之间函数关系的确切形式,比如说
。然而在大多数情况下,函数关系是未知的,分析人员必须选取一个含有未知参数的合适的 f,然后从一组数据 中估计这些参数。回归分析(regression analysis)就是估计这些参数的一种方法。
例 4
一家保险公司承诺:每天收到的所有索赔都在次日结束之前处理完毕。该公司为其拟建的索赔处理系统建立了一个仿真模型,用以评估兑现这一承诺有多困难。每天需要处理的索赔的实际数量和类型各不相同,而且数量可能随时间增长。因此,该公司希望有一个模型,能把总处理时间预测为所收到索赔数量的函数。
元模型的主要价值在于使"如果……会怎样"(what-if)类问题易于回答,例如在索赔数量为 x 时处理时间会是多少。在若干个 x 值上计算函数 f(或许还包括它的导数),通常要比对每一个取值都做一次仿真实验容易得多。
3.1 简单线性回归
假设希望估计单个自变量 x 与因变量 Y 之间的关系,并假设 Y 与 x 之间的真实关系被推测为线性的。在数学上,对于给定的 x 值,Y 的期望值被假定为
其中 是 Y 轴上的截距,一个未知常数; 是斜率,即 x 变化一个单位时 Y 的变化量,也是一个未知常数。进一步假定 Y 的每一次观测都可以由如下模型描述
其中 ε 是一个均值为零、方差为常数 的随机误差。由式 (18) 给出的回归模型只含单个变量 x,通常称为简单线性回归模型(simple linear regression model)。
假设有 n 对观测值 。可以用这些观测值来估计式 (18) 中的 和 。通常采用最小二乘法(method of least squares)来构造估计。在最小二乘法中,对 和 的估计要使观测值与回归线之间偏差的平方和最小。式 (18) 中的各次观测可写为
其中 被假定为不相关的随机变量。
式 (19) 中的每一个 由下式给出
它表示观测到的响应 与由式 (17) 中模型所预测的期望响应 之间的差。图 6 展示了 与 和 $ E ( Y_{i} | x_{i} ) $ 之间的关系。

图 6 与 及 $ E ( Y_{i} | x_{i} ) $ 之间的关系。
式 (20) 所给出的偏差平方和为
而 称为最小二乘函数(least-squares function)。把 改写如下会比较方便:
其中 ,。式 (22) 常称为变换后的线性回归模型(transformed linear regression model)。利用式 (22),式 (21) 变为
为使 最小,求 和 ,令二者为零,解出 和 。取偏导数并令其为零,得到
方程组 (23) 常称为正规方程组(normal equations),其解为
以及
为便于计算,式 (25) 的分子改写为
其中 表示 x 与 Y 的修正交叉乘积和。为便于计算,式 (25) 的分母改写为
其中 表示 x 的修正平方和。 的值可容易地由下式还原
例 4 中索赔处理系统的仿真模型在前一天收到 x = 100、150、200、250 和 300 件索赔的初始条件下运行。每种设定下取得 3 次重复。响应 Y 是处理 x 件索赔所需的小时数。结果如表 5 所示。所收到索赔数量与总处理时间之间的图形关系如图 7 所示。考察这一散点图可知,索赔数量与处理时间之间存在很强的关系。对由式 (18) 给出的线性模型所作的初步假定看来是合理的。
表 5 给定 x 件索赔时处理时间的仿真结果
| 索赔数量 x | 处理时间(小时)Y |
|---|---|
| 100 | 8.1 |
| 100 | 7.8 |
| 100 | 7.0 |
| 150 | 9.6 |
| 150 | 8.5 |
| 150 | 9.0 |
| 200 | 10.9 |
| 200 | 13.3 |
| 200 | 11.6 |
| 250 | 12.7 |
| 250 | 14.5 |
| 250 | 14.7 |
| 300 | 16.5 |
| 300 | 17.5 |
| 300 | 16.3 |

图 7 索赔数量与处理时间(小时)之间的关系。
以处理时间作为 值(因变量),以索赔数量作为 值(自变量), 和 可由下列计算求得:
以及 。由式 (26), 计算为
由式 (27), 计算为
然后,由式 (25) 计算 为
如式 (24) 所示, 就是 即
为了用原始的项来表达模型,由式 (28) 计算 为
于是,给定 x 时 Y 的均值 $ E ( Y | x ) $ 的估计由下式给出
对于给定的索赔数量 x,该模型可用于预测处理它们所需的小时数。系数 的解释是:每多收到一件索赔,期望总处理时间就增加约 0.0464 小时,即 2.8 分钟。
回归分析被广泛使用,也经常被误用。这里简要提及若干常见的误用之处。以式 (29) 的方式导出的关系,只对处于原始数据范围之内的自变量取值有效。初步假定的线性关系在原始范围之外可能并不成立。事实上,我们从排队论知道:当索赔数量接近系统容量时,平均处理时间可能迅速上升。因此,式 (29) 只能认为对 有效。不建议把回归模型用于外推。
在选择变量时应当谨慎,要让它们之间具有貌似合理的因果关系。完全有可能建立起在实际意义上毫不相干的统计关系。例如,也许有人试图把某钢铁厂的月产量与该月出现在某经理办公桌上的报告重量联系起来。一条直线对这些数据而言可能看似提供了很好的模型,但这两个变量之间的关系是脆弱的。观察到的强关系并不意味着变量之间存在因果关系。只有当分析揭示了其存在的某些合理原因时,才能推断出因果关系。在例 4 中,“从更多的索赔开始意味着需要更多时间来处理它们"是合理的。因此,式 (29) 这种形式的关系至少是貌似合理的。
回归的显著性检验
在第 3.1 节中,曾假定 Y 与 x 之间存在线性关系。在例 4 中,为在计算 和 之前评估线性模型是否是一个合理的初步假定,绘制了如图 7 所示的、联系索赔数量与处理时间的散点图。然而,在利用该模型由自变量 预测响应 之前,应当检验简单线性关系的充分性。可以进行若干检验来帮助确定模型的充分性。检验所初步假定的模型阶次是否正确,通常称为失拟检验(lack-of-fit testing)。
回归的显著性检验提供了评估模型充分性的另一种手段。特别地,检验所估计的回归系数 和 是否在统计上不同于 0 是必不可少的;对于下面将要介绍的多元线性回归而言尤其如此——那时元模型中包含大量的设计变量 x,但并不确定它们是否都具有实质性的解释作用。
显著性与失拟的检验包含在所有回归软件之中。关于这些检验的细节,参见 Box 与 Draper [1987]、Hines 等人 [2002] 以及 Montgomery [2000]。
多元线性回归
如果第 3.1 节中的简单线性回归模型不充分,还存在若干其他可能。可能存在多个自变量,使关系具有如下形式
注意,这个模型仍然是线性的,但含有多于一个自变量。具有式 (30) 所示形式的回归模型称为多元线性回归模型(multiple linear regression model)。另一种可能是模型具有二次形式,例如
式 (31) 也是一个线性模型,令 和 即可把它变换为式 (30) 的形式。还有一种可能,模型具有如下形式
它同样是一个线性模型。对这三种形式及相关模型的分析,可见 Box 与 Draper [1987]、Hines 等人 [2002]、Montgomery [2000] 以及其他应用统计学教材;也可参见 Kleijnen [1987, 1998],后者主要关注这些模型在仿真中的应用。
3.2 元建模与计算机仿真
第 3.1 节的内容适用于一般的回归元建模,而不仅仅适用于计算机仿真。然而,当目标是为一次计算机仿真提供元模型时,会出现一些特殊的问题与机遇;下面对此加以说明。
回归中的随机数分配
随机数种子或流的分配是仿真实验设计的一部分。(本节基于 Nelson [1992]。)给不同的设计点(多元线性回归中 的设定)分配不同的种子或流,可以保证来自不同设计点的响应 Y 在统计上独立。同理,给不同的设计点分配相同的种子或流,会由于它们都具有相同的随机性来源而在相应响应之间诱发相关性。
许多教科书中的实验设计都假定各设计点之间的响应独立。为符合这一假定,我们必须给每个设计点分配不同的种子或流。然而,把相同的随机数种子或流分配给所有设计点——换句话说,使用公共随机数——往往是有用的。
在元模型中使用公共随机数的直觉是:如果各设计点受到相同的实验条件,特别是相同的随机性来源的作用,那么就能在各设计点之间实现更公平的比较。其数学依据如下:假设我们拟合简单线性回归 并得到最小二乘估计 和 。那么,设计点 i 与 j 之间性能期望之差的一个估计量为
当 和 是固定的设计点时, 决定了设计点 i 与 之间(或者就此而言,x 的任意其他两个取值之间)的估计差异。因此,可以预期公共随机数会降低 的方差,更一般地说,会降低多元线性回归中所有斜率项的方差。公共随机数通常不会降低截距项 的方差。无论是否使用公共随机数,最小二乘估计量 和 都是恰当的,但与之相联系的统计分析会受这一选择的影响。关于公共随机数下元模型的统计分析,参见 Kleijnen [1988] 和 Nelson [1992]。
排队仿真
许多计算机仿真模型所针对的系统包含排队或排队网络,这些仿真的元模型可能包含与容量(服务台数量和服务率)以及顾客负荷(到达率)有关的设计变量。这类模型违背了第 3.1 节所描述的标准回归假定。一个小例子可以说明这些困难和可能的解决办法。
回顾 排队:一个单服务台、先来先服务的排队,到达过程为速率 λ 顾客/时间的泊松过程,服务时间服从速率 顾客/时间的指数分布。令 ,即所谓利用率 。那么,当 时,队列中顾客的稳态期望数为
现在假设我们并不知道关系式 (32),而试图通过运行 排队的仿真来为 上的 L 建立一个元模型。显然,通常的低阶多项式模型(只含上面提到的 x 和 项)拟合得不会很好,特别是当 x 接近 1 时,此时高阶项变得重要。
这一问题至少有两种解决办法。一种是把设计空间(本例中为 )分解成若干较小的片段,使得低阶多项式在每一片段上是充分的。第二种办法是拟合一个由排队论所启发的非线性模型。Yang、Ankenman 与 Nelson [2007] 指出
其中 ,对许多排队输出 Y(包括队列平均人数和队列平均时间)都效果良好。注意,未知参数是 m、 和 ,因此需要非线性最小二乘法来拟合它们(Bates 与 Watts [1988])。当 Y 是队列中平均人数(即 L 的一个估计量)时,,且 。
遗憾的是,问题还要更深一层。如果我们通过做一次长度为 时间单位的仿真运行来估计 L,并记录队列中的平均顾客数(记为 Y),那么可以证明(Whitt [1989])
因此,方差并非如回归中所假定的那样在整个设计空间上保持恒定,而是随着 x 趋近于 1 而增大,且是爆炸式地增大。其结果是,一次长度为 时间单位的运行在 处可能给出 L 的相当好的估计,但在 处给出的估计则非常差。当响应方差强烈依赖于 x 时,回归软件所产生的标准统计推断将是无效的,这意味着我们可能察觉不到失拟或拟合不良。
针对回归中响应方差不相等的一种补救办法,是对数据施加一个方差稳定化变换,使方差在整个设计空间上更接近恒定。在仿真中,我们可以直接处理这一问题:根据 x 的不同而采用不同的运行长度 或不同的重复次数。
我们建议把 的结果用作更一般的排队网络的粗略指南。若令 x 表示网络利用率,即负荷最重的那个队列的利用率,则近似式 (34) 意味着:在两个设计点 和 处的运行长度 和 应满足
例如,如果我们要在利用率 处仿真 个时间单位,那么为了稳定方差,在 处就大约需要 个时间单位,在 处需要 个时间单位,在 处需要 个时间单位,在 处需要 , 944 个时间单位。
其核心信息是:在排队仿真中,如果元模型包含影响顾客负荷的决策变量——通过改变到达率、服务率或服务台数量——那么低阶多项式可能不是元模型的好选择;而且若不施行运行长度控制,就不能假定响应方差在整个设计空间上相等。
4 基于仿真的优化
考虑下面的例子。(其中部分描述基于 Boesel、Nelson 与 Ishii [2003]。)
例 6:物料搬运系统(MHS)
工程师需要设计一个 MHS,它由一台大型自动化存储与检索设备、自动导引车(AGV)、AGV 站点、升降机和输送带组成。他们可以控制的设计变量包括 AGV 的数量、每辆 AGV 的载重,以及用于调度 AGV 的路由算法。备选设计将根据 AGV 利用率、需要搬运的物料的运输延迟,以及总体投资与运营成本来评价。
例 7:液化天然气(LNG)运输
一个 LNG 运输系统由 LNG 运输船以及装载、卸载和储存设施组成。为了使成本最小,设计者可以控制运输船的尺寸、投入使用的运输船数量、装卸设施的泊位数量以及储罐的容量。
例 8:汽车发动机装配
在一条装配线上,工作站之间的大缓冲区(队列)可以提高工作站的利用率——因为往往会有东西等着被加工——但会推高对空间的需求和在制品库存。我们希望找到一种缓冲区容量的分配方案,使这些相互竞争的成本之和最小。
例 9:交通信号配时
土木工程师希望对某繁忙路段沿线的交通信号进行排序,以减少驾驶员延误以及狭窄交叉街道上发生的拥堵。对每一个交通信号,红灯、绿灯和绿色转向箭头信号的周期长度都可以分别设定。
例 10:在线服务
一家通过互联网提供在线信息服务的公司正在把其计算机体系结构从集中式大型机改为分布式工作站计算。CPU 的数量与类型、网络结构以及处理任务的分配都需要作出选择。对客户查询的响应时间是关键的性能度量。
这些设计问题有什么共同点?显然,仿真模型在每一个问题中都可能有用,而且它们都有一个隐含的目标:相对于某些性能度量(成本、延误等)找到最佳设计。在每一个例子中,备选设计的数量可能都非常庞大,从几十个到几千个不等,肯定多于我们在第 2.2 节中所考虑的 2 到 100 个。其中有些例子包含种类繁杂的决策变量:离散的(AGV 的数量、CPU 的数量)、连续的(运输船的尺寸、红灯周期的长度)和定性的(路由策略、分配处理任务的算法)。这使得如第 3 节所述的建立元模型变得困难。
所有这些问题都属于"基于仿真的优化”(optimization via simulation)这一总主题之下,其目标是最小化或最大化某些系统性能度量,而系统性能只能通过运行计算机仿真来评价。基于仿真的优化是一个相对较新但已经十分庞大的主题,商业软件也已得到广泛使用。在本节中,我们描述开展基于仿真的优化时应当考虑的关键问题,给出一些可查阅文献的指针,并给出一个示例算法。
4.1 “基于仿真的优化"意味着什么?
优化是运筹学与管理科学工作者使用的一个关键工具,对许多类别的问题都有成熟的算法,其中最著名的是线性规划。优化方面的多数工作处理的是这样一些问题:系统的所有方面都被视为确定已知的;最关键的是,任何设计的性能(成本、利润、制造周期等)都可以被精确评价。
在随机的离散事件仿真中,任何一次仿真运行的结果都是一个随机变量。为便于记号表达,令 为 m 个可控的设计变量,令 为一次运行中所观察到的仿真输出性能。具体地说,在例 6 中, 可以分别表示 AGV 的数量、每辆 AGV 的载重以及用于调度 AGV 的路由算法,而 可以是 MHS 的购置与运营总成本。
相对于 去"优化 “意味着什么?由于 Y 是一个随机变量,我们无法优化 Y 的实际取值。最常见的优化定义是
换句话说,最大化或最小化性能的数学期望,即长期平均值。这是我们所知的所有商业软件包使用的默认优化定义。在我们的例子中, 是在有 每辆 的载重以及路由算法 的条件下,运营该 MHS 的期望(即长期平均)成本。
应当指出,式 (35) 并不是唯一可能的定义。例如,我们可能希望选择那个最有把握使购置与运营成本低于 $ D 的 MHS 设计,从而把目标改为
我们可以通过定义一个新的性能度量
并转而最大化 ,把这个目标纳入式 (35) 的形式。
当我们希望选择那个最可能成为最佳方案的系统设计时,就出现了一个更复杂的优化问题。当所关心的是一次性(one-shot)而非长期平均性能时,这样的目标是恰当的。例子包括一次航天飞机的发射,或某笔独特的、大批量的订单的交付。Bechhofer、Santner 与 Goldsman [1995] 在"多项选择”(multinomial selection)这一主题下讨论了这一问题。
我们一直假定一个系统设计 可以用单一的性能度量 Y(例如成本)来评价。显然,情况未必总是如此。在 MHS 的例子中,我们可能也对某种系统生产率的度量(例如吞吐量或周期时间)感兴趣。目前,基于仿真的多目标优化还不成熟。因此,通常采用下列三种策略之一:
把所有性能度量合并成一个度量,最常见的是成本。例如,MHS 中每件完工产品所产生的收入可以代表生产率,并作为一项负成本计入。
针对一个关键性能度量进行优化,然后对排名靠前的解按次要性能度量进行评价。例如,可以针对期望成本优化 MHS,然后对前 5 个设计比较其周期时间。这种方法要求保留的信息不仅仅是最佳解。
针对一个关键性能度量进行优化,但只考虑那些在其他性能度量上满足某些约束的备选方案。例如,可以针对期望成本优化 MHS,但只限于那些期望周期时间低于给定阈值的备选方案。
最后,系统设计变量 通常还存在约束。在例 10 的在线服务中,会有一个预算约束限制所能购买的工作站数量。复杂的、尤其是非线性的约束会使可行空间更难以搜索。在某些情况下,约束和目标函数一样无法被确定地评价,而必须由仿真来估计。例如,这家在线服务公司可能希望最小化总体客户响应时间,但他们可能必须在"某个特定(比如说政府)客户的平均响应时间低于某一水平"这一约束之下来做到这一点。
4.2 为什么基于仿真的优化很困难?
即使不存在不确定性,如果设计变量很多,如果问题包含种类繁杂的设计变量类型,或者如果对性能函数的结构知之甚少,优化也可能非常困难。基于仿真的优化又增加了一重复杂性:某一个特定设计的性能无法被精确评价,而只能被估计。因为我们只有估计值,所以无法有把握地断定一个设计优于另一个设计,而这种不确定性会挫败那些试图朝改进方向推进的优化算法。原则上,可以通过在每个设计点做极多次的重复或极长的运行,使性能估计实质上没有方差,从而消除这一复杂性。但在实践中,这可能意味着由于仿真每一个设计都要花费时间,因而只能探索极少的备选设计。
抽样变异性的存在迫使基于仿真的优化作出折中。以下是几种标准的折中:
保证预先规定的正确选择概率。第 2.2 节中的选择最佳方案程序就是这类方法的一个例子,它允许分析人员规定希望有多大机会做对。这类算法通常要么要求仿真每一个可能的设计,要么要求各设计之间存在很强的函数关系(如元模型)。其他算法可见 Goldsman 与 Nelson [1998] 以及 Kim 与 Nelson [2006]。
保证渐近收敛。有许多算法可以保证:当仿真工作量(重复次数、重复长度)趋于无穷时,算法收敛到全局最优解。这些保证是有用的,因为它们表明该算法往往会到达分析人员希望它去的地方。然而,收敛可能很慢,而且当算法在有限时间内终止时(在实践中必定如此),对所报告的解究竟有多好,往往没有任何保证。关于适用于离散或连续变量问题的具体算法,参见 Andradóttir [1998]。
对确定性对应问题最优。这里的思路是:使用一种算法,如果每个设计的性能都能够被确定地评价,那么该算法就能找到最优解。一个例子可能是把标准的非线性规划算法应用于仿真优化问题。通常需要由分析人员来确保投入了足够的仿真工作量(重复次数或运行长度),以保证这类算法不被抽样变异性所误导。不建议把一种假定确定性评价的算法直接应用于随机仿真。
鲁棒启发式。许多启发式方法是针对确定性优化问题发展起来的,它们并不保证找到最优解,但已被证明在困难的实际问题上非常有效。其中有些启发式把随机性作为其搜索策略的一部分,因此可以说它们对抽样变异性不像其他类型的算法那么敏感。尽管如此,仍然重要的是要确保投入足够的仿真工作量(重复次数或运行长度),以保证这类算法不被抽样变异性所误导。
鲁棒启发式是商业化的基于仿真的优化软件中最常见的算法。我们在下一节中就其使用给出一些指导。关于优化理论与实践的全面讨论见 Fu [2002];关于鲁棒启发式的更多内容见 Olafsson [2006]。
4.3 使用鲁棒启发式
所谓"鲁棒启发式”(robust heuristic),我们指的是这样一种程序:它不依赖强的问题结构(例如 的连续性或凸性)就能有效,可以应用于具有混合类型决策变量的问题,并且在理想情况下能够容忍一定的抽样变异性。遗传算法(genetic algorithm, GA)和禁忌搜索(tabu search, TS)是两个突出的例子,但还有许多其他算法及其众多变体。这类启发式构成了大多数商业实现的核心。为了让读者对这些启发式有所感受,下面介绍 GA 与 TS。我们要提醒读者:这里只给出每种程序最简单版本的高层次描述,商业实现要复杂得多。
假设基于仿真的优化问题有 个可能的解。令 表示这些解,其中第 个解 给出 m 个决策变量的具体设定。解 处的仿真输出记为 ,它可以是一次重复的输出,也可以是若干次重复的平均。我们的目标是找到使 最小的解 。
在每一次迭代(称为一代,generation)中,GA 对一个由 个解组成的"种群"(population)进行操作。把第 次迭代上的解的种群记为 。 中可能有同一个解的多份副本,也可能包含在先前迭代中所发现的解。从一次迭代到下一次迭代,这个种群以如下方式演化:好的解倾向于存活并产生新的、有望更好的解,而劣解倾向于被从种群中移除。下面给出基本的 GA。
基本遗传算法(GA)
步骤 1. 置迭代计数器 ,并(也许是随机地)选择一个由 个解组成的初始种群 。
步骤 2. 运行仿真实验,得到 中所有 个解 的性能估计 。
步骤 3. 从 中的解中选择一个由 个解组成的种群,使得 值较小的解更可能(但并非必然)被选中。把这个解的种群记为 。
步骤 4. 通过交叉(crossover,它把两个解 和 的各一部分连接起来,形成一个新的解)与变异(mutation,它随机地改变一个解 的一部分),对 中的解进行重组。
步骤 5. 令 ,转到步骤 2。
GA 可以在经过规定次数的迭代之后终止,可以在种群中几乎看不到或完全看不到改进时终止,也可以在种群中包含同一个解的 份副本时终止。在终止时,把最后一个种群中 值最小的解 选为最佳;或者,也可以选择所有迭代中 值最小的那个解。
GA 几乎适用于任何优化问题,因为选择、交叉和变异这三种操作都可以用非常通用的方式定义,而不依赖于问题的具体细节。然而,当这些操作没有针对具体问题进行调优时,一个 GA 的进展可能非常缓慢。商业版本往往是自调优的,即它们在搜索过程中更新选择、交叉和变异的参数。有一些证据表明,GA 对 中的抽样变异性是容忍的,因为它们维持着一个解的种群,而不是专注于改进某一个当前最优解。换句话说,GA 是否把种群中各解的排序排得完美并不关键,因为下一次迭代取决于整个种群,而不是取决于某一个解。
另一方面,禁忌搜索(TS)在每一次迭代上识别出一个当前最优解,然后试图改进它。改进通过"移动"(move)改变解来实现。例如,解 可以通过"给第一个决策变量加 1"这一移动变成解 (也许 表示例 中 AGV 的数量,那么这一移动就是再增加一辆 AGV)。解 x 的"邻居"是所有可以通过合法移动到达的解。TS 找出最优的邻居解并移动到它。然而,为了避免那些使搜索回到先前访问过的解的移动,某些移动可能在若干次迭代中成为"禁忌"(tabu,即不可使用)。从概念上讲,想想你会如何走出迷宫:如果你走过一条通向死胡同的路,你就会避免再走那条路——它将是禁忌的。
下面给出基本的 TS 算法。该描述基于 Glover [1989]。
基本禁忌搜索(TS)
步骤 1. 置迭代计数器 ,禁忌移动列表为空。在 X 中选择一个初始解 ,也许是随机地选择。
步骤 2. 在 的所有不能通过禁忌移动到达的邻居中,找出使 最小的解 ,运行完成这一优化所需的任何仿真。
步骤 3. 若 ,则 ;把当前最优解移动到 。
步骤 4. 更新禁忌移动列表,转到步骤 2。
TS 可以在完成了规定次数的迭代时终止,可以在经过了若干次迭代而 未发生变化时终止,也可以在没有更多可行移动时终止。在终止时,把解 选为最佳。
TS 本质上是一个针对离散决策变量的优化器,但连续决策变量可以离散化,如第 4.4 节所述。TS 积极地追寻改进的解,因此往往进展迅速。然而,它对 中的随机变异性更为敏感,因为 被当作迄今为止的真正最优解,并且要在此基础上加以改进。不过,也存在一些概率版本的 TS,它们应当不那么敏感。商业 TS 实现(而基本 TS 不具备)的一个重要特征是:当这样做有利时,有一种机制可以越过禁忌表(tabu list)。
接下来,我们就使用采用 GA、TS 或其他鲁棒启发式的商业产品提出三条建议:控制抽样变异性、重启,以及清理。
控制抽样变异性
在许多情况下,将由用户来决定在每个候选解上进行多少抽样(重复次数或运行长度)。一般而言这是一个困难的问题。理想情况下,抽样量应当随着启发式逼近更好的解而增加,原因很简单:区分期望性能相近的解,要比区分相差很大的解困难得多。在搜索的早期,启发式可能很容易识别出好的解和搜索方向,因为明显处于劣势的解正在与好得多的解作比较;然而到了搜索的后期,情况可能就不是这样了。
如果分析人员必须指定在整个搜索过程中使用的每个解的固定重复次数,那么应当先做一次预实验。仿真若干个设计,有些位于解空间的极端处,有些靠近其中心。用第 1 节中的方法比较这些设计中表面上的最优者与表面上的最劣者。利用第 1.3 节中描述的技术,求出要宣称这些设计在统计上显著不同所需的最小重复次数。这就是所应当使用的最小重复次数。
重启
由于鲁棒启发式并不保证收敛到基于仿真的优化的最优解,因此有理由把优化运行两次或更多次,看哪一次运行给出最好的解。每一次优化运行都应当使用不同的随机数种子或流,并且在理想情况下应当从不同的初始解出发。尝试从解空间极端处的解、空间中心处的解以及随机生成的解开始优化。如果熟悉该系统的人怀疑某些设计会很好,一定要把它们作为启发式可能的起始解包括进来。
清理
在一次或多次优化运行结束之后,关键是要对启发式所识别出的排名靠前的设计再做一组实验,以避免两类错误:未能识别出搜索过程中所仿真的最佳系统设计;以及对最终所选设计性能的估计很差。之所以会出现这些错误,是因为任何优化算法都不可能在每一步都维持统计误差控制的同时还取得进展。因此,我们建议在搜索之后进行"清理"(clean up),也就是运用第 2 节中的比较技术,特别是第 2.2 节中的选择最佳方案程序,做一次严格的统计分析,以评价在搜索过程中所发现的那些设计里哪些是最佳的或接近最佳的。搜索过程中所仿真的系统设计中排名前 5% 到 10% 的那些,都应当接受这一受控实验。“清理"这一概念由 Boesel、Nelson 与 Kim [2003] 提出。
4.4 一个示例:随机搜索
在本节中,我们给出一种称为随机搜索(random search)的基于仿真的优化算法。具体的实现基于 Andradóttir [1998] 中的算法 2,该算法在某些条件下保证渐近收敛。因此,只要允许它运行足够长的时间,它就会找到真正的最优解。然而在实践中,收敛可能很慢,而且这一特定版本的随机搜索对内存的需求可能相当大。尽管随机搜索并不是一种鲁棒启发式,我们还将用它来演示我们在配合这类启发式时会采用的若干策略,并演示为什么即使对于看似并不复杂的算法,基于仿真的优化也很棘手。
我们所给出的随机搜索算法要求可能存在的系统设计数目有限,尽管这个数目可能很大。这似乎排除了具有连续决策变量的问题,例如输送带速度。然而在实践中,表面上的连续决策变量往往可以用合理的方式离散化。例如,如果输送带速度可以是从每分钟 60 到 120 英尺的任意值,那么把可能的输送带速度取为 英尺每分钟(共 61 个可能取值),可能并不会损失什么。但要注意,也有专门为连续变量问题设计的算法(Andradóttir [1998])。
再次地,令基于仿真的优化问题的 个可能解记为 ,其中第 个解 给出 m 个决策变量的具体设定。解 处的仿真输出记为 ;它可以是一次重复的输出,也可以是若干次重复的平均。我们的目标是找到使 最小的解 。
在随机搜索算法的每一次迭代中,我们把当前的一个好的解与一个随机选出的竞争者作比较。如果竞争者更好,那么它就成为当前的好解。当我们终止搜索时,我们选择的是那个被访问次数最多的解——这意味着我们预期会多次回访某些解。
随机搜索算法
步骤 1. 初始化计数器变量 。选择一个初始解 ,并令 [提示: 记录我们访问解 的次数。]
步骤 2. 从除 之外的所有解组成的集合中选取另一个解 ,使每一个解都有相等的被选中机会。
步骤 3. 在两个解 和 处运行仿真实验,得到输出 和 。若 ,则令 。(见步骤 4 之后的注。)
步骤 4. 令 。若尚未完成,则转到步骤 2。若已完成,则选择使 为最大计数的 作为估计的最优解。
注意,如果问题是最大化问题,则用下式替换步骤 3:
步骤 3′. 在两个解 和 处运行仿真实验,得到输出 和 。若 ,则令 。
许多基于仿真的优化算法的一个难题是知道何时停止。(那些保证正确选择概率的算法除外。)典型的规则可能是:经过一定次数的迭代后停止;当最优解在若干次迭代中没有多大变化时停止;或者当可用于求解该问题的全部时间已经耗尽时停止。无论使用哪一种规则,我们都建议对表面最优解中排名前 5% 到 10% 的那些应用一个统计选择程序,例如第 2.2 节中的选择最佳方案程序。这样做是为了以有保证的置信度评价它们之中哪一个是真正的最佳者,并精确估计它们的性能。如果搜索过程中的原始数据已被保存,那么这些数据可以用作两阶段选择程序的第一阶段样本。
例 11:实施随机搜索
假设一个制造系统由 4 个串联的工作站组成。第 0 个工作站总有原材料可用。当第 0 个工作站完成对一个零件的加工,它就把该零件传给第 1 个工作站,然后第 1 个工作站把零件传给第 2 个工作站,如此下去。工作站 0 与 1、1 与 2、2 与 3 之间的缓冲空间总共限制为 50 个零件。例如,如果工作站 2 加工完一个零件,而工作站 3 前面没有可用的缓冲空间,那么工作站 2 就被阻塞(blocked),即它无法再做任何工作。问题是如何分配这 50 个位置,以使一个班次内每件的期望周期时间最小。
令 为工作站 前面的缓冲区位置数。于是决策变量为 ,其约束为 (分配的缓冲区位置数少于我们可用的数量是没有意义的)。这意味着总共有 1326 个可能的设计(你能算出这个数字是怎么来的吗?)。
为了简化随机搜索算法的描述,把解 的计数器记为 。
随机搜索算法
步骤 1. 初始化 1326 个计数器变量 ,每一个对应一个可能的解 。选择一个初始解,比如说 ,并令 。
步骤 2. 从除 (20, 15, 15) 之外的所有解组成的集合中选取另一个解,使每一个解都有相等的被选中机会。假设选中了 (11, 35, 4)。
步骤 3. 在两个解处运行仿真实验,得到期望周期时间 Y(20, 15, 15) 与 Y(11, 35, 4) 的估计。假设 。那么 (20, 15, 15) 仍作为当前的好解。
步骤 4. 令 。
步骤 2. 从除 (20, 15, 15) 之外的所有解组成的集合中选取另一个解,使每一个解都有相等的被选中机会。假设选中了 (28, 12, 10)。
步骤 3. 在两个解处运行仿真实验,得到期望周期时间 Y(20, 15, 15) 与 Y(28, 12, 10) 的估计。假设 。那么 (28, 12, 10) 成为当前的好解。
步骤 4. 令 步骤 2. 从除 (28, 12, 10) 之外的所有解组成的集合中选取另一个解,使每一个解都有相等的被选中机会。假设选中了 (0, 14, 36)。
步骤 3. 继续……
当搜索终止时,我们选择使 计数最大的那个解 。正如我们前面所讨论的,随后应当对前 5 到 10 个解做一次单独的统计分析,以高置信度确定它们之中哪一个是真正的最佳者。在本例中,计数最大的那些解将接受第二次分析。
尽管随机搜索算法看似简单,我们却略过了在具有可证明性能的算法中经常出现的一个微妙问题。在步骤 2 中,算法必须随机地选取一个解,使所有解(当前解除外)都有相等的可能性被选中。在例 11 中如何做到这一点?约束 意味着 和 不能被独立地抽样。有人可能会想把 作为 0 到 50 上的离散均匀随机变量来抽样,然后把 作为 上的离散均匀变量来抽样,最后令 。但这种方法并不能使所有解等可能,下面的例子可以说明这一点:假设 被随机抽到 50。那么试验解必定是 ;只有一种选择。但如果 ,那么 (49, 1, 0) 和 都是可能的。因此,如果要使所有满足 的解等可能,那么 就应当比 更可能出现。
5 小结
本章对基于仿真运行所收集数据的备选系统设计比较评价作了基本介绍。这里假定已经选定一组固定的备选系统设计以供考虑。重点放在基于置信区间的比较以及公共随机数的使用上。还简要介绍了元模型——其目的是描述设计变量与输出响应之间的关系——以及基于仿真的优化——其目的是从数量庞大且种类繁杂的系统设计中选出最佳者。在仿真相关的统计分析技术这一领域,还有许多超出本书范围的、可能令人感兴趣的其他主题。其中一些主题是:
a. 实验设计模型(experimental design model),其目的是发现哪些因子对备选系统的性能具有显著影响;
b. 除重复法与批均值法之外的输出分析方法;
c. 方差缩减技术,即提高仿真实验统计效率的方法(公共随机数就是一个重要的例子)。
关于这些主题以及与仿真相关的其他主题,请读者参阅 Banks [1998] 和 Law [2007]。
最重要的思想是:仿真输出数据需要经过统计分析才能被正确解释。特别是,统计分析可以提供仿真所产生结果之精度的度量,并提供用以达到规定精度的技术。
参考文献
ANDRADOTTIR, S. [1998], “Simulation Optimization,” Chapter 9 in Handbook ofSimulation, J. Banks, ed., Wiley, New York.
ANDRADOTTIR, S. [1999], “Accelerating the Convergence ofRandom Search Methods for Discrete Stochastic Optimization,” ACM TOMACS, Vol. 9, pp. 349–380.
BANKS, J., ed. [1998], Handbook ofSimulation, Wiley, New York.
BATES, D. M., AND D. G. WATTS [1988], Nonlinear Regression Analysis and its Applications, Wiley, New York.
BECHHOFER, R. E., T. J. SANTNER, AND D. GOLDSMAN [1995], Design and Analysis for Statistical Selection, Screening and Multiple Comparisons, Wiley, New York.
BOESEL, J., B. L. NELSON, AND N. ISHII [2003], “A Framework for Simulation-Optimization Software,” IIE Transactions, Vol. 35, pp. 221–229.
BOESEL, J., B. L. NELSON,AND S. KIM [2003], “Using Ranking and Selection to ‘Clean Up’After Simulation Optimization,” Operations Research, Vol. 51, pp. 814–825.
BOX, G. E. P., AND N. R. DRAPER [1987], Empirical Model-Building and Response Surfaces, Wiley, New York.
FU, M. C. [2002], “Optimization for Simulation: Theory vs. Practice,” INFORMS Journal on Computing, Vol. 14, pp. 192–215.
GLOVER, F. [1989], “Tabu Search—Part I,” ORSA Journal on Computing, Vol. 1, pp. 190–206.
GOLDSMAN, D., AND B. L. NELSON [1998], “Comparing Systems via Simulation,” Chapter 8 in Handbook ofSimulation, J. Banks, ed., Wiley, New York.
HINES, W. W., D. C. MONTGOMERY, D. M. GOLDSMAN, AND C. M. BORROR [2002], Probability and Statistics in Engineering, 4th ed., Wiley, New York.
HOCHBERG, Y., AND A. C. TAMHANE [1987], Multiple Comparison Procedures, Wiley, New York.
HSU, J. C. [1996], Multiple Comparisons: Theory and Methods, Chapman & Hall, New York.
KIM, S., AND B. L. NELSON [2006], “Selecting the Best System,” Chapter 17 in Handbooks in Operations Research and Management Science: Simulation, S. G. Henderson and B. L. Nelson, eds., North-Holland, New York.
KLEIJNEN, J. P. C. [1975], Statistical Techniques in Simulation, Parts I and II, Dekker, New York
KLEIJNEN, J. P. C. [1987], Statistical Toolsfor Simulation Practitioners, Dekker, New York.
KLEIJNEN, J. P. C. [1988], “Analyzing Simulation Experiments with Common Random Numbers,” Management Science, Vol. 34, pp. 65–74.
KLEIJNEN, J. P. C. [1998], “Experimental Design for Sensitivity Analysis, Optimization, and Validation of Simulation Models,” Chapter 6 in Handbook ofSimulation, J. Banks, ed., Wiley, New York.
LAW, A. M. [2007], Simulation Modeling and Analysis, 4th ed., McGraw-Hill, New York.
MONTGOMERY, D. C. [2000], Design and Analysis ofExperiments, 5th ed., Wiley, New York.
NELSON, B. L., J. SWANN, D. GOLDSMAN, AND W.-M. T. SONG [2001], “Simple Procedures for Selecting the Best System when the Number of Alternatives is Large,” Operations Research, Vol. 49, pp. 950–963.
NELSON, B. L. [1987], “Some Properties of Simulation Interval Estimators Under Dependence Induction,” Operations Research Letters, Vol. 6, pp. 169–176.
NELSON, B. L. [1992], “Designing Efficient Simulation Experiments,” Proceedings ofthe 1992 Winter Simu lation Conference, J. J. Swain, D. Goldsman, R. C. Crain, and J. R. Wilson, eds., Arlington, VA, Dec. 13–16, pp. 126–132.
OLAFSSON, S. [2006], “Metaheuristics,” Chapter 21 in Handbooks in Operations Research and Management Science: Simulation, S. G. Henderson and B. L. Nelson, eds., North-Holland, New York.
WHITT, W. [1989], “Planning Queueing Simulations,” Management Science, Vol. 35, pp. 1341–1366.
WRIGHT, R. D., AND T. E. RAMSAY, JR. [1979], “On the Effectiveness of Common Random Numbers,” Management Science, Vol. 25, pp. 649–656.
YANG, F., B. ANKENMAN, AND B. L. NELSON [2007], “Efficient Generation of Cycle Time-Throughput Curves through Simulation and Metamodeling,” Naval Research Logistics, Vol. 54, pp. 78–93.
习题
某公司拥有自卸卡车,这些卡车反复经历三项活动:装载、称重和运输。假设共有 8 辆卡车,且在时刻 0 时 8 辆卡车都在装载机处。每台卡车在唯一一台地磅上的称重时间在 1 到 9 分钟之间均匀分布,每台卡车的运输时间服从均值为 85 分钟的指数分布。装载机前和地磅前都允许无限排队。所有卡车可以同时处于运输状态。管理层希望把一台快速装载机与目前正在使用的两台较慢装载机作比较。每台慢速装载机装满一辆卡车的时间在 1 到 27 分钟之间均匀分布。新的快速装载机装满一辆卡车的时间在 1 到 19 分钟之间均匀分布。比较的依据是 40 小时时间跨度上的平均系统响应时间,其中响应时间定义为从一辆卡车到达装载机队列到该卡车驶离地磅的持续时间。请用公共随机数对这两个选项作一次统计上有效的比较。
在《绝对性能估计》一章的习题 6 中,考虑如下备选的 (M, L) 策略:
| L | ||||
|---|---|---|---|---|
| 低 30 | 高 40 | |||
| M | 低 | 50 | (50,30) | (50, 40) |
| 高 | 100 | (100,30) | (100, 40) |
请利用《绝对性能估计》一章习题 6 中所建立的仿真模型作适当修改,考察这些策略的相对成本。以长期平均月成本为依据比较这四个系统设计。首先,对每个 (M, L) 策略做 4 次重复,尽可能充分地采用公共随机数。每次重复应当包含 12 个月的初始化阶段,随后是 100 个月的数据收集阶段。计算每个策略平均月成本的置信区间,使其总体置信水平为 90%。然后估计为了使各置信区间不再重叠所需要的追加重复次数。就哪一个策略最佳得出结论。
重新考虑《绝对性能估计》一章的习题 7。比较习题 2 中所研究的四种库存策略,并在计算月成本时把紧急订货的成本考虑在内。
重新考虑《绝对性能估计》一章的习题 8。比较习题 2 中所研究的四种月度库存策略,并把易腐物品的销售价格考虑在内。
在《绝对性能估计》一章的习题 9 中,考察订货量对长期平均日成本的影响。每笔订货用送货卡车上的一个托盘运到,因此允许的订货量 Q 是 10 的倍数;即 Q 可以等于 10、20、30……。在习题 9 中考察的是 Q = 20 这一策略。
(a) 首先,考察 Q = 10 与 Q = 50 这两个策略。使用《绝对性能估计》一章习题 9 中所建议的运行长度等设定。在这些运行的基础上,判断最优的 Q(记为 Q∗)是位于 10 与 50 之间,还是大于 50。(成本曲线作为 Q 的函数应当具有什么样的形状?)
(b) 利用 (a) 中的结果,再提出两个 Q 的取值并对这两个策略作仿真。得出结论,并分析你所得结论的强度。
在《绝对性能估计》一章的习题 10 中,求出卡片店店主应当采购的卡片数量 Q,以使利润最大化,且(总利润的)误差至多约为 5.00 美元。首先,对订购 Q = 250 张和 Q = 350 张的策略各做一次运行。利用这些结果,再加上习题 10 中订购 张的结果,确定一个值得进一步考虑的 Q 的范围:,或 ,等等。然后在这个受限范围内再考察两个策略:Q = 200 与 ,或 Q = 265 与 Q = 285,等等。
在《绝对性能估计》一章的习题 11 中,考察目标水平 M 与检查周期 N 对平均月成本的影响。考虑两个目标水平 M,由习题 11 中所用的目标水平加减 10 确定,并考虑 1 个月和 3 个月的检查周期 N。根据这些仿真,哪一个 (N, M) 组合最佳?
重新考虑《绝对性能估计》一章的习题 13 和习题 14,它们涉及一个作业车间中的调度规则(即排队规则):先进先出(FIFO)与按类型优先(PR)。除了这两条规则,再考虑一种最短即时工序(SIO)调度规则:对某一个给定的工作站,具有最小平均加工时间的那一类型的所有作业都被赋予最高优先级。例如,当在工作站 1 使用 SIO 规则时,作业按如下顺序加工:先类型 II,再类型 I,最后类型 III。同一类型的两个作业按 FIFO 处理。请设计一个仿真实验,以所有作业的平均总响应时间为依据比较 FIFO、PR 和 SIO 三条规则。
在《绝对性能估计》一章的习题 13(采用 FIFO 规则的作业车间)中,求出每个工作站为避免瓶颈所需要的最少工人数。当某个工作站在一段时间上的平均队列长度持续增加时,就出现了瓶颈。[提示:不要把由于服务台数量不足而引起的平均队列长度增加,与由于初始化偏差而引起的平均队列长度增加相混淆。在前一种情形下,平均队列长度会无限持续增加,且服务台利用率为 1.0。在后一种情形下,平均队列长度最终会趋于平稳,且服务台利用率小于 1。]请按作业类型以及全部类型报告工人的利用率和一个作业通过整个作业车间所需的总时间。
[提示:如果某个工作站的服务台利用率为 1.0,且平均队列长度随仿真运行长度的增加而趋于线性增长,那么该工作站很可能是不稳定的,因而是一个瓶颈。在这种情况下,该工作站至少需要增加一名工人。利用排队论,即 ,给出工作站 1 所需最少工人数的建议。回顾一下,λ 是到达率, 是一名工人加工一个作业的总体平均服务时间, 是工作站 的工人数。尝试用同一个基本条件 给出工作站 ()初始服务台数量的建议。]
- (a) 对 PR 调度规则重做习题 9(参见《绝对性能估计》一章的习题 14)。
(b) 对 SIO 调度规则重做习题 9(参见习题 8)。
(c) 比较每种调度规则所需的最少工人数:FIFO 对 PR 对 SIO。
在上面习题 9 与习题 10 中为《绝对性能估计》一章习题 13 的作业车间所求得的最少工人数的基础上,考虑给整个车间增加一名工人。这名工人只能被培训去处理某一个工作站的加工。这名工人应当安排在哪个工作站?这名额外工人如何影响所有作业的平均总响应时间?如何影响类型 I 作业的平均总响应时间?对每一种调度规则(FIFO、PR、SIO),分别考察有这名额外工人与没有这名额外工人的作业车间。
在《绝对性能估计》一章的习题 17 中,假设在每个工人前面建造一个容量为一件物品的缓冲区。设计一个实验,考察系统设计上的这一改变是否对各工人的利用率 和 具有显著影响。至少要计算 和 的置信区间,其中 是缓冲区容量为 时工人 的利用率。
某小型州立大学招生办公室的一名职员处理索取招生材料的请求。处理请求的时间取决于所感兴趣的专业(例如工业工程、管理科学、计算机科学等)以及该专业的层次(学士、硕士、博士)。假设处理时间可以很好地用正态分布建模,均值为 7 分钟、标准差为 2 分钟。每天开始工作时,这名职员需要一些时间才能准备就绪、开始处理请求;假设这一时间可以很好地用指数分布建模,均值为 20 分钟。招生办公室每天通常收到 40 到 60 份请求。
令 x 为一天中收到的申请数量,令 Y 为处理它们所需的时间(包括准备时间)。通过在设计点 , 60 上各做 次重复,为 $\operatorname{E} ( Y | x ) $ 拟合一个元模型。注意,在这种情形下,我们知道正确的模型是
(为什么?)先从每个设计点 次重复开始,估计 和 。逐步增加重复次数,观察需要多少次重复才能使估计接近真实值。
用 CRN 重做上一题。结果有何变化?
考虑简单线性回归模型 。找一本涵盖回归建模的统计学教材。在那里你会找到关于假设 的一个检验(拒绝这一假设就是 x 与 Y 线性相关的证据)。如果我们使用 CRN,则该检验背后的通常假定并不成立。它们在哪里失效了?
Riches and Associates 公司主要以定期存单(CD)的形式持有现金储备,年利率为 8%。然而,公司必须定期从这些存单中提取资金,以支付供应商款项等。这些现金流出通过一个不计息的支票账户进行。对现金的需求无法被确定地预测。从存单到支票账户的转账可以即时完成,但从存单提前支取会受到"重罚”。因此,R&A 公司使用其支票账户的透支保护也许是合理的,该透支按每美元每天 0.00033 美元(即年利率 12%)计收透支利息。
R&A 公司喜欢简单的策略:每年转账固定次数、每次固定金额。目前,它每年转账 6 次,每次 18,250 美元。你的任务是找到一种能够降低其长期日均成本的策略。
从历史规律判断,现金需求的到达率约为每天 1 次,其到达可以很好地用泊松过程建模。满足每一次需求所需的现金量可以用一个均值为 300 美元、标准差为 150 美元的对数正态随机变量合理地表示。
不同存单的提前支取罚金不同。每次支取平均为 150 美元,与金额无关,但实际罚金可以用一个范围为 100 美元到 200 美元的均匀分布随机变量来建模。
用支票账户中的现金水平来确定初始化阶段的长度。做足够多的重复,使你关于长期日均成本之差的置信区间不包含零。务必在实验设计中使用 CRN。
如果你能使用商业化的基于仿真的优化软件,请测试随着仿真输出变异性的增大,它的效果如何。用一个简单的模型,例如 其中 ε 是服从 分布的随机变量,且最优解已知(在本例中,最小化问题的解为 )。看看随着 的增大,该软件能否(以及多快能够)找到真正的最优解。接着尝试具有多于一个设计变量的更复杂的模型。
对于例 11,说明为什么共有 1326 个解。然后导出一种对 和 抽样的方法,使得 且所有结果等可能。
某种关键电子元件,其平均失效时间为 x 年,售价为 2x 千美元(因此元件越可靠就越贵)。x 的取值限制在 1 到 10 年之间,实际失效时间用指数分布建模。使用该元件执行的任务持续一年;如果该元件在不到一年的时间内失效,则会产生 20,000 美元的早期失效成本。应当选择什么样的 x 值,以使期望总成本(购置成本加早期失效成本)最小?
为了求解这一问题,建立一个仿真,对平均失效时间为 x 年的元件生成总成本。这需要抽样一个均值为 x 的指数分布随机变量,然后把总成本计算为 2000x 加上(若失效时间小于 1 年)20,000。拟合一个关于 x 的二次元模型,并用它求出使所拟合模型最小的 x 值。[提示:在 1 到 10 之间选取若干个 x 值作为设计点。在每个 x 值处,令响应变量 Y(x) 为至少 30 次总成本观测值的平均。]
用基于仿真的优化软件求解习题 19。如果你无法使用这类软件,就使用随机搜索算法,并令 x 的可能取值为 1.00, 1.25, 1.50, . . . , 10.00。
假设某种产品的需求服从均值为 10 件的泊松分布。用基于仿真的优化软件(如果无法使用这类软件,就用随机搜索算法)求出使需求等于 x 件的概率最大的订货量 x,假定 且 x 为整数。(本题基于 Andradóttir [1999]。)[提示:对某个试验值 x 的仿真,每一次重复生成一个均值为 10 的泊松随机需求。如果该随机需求等于 x,则响应为 Y(x) = 1;否则为 Y(x) = 0。]
在习题 16 中,考虑以下 5 种策略:6 次转账、每次 18,250 美元;5 次转账、每次 21,900 美元;4 次转账、每次 27,375 美元;3 次转账、每次 36,500 美元;2 次转账、每次 54,750 美元。对每种策略做 10 次重复,并为所有策略对的期望成本之差构造同时置信区间。
在习题 16 中,考虑以下 5 种策略:6 次转账、每次 18,250 美元;5 次转账、每次 21,900 美元;4 次转账、每次 27,375 美元;3 次转账、每次 36,500 美元;2 次转账、每次 54,750 美元。对每种策略做 10 次重复,然后应用选择最佳方案程序选出期望日均成本最低的策略。取 每天。
www.bcnn.net 上可用材料清单
SimulationTools.xls
13 制造系统与物料搬运系统的仿真
制造(manufacturing)与物料搬运(material handling)系统提供了仿真最重要的一类应用。仿真已被成功地用于辅助新生产设施、仓库和配送中心的设计。它也被用于评价针对既有系统所提出的改进方案。使用仿真的工程师和分析人员发现,仿真对于评价设备与物理设施方面的资本投资、以及针对物料搬运与布局所提议的变更所产生的影响,很有价值。他们还发现,仿真对于评价人员配备规则与操作规则,以及拟纳入生产控制系统、仓库管理控制软件和物料搬运控制系统的规则与算法,也很有用。管理者发现,在进行资本投资之前先通过仿真作一次"试运行"很有用,从而不必用未经考验的变更去扰动现有系统。
第 1 节给出导言,并讨论制造与物料搬运系统仿真模型的若干特征。第 2 节讨论制造仿真的目标与最常用的系统性能度量。第 3 节讨论许多制造与物料搬运仿真中所共有的若干问题,包括对停机与故障的处理,以及使用实际历史数据或历史订单文件的跟踪驱动仿真。第 4 节给出若干已报道的仿真项目的简要摘要,并附有供进一步阅读的参考文献。第 5 节给出一个小型生产线仿真的扩展示例,强调通过实验与分析系统性能以达到期望的吞吐量。
1 制造与物料搬运系统仿真
与所有建模项目一样,制造与物料搬运仿真项目也需要处理范围(scope)与细节层次(level of detail)这两个问题。可以把范围类比为宽度,把细节层次类比为深度。范围描述项目的边界:哪些内容在模型之中,哪些不在。对于一个子系统、过程、机器或其他部件,项目范围决定了该对象是否纳入模型。而一旦某个部件或子系统被作为模型的一部分来对待,它往往就可以在许多不同的细节层次上进行仿真。
恰当的范围与细节层次应当由研究的目标和所提出的问题来决定。另一方面,细节层次也可能受输入数据可获得性以及对系统部件如何工作的了解程度的限制。对于新建的、尚不存在的系统,数据的可获得性可能有限,而对系统的了解可能只能基于假设。
可以给出一些一般性指导原则,但最有成效的依据,是由经验丰富的仿真分析人员与客户一道,在项目早期即确定模型所要回答的问题,以此来选择恰当的范围与恰当的细节层次。
模型是否应当仿真每一段输送带区段或每一台车辆的移动,还是其中一些可以用一个简单的延迟来代替?模型是否应当仿真辅助零件、外购零件的处理,还是可以假定这些零件在装配需要时总是位于正确的位置?
控制系统需要仿真到何种细节层次?许多现代制造设施、配送中心、行李分拣系统以及其他的物料搬运系统,都是由管理控制软件系统进行计算机控制的。内置于这类控制软件中的算法,在系统性能中发挥着关键作用。仿真常被用来评价和比较相互竞争的控制方案的有效性,并评价所提出的改进方案。它还可用于在控制系统安装之前,调试并精调其逻辑。
这些问题是建模项目在选择恰当范围与细节层次时所需处理的问题的代表性例子。反过来,范围与模型细节层次又限制了模型所能回答的问题的类型。此外,模型可以迭代式地开发:若日后判断某些外围作业对主作业有显著影响,则在后续阶段再补充其细节。尽可能地从最简单开始、只在需要时才增加细节,是一条很好的建议。
1.1 制造系统模型
制造系统模型可能必须考虑这类系统的若干特征,其中包括以下一些:
- 物理布局
- 人员
- (a) 班次安排
- (b) 岗位职责与资格认证
- 设备
- (a) 速率与产能
- (b) 故障
- (i) 失效时间
- (ii) 修复时间
- (iii) 修复所需资源
- 维护
- (a) 预防性维护(PM)计划
- (b) 所需时间与资源
- (c) 刀具与夹具
- 工作中心
- (a) 加工
- (b) 装配
- (c) 拆卸
- 产品
- (a) 产品流程、工艺路线与所需资源
- (b) 物料清单
- 生产计划
- (a) 备货生产
- (b) 订单生产
- (i) 客户订单
- (ii) 订单行项目与数量
- 生产控制
- (a) 作业分配到工作区域
- (b) 工作中心的任务选择
- (c) 路线决策
- 供应
- (a) 订购
- (b) 收货与存储
- (c) 配送至工作中心
- 存储
- (a) 物料
- (b) 备件
- (c) 在制品(WIP)
- (d) 成品
- 包装与发运
- (a) 订单合并
- (b) 单证
- (c) 拖车装载
1.2 物料搬运系统模型
在制造系统中,一件物料在系统内的总时间有 80% 到 85% 花在物料搬运上,或花在等待物料搬运发生上,这并不罕见。这部分在制品(WIP)代表着巨额投资,减少在制品及其相关延误可以带来可观的成本节约。因此,对某些研究而言,细致的物料搬运仿真是划算的。
在某些生产线上,物料搬运系统是一个不可或缺的组成部分。例如,汽车喷漆车间通常由一套动力—自由(power-and-free)输送带系统构成,把汽车车身或车身部件运送到喷漆室中。
在仓库、配送中心以及直通式和越库作业中,物料搬运显然是任何物料流模型的关键组成部分。人工仓库通常使用人工叉车把托盘从收货月台运到存储区,再从存储区运到发货月台。自动化程度更高的配送中心可能会使用大量输送带系统,以支持上架、拣货、订单分拣与合流。
物料搬运系统的模型常常必须包含以下类型的子系统:
- 输送带
- (a) 累积式
- (b) 非累积式
- (c) 索引式及其他专用形式
- (d) 固定窗口式或随机间距式
- (e) 动力—自由式
- 运输设备
- (a) 无约束车辆(例如人工操纵的叉车)
- (b) 有引导的车辆(自动的或由操作员操纵的、导线引导的、化学路径的、轨道引导的)
- (c) 桥式起重机及其他架空提升设备
- 存储系统
- (a) 托盘存储
- (b) 箱式存储
- (c) 小件存储(周转箱)
- (d) 超大件
- (e) 货架存储或码垛堆放
- (f) 带存取机(SRM)的自动存取与检索系统(AS/RS)
1.3 常见的物料搬运设备
制造、仓储与配送作业中常见的物料搬运设备种类繁多。它们包括无约束运输设备,例如手推车、人工驾驶的叉车和托盘车;有引导路径的运输设备,例如自动导引车(AGV);以及固定路径的设备,例如各种类型的输送带。
无约束运输设备这一类(有时称为自由路径运输设备)包括手推车、叉车、托盘车以及其他人工驾驶的车辆,它们可以在整个设施内自由行驶,不受任何种类的引导路径的约束。无约束运输设备不受路径网络的限制,可以选择替代路径或绕开障碍物。与之相对,有引导路径的运输设备沿固定路径运行,例如地面上的化学路径标线、嵌入地面的导线,或有策略地布置的红外灯;也可以依靠自引导,即利用无线电通信、激光制导与航位推算,以及轨道。有引导路径的运输设备有时会彼此争夺其路径上的空间,在遇到障碍与拥堵时通常可选的方案有限。有引导路径的运输设备的例子包括自动导引车(AGV)、用于在货架存储中存取托盘的轨道导向堆垛车,以及 AS/RS(自动存取与检索系统)中的起重机。
输送带是一种固定路径设备,用于把实体从一点运到另一点,沿固定路径运行,具有特定的装载、停止或加工点以及卸货点。一个输送带系统可以由许多相互连接的区段组成,其中带有合流与分流。每个区段可以是若干种不同类型之一。输送带类型的例子包括带式、动力滚筒式与重力滚筒式、斗式、链式、翻板式(tilt tray)以及动力—自由式,每一种都有各自的特性,必须准确建模。
大多数输送带区段可分为累积式或非累积式。累积式输送带区段持续运行。如果某件物料在累积式输送带上向前推进时受阻,就会发生滑移,使该件物料保持静止,而其后面的物料则继续移动,直到遇上这件静止的物料。一些带式输送带和大多数滚筒式输送带即以这种方式工作。只有相互碰撞不会造成损坏的物料,才可以放到累积式输送带上。
与之相对,物料一旦进入非累积式输送带区段,它与其他物料之间的间距就不再改变。如果有一件物料停止移动,则整个区段都停止移动,因而该区段上的所有物料都停止。例如,非累积式输送带用于搬运尚未装箱的电视机,因为在从一个装配工位或测试工位运到下一个的过程中,它们必须彼此保持安全距离。斗式输送带、翻板式输送带、某些带式输送带,以及为承载重载(通常是托盘)而设计的输送带,都是非累积式输送带。
输送带还可以分为固定窗口式和随机间距式。在固定窗口间距下,输送带上的物料必须始终位于长度相等的区间之内,可以把它想象成在带式输送带上画出的若干条线,或由链条牵引的一排托盘。例如,在翻板式输送带中,使用固定尺寸、连续运行的托盘来运送物料。控制系统的设计使得物料以每个物料各占一个托盘的方式进入;因此,它是一种非累积的固定窗口式输送带。与之相对,在随机间距下,物料相对于其他物料可以位于输送带区段上的任意位置。物料进入(induct)时只需要有足够的空间即可。
除了这些基本类型之外,还有数不清的各类专用输送带,用于特殊目的。例如,专用索引式输送带可以按增量向前移动,始终在前方载荷的后缘与后方载荷的前缘之间保持固定距离。其目的是形成一个等间距的物料"串"(slug),以便一起进入运输输送带。对于某些系统的局部行为——也就是某个特定工作站或入口处的性能——要想得到准确的结果,就必须详尽理解并准确建模其物理运行机理与控制逻辑。
2 目标与性能度量
仿真的目的是洞见,而不是数字。购买和使用仿真软件与服务的人,希望获得关于一个新建或经修改的系统将如何运行的洞见与理解。它能达到预期的吞吐量吗?在高峰期,响应时间会怎样?系统对短期激增是否具有韧性?当短期激增造成拥堵与排队时,恢复时间是多少?人员配备要求是什么?会出现哪些问题?如果出现问题,其原因是什么,又是如何产生的?系统的容量是多少?什么样的条件与负荷会使系统达到其容量?
人们期望仿真给出数值形式的性能度量,例如在给定一组条件下的吞吐量,但仿真的主要收益来自就系统运行所获得的洞见与理解。通过动画与图形进行的可视化,对于传达模型假设、系统运行过程与模型结果大有帮助。可视化往往是模型可信度的主要来源,而模型可信度反过来又促成了对模型数值输出的接受。当然,一项恰当的实验设计——其中包含恰当范围的实验条件,再加上严谨的分析,以及对于随机仿真模型而言恰当的统计分析——对于仿真分析人员从仿真输出中得出正确结论而言,是极其重要的。
制造仿真模型的主要目标是识别问题区域并量化系统性能。常见的系统性能度量包括以下各项:
- 平均负载与峰值负载下的吞吐量;
- 系统周期时间(生产一件零件所需的时间);
- 资源、人员与机器的利用率;
- 瓶颈与阻塞点;
- 工作地点处的排队;
- 由物料搬运设备与系统引起的排队与延误;
- WIP 存储需求;
- 人员配备要求;
- 调度系统的有效性;
- 控制系统的有效性。
物料搬运常常是制造系统及其性能的重要组成部分。非制造的物料搬运系统包括仓库、配送中心、越库作业,以及机场和集装箱码头的行李分拣系统。这些非制造物料搬运系统的主要目标与针对制造系统所确定的目标相似。此外还应考虑以下各项:
- 处理一天的客户订单所需的时间;
- 订单结构变化的影响(针对配送中心);
- 卡车/拖车在收货与发货月台处的排队与延误;
- 物料搬运系统在峰值负载下的有效性;
- 从短期激增中恢复所需的时间(例如对于行李分拣)。
3 制造与物料搬运仿真中的问题
有若干建模问题对于取得准确且有效的制造与物料搬运系统仿真模型而言尤为重要。其中两个问题是:停机的恰当建模,以及对于某些输入,是使用实际系统数据还是使用这些输入的统计模型。
3.1 停机与故障的建模
未计划的随机停机可以对制造系统的性能产生重大影响。许多作者都讨论过停机数据的恰当建模问题(Williams [1994];Clark [1994];Law and Kelton [2000])。本节讨论停机建模不当可能引发的问题,并提出若干正确建模机器与系统停机的方法。
计划内停机,例如用于预防性维护的停机;或周期性停机,例如用于更换刀具的停机,同样可以对系统性能产生重大影响。但这些停机通常是(也应当是)可预测的,可以加以安排以尽量减少对生产的干扰。此外,工程努力或新技术也许能够缩短其持续时间。
对随机未计划停机的建模有若干可选方式,各有优劣:
- 忽略它。
- 不显式建模它,而是按适当比例增大处理时间。
- 对失效时间和修复时间使用常数取值。
- 对失效时间和修复时间使用统计分布。
当然,方式 (1) 一般不是被建议的做法。若停机会影响结果(几乎在所有情形下都会如此),这肯定是一种不负责任的建模技术。在充分知悉客户情况的前提下,有一种忽略停机或许恰当的情形:即略去那些极少发生、会使生产线或工厂长时间停工的灾难性停机。换言之,模型将纳入常规停机,但忽略那些极少发生、却一旦发生就使全部生产停止的灾难性停机,例如大面积停电、暴雪、气旋和飓风。项目成文界定的范围应当清楚地说明所假定的运行条件,以及未纳入模型的那些条件。如果通常已知工厂每年会有若干个因大雪而停工的日子,那么仿真就不必把这些停机计入,因为在作年度预测时,任何给定天数的影响都可以很容易地折算进仿真结果。
第二种可能性,即通过调整施加于每项作业或每件零件的处理时间,把停机的影响计入模型,在有限的情形下也许是一种可接受的近似。如果每项作业或每件零件都受到大量与设备或刀具停机相关的小延误,那么这些延误之和可以加到纯处理时间上,从而得到一个调整后的处理时间。如果总延误时间与纯处理时间都是随机的,那么应当为调整后的总处理时间选用适当的统计分布。如果纯处理时间是常数,而一个循环中的总延误时间是随机且可变的,那么用某个常数因子去调整处理时间几乎总是不准确的。例如,如果处理时间通常是 10 分钟,但设备存在导致约 10% 产能损失的停机,那么仅仅把处理时间改为恒定的 11 分钟是不恰当的。这样一种确定性调整也许能对系统总吞吐量给出相当准确的估计,但无法准确估计诸如高峰期所需排队与缓冲空间这样的局部行为。排队与短期拥堵受随机性与可变性的强烈影响。
第三种可能性,即对失效时间和修复时间使用恒定时长,在例如停机实际上源于按固定计划执行的预防性维护时,可能是恰当的。在几乎所有其他情形下,第四种可能性——用适当的统计分布来建模失效时间与修复时间——才是恰当的技术。这需要实际数据来选择统计分布(依据绝对性能估计技术进行估计),或者在缺乏数据时,依据停机成因的物理性质作出合理假设。
失效时间的性质同样重要。失效时间是否完全随机?这种情形通常是由大量可能的失效原因造成的。若是这种情况,指数分布可能提供一个良好的统计模型。或者,失效时间是否更为规律——通常是某个主要部件(比如某把刀具)磨损所致?若是这种情况,均匀分布或(截断)正态分布可能更为合适。在后一种情形下,该分布的均值代表平均失效时间,而分布在均值左右给出一个正负范围。
失效时间可以按若干不同方式度量:
- 按挂钟时间;
- 按机器或设备的忙碌时间;
- 按循环次数;
- 按生产件数。
故障或失效可以基于时钟时间、实际使用量或循环次数来设定。请注意,这里用的是"故障"或"失效"这两个词,尽管停机的原因也可能是预防性维护。如前所述,故障或失效的持续时间可以是概率型的,也可以是确定型的。
基于实际使用量的故障,是以资源被使用的时间为依据的。例如,机床的磨损只在机床处于使用状态时才发生。失效时间是对照机器忙碌时间度量的,而不是对照挂钟时间。若失效时间为 90 小时,则模型跟踪自上次停机结束以来的总忙碌时间;当达到 90 小时时,加工被中断并发生一次停机。
基于时钟时间的故障可能与计划维护有关;例如每三个月更换一次油液以完成一次全面润滑。基于挂钟时间的停机也可用于那些始终忙碌的设备,或那些即使不在加工零件时也照常运行的设备。
基于循环的故障或失效,是以资源被使用的次数为依据的。例如,一把刀具每使用 50 次就需要刃磨。基于循环次数或生产件数的停机,其实现方式是生成所需的次数或件数,并在模型中简单地计数直到达到该数目。基于忙碌时间或循环次数的停机,典型的用途是维护或更换刀具。
另一个问题是,当发生故障或失效时,机器上的零件会怎样。可行的处理包括报废该零件、返工,或干脆在修复之后继续加工。在某些情形下——例如到了预防性维护的时间——机器中的零件可能在修复(或维护作业)开始之前就完成了加工。
修复时间同样可以用两种根本不同的方式来建模:
- 作为纯粹的延迟(不需要资源);
- 作为等待某项资源(例如维修人员)的等待时间,加上实际修复所需的时间延迟。
当然,在实际的建模情境中,这些方法有许多变形。当维修或维护人员属于有限资源时,第二种方式是更准确的模型,并能提供更多的信息。
接下来的例子说明了在停机建模中采用恰当方法的重要性,以及不恰当假设有时导致的不准确结果。
例 1:停机对排队的影响
考虑一台单独的机器,它加工种类繁多的零件,这些零件以随机的组合在随机时刻到达。数据分析表明,均值为 7.5 分钟的指数分布处理时间能给出相当准确的刻画。零件随机到达,到达间隔时间服从均值为 10 分钟的指数分布。机器在随机时刻发生故障。停机研究表明,失效时间可以用均值为 1000 分钟的指数分布作出合理近似。修复该资源的时间同样服从指数分布,均值为 50 分钟。当发生故障时,机器中正在加工的零件被移出机器;修复完成后,该零件恢复其加工。
零件到达后,在机器处排队等待轮到自己。我们希望估计这一队列的长度。为此设计了一项实验,用以估计队列中零件的平均数量。为说明准确处理停机所带来的影响,模型在若干种不同假定下运行。对于每一种情形和每一次重复,仿真运行长度均为 100,000 分钟。
表 1 给出了对故障间隔时间作六种不同处理时,队列中零件的平均数量。对于每一种涉及随机性的处理,均给出 5 次重复的结果及其平均值。
表 1 有故障机器的队列中零件平均数量
| 情形 | 第 1 次重复 | 第 2 次重复 | 第 3 次重复 | 第 4 次重复 | 第 5 次重复 | 平均 |
|---|---|---|---|---|---|---|
| A. 忽略故障 | 2.36 | 2.05 | 2.38 | 2.05 | 2.70 | 2.31 |
| B. 服务时间增加到 8.0 | 3.32 | 2.82 | 3.32 | 2.81 | 4.03 | 3.26 |
| C. 全部随机 | 4.05 | 3.77 | 4.36 | 3.95 | 4.43 | 4.11 |
| D. 加工随机,故障确定 | 3.24 | 2.85 | 3.28 | 3.05 | 3.79 | 3.24 |
| E. 全部确定 | 0.52 | |||||
| F. 加工确定,故障随机 | 1.06 | 1.04 | 1.10 | 1.32 | 1.16 | 1.13 |
情形 A 忽略故障。队列中的平均数量为 2.31 件。在这 5 次相互独立的重复中,各次的平均值介于 2.05 与 2.70 之间。这种对故障的处理方式是不推荐的。
情形 B 把平均服务时间从 7.5 分钟增加到 8.0 分钟,试图近似停机的影响。平均而言,每一个停机—修复周期为 1050 分钟,其中机器停机 50 分钟。因此,从长期平均看,机器停机占总时间的 50/1050 = 4.8%。于是有些人主张,停机的作用大致等同于把每件零件的处理时间增加 4.8%,即约 7.86 分钟。因此,假定每件零件恒定 8 分钟的做法(据称)是一种保守的处理方式。在这一停机处理方式下,5 次重复的队列中零件平均数量约为 3.26 件。在这 5 次重复中,取值区间为 2.81 至 4.03。(注意,与其他情形相比,由取值区间所显示的变异性要小得多。)情形 B 下的处理方式在某些有限的情形下可能是恰当的,但如前一节所讨论的,在本例的假定之下它并不恰当。
恰当的处理方式如情形 C 所示:它按照所假定的正确指数分布,恰当地处理了加工与故障中的随机性。其平均值约为 4.11 件零件在等待机器。在这 5 次重复中,平均队列长度介于 3.77 至 4.43 之间。平均等待数量与情形 B 相差将近一件。
情形 D 是一种简化:它把加工看作随机的,而把故障看作确定的。结果为队列中平均约 3.24 件。各次平均值的区间为 2.85 至 3.79,相较情形 C,变异性有明显降低。
情形 E 把所有时间都看作确定的。只需一次重复即可,因为追加的重复(使用相同的种子)会重现同样的结果。队列中的平均值为 0.52 件,远低于情形 C 的取值,乃至低于其他任何情形的取值。结论是:忽略随机性是危险的,会导致完全不现实的结果。
情形 F 把到达与加工看作确定的,而故障是随机的。机器处队列中零件的平均数量约为 1.13。取值区间为 1.04 至 1.32。对于制造环境中某些机器及其加工过程,情形 F 是符合实际的情况:加工时间是恒定的,到达也受到调节——也就是说,同样是恒定的。留给读者思考的是:若就失效时间与修复时间的性质作出错误假定,将会产生何种不准确之处。
结论是,基于对随机性的不同处理,所估计的队列平均数量之间可能存在显著差异。使用正确随机性处理所得到的结果,可能与其他各种替代处理所得结果大不相同。人们常常因为拿不到细致数据、而手上只有平均值,就倾向于把平均失效时间当作常数来使用。例 1 说明了不恰当假定的危险。所应采用的技术与所应采用的统计分布,都取决于可获得的数据以及具体情境。
正如 Williams [1994] 所讨论的,准确地处理停机,对于取得有效的制造系统模型是必要的。其要点包括以下几项:
- 避免过度简化且不恰当的假定;
- 仔细收集停机数据;
- 用统计分布准确表示失效时间与修复时间;
- 在停机发生时,就修复时间的逻辑以及当前正在加工的零件的处置这两方面,准确建模系统逻辑。
3.2 跟踪驱动模型
由实际历史数据驱动的模型称为跟踪驱动模型(trace-driven model)。本节给出一个例子,并说明在哪些建模情境中,对某些输入数据项采用跟踪驱动的方法比其他方法更有利。
考虑一个配送中心的模型,它接收客户订单,这些订单必须在一天之内完成处理并发运。建模的一个问题是如何表示这一天的订单集合。一个典型的订单会包含一个或多个订单行项目(line item),而每个订单行项目的数量可以是若干件中的一个或多个。例如,当你购买一台新的立体声音响时,你可能会买一台功放、一个调谐器和一台 CD 播放器(各为一个独立的订单行项目,数量均为 1 件),以及 4 只相同的音箱(另一个订单行项目,数量为 4 件)。订单的总体结构(order profile)对某一特定系统设计的性能可能有重大影响。一个为处理"发往少数客户的大额订单"而设计的系统,若订单结构转为"客户数量更多(或单独发运批次更多)、每单仅有一两件物品",其表现可能就不佳。
一种做法是:对订单中的每个变量使用离散统计分布来刻画订单结构:
- 订单行项目的数量;
- 对每个订单行项目,其件数。
如果这两个变量在统计上相互独立,那么这一做法或许能给出订单结构的有效模型。然而对许多应用而言,这两个变量可能高度相关,且这种相关关系难以用统计方法刻画。例如,一家服装与鞋类公司有六家大客户(大型百货商店与折扣连锁店),它们占销售量的 50%,通常订购数十乃至数百个订单行项目,并且其中许多项目的订购量很大。而在另一个极端,任何给定的一天大约有 50% 的订单只订一双或两双鞋(真是"过度版"的准时制生产!)。对这家公司而言,订单中行项目的数量与订购数量之间高度正相关;也就是说,行项目数量多的大额订单,其许多行项目的订购量通常也很大。而只有少数几个行项目的小额订单,通常每一项的订购量都小。
如果用相互独立的统计分布来建模"行项目数量"和"每行项目的件数"这两个变量,会发生什么情况?当一份订单开始处理时,模型将进行两次互不相关的随机抽取,这可能得出与实际中所见大不相同的订单结构。这种错误假定可能导致——例如——过大比例的订单只有一两个行项目,却带有大得不切实际的数量。
另一个常见但更为严重的错误,是假定存在一个"平均订单",于是只仿真一天中的订单数量,而每份订单都是那个典型订单。以作者的经验,对许多订单结构的分析表明:(1) 不存在所谓典型订单;(2) 也不存在所谓典型订单结构。
另一种做法(在许多研究中已被证明是成功的)是:由公司提供过去一年中若干个抽样日期的实际订单。通常,仿真峰值日期是值得期望的。以这种方式驱动的模型称为跟踪驱动模型。
跟踪驱动模型彻底排除了因忽略或错误估计数据中相关性而造成错误的可能性。一项明显的局限可能是:客户有时希望能够仿真对订单结构的假设性变更,例如在行项目数量与订购数量两方面都更小的小额订单所占比例有所上升。实践中,这一局限可以通过在模型的订单结构部分加入"旋钮"来消除,使仿真分析人员可以按需要调高或调低某些特征。一种做法是把当天的订单视为一个统计总体,模型从中随机抽样。这样无需改动结构就能方便地改变总订单量。第二种相关做法是:按行项目数量、数量或其他数值参数,把当天的订单划分为若干子组,然后按规定的比例从每个子组中抽样。通过改变各子组的比例,不同的订单结构就可以被"调出来"并送入模型。第三种做法是使用因子来调整每天的订单数、行项目数量和/或订购数量。实践中,对于假设的未来订单结构而言,这些做法中的某一种可能已足够准确,并可提供一个成本有效且相当准确的模型,尤其是在检验系统设计对订单特征假定变化的稳健性时。
跟踪驱动模型中可用的其他输入变量示例包括:
- 使用实际历史订单的定制单件车间(job shop)所收到的订单;
- 生产 100 种款式与规格的热水器的装配线上的产品组合与数量,以及生产排序;
- 使用实际维修记录的失效时间与停机时间;
- 使用门禁记录的卡车到达仓库的时刻。
是把某个输入变量做成跟踪驱动的,还是用统计分布来刻画它,取决于若干因素,包括该变量本身的性质、它与其他变量是相关还是独立、准确数据的可获得性,以及所要回答的问题。
4 制造与物料搬运系统仿真的案例研究
《冬季仿真会议论文集》(Winter Simulation Conference Proceedings)、《IIE 杂志》(IIE Magazine)、《现代物料搬运》(Modern Material Handling)等期刊,是获取制造与物料搬运系统仿真短案例的极好信息来源。
对以往《冬季仿真会议论文集》中若干论文的摘编,可以使人们对仿真所能处理的问题类型获得一些启发。这些摘编在适当之处作了转述与删节;我们的目的是说明仿真在真实世界中的应用之广。
分会: 半导体晶圆制造
论文: 半导体晶圆制造中的物料搬运建模与仿真
作者: Neal G. Pierce and Richard Stafford [1994]
摘要: 本文给出一项设计研究的结果,用于分析半导体晶圆制造的跨区(interbay)物料搬运系统。作者建立了常规洁净室物料搬运(包括人工系统和自动化系统)性能的离散事件仿真模型。常规洁净室物料搬运系统的组成部分包括用于跨区(区间到区间)运输的空中单轨系统、用于批次存储的在制品堆垛机,以及用于区内搬运的人工系统。作者构建了模型与实验,以帮助分析洁净室物料搬运中的各类问题,例如设计常规自动化物料搬运系统、确定运输车辆的技术要求。
分会: 航空航天制造中的仿真
论文: 飞机装配作业的建模
作者: Harold A. Scott [1994]
摘要: 本文用一个仿真模型来帮助理解飞机装配作业中复杂的交互作用。仿真有助于识别资源约束对动态过程能力与周期时间的影响。为分析这些影响,模型必须在控制代码层面上捕捉作业与班组之间的交互。本文探讨了建立仿真模型以分析飞机装配线上班组作业的五个方面:
- 表示作业的先后顺序关系;
- 仿真具有不同技能水平与作业熟练程度的班组成员;
- 重新调配班组成员以协助进行中的作业;
- 描绘班次与加班;
- 建模生产区域中的空间约束与班组移动。
分会: 制造系统的控制
论文: 面向车间控制的离散事件仿真
作者: J. S. Smith, R. A. Wysk, D. T. Sturrock, S. E. Ramaswamy, G. D. Smith, S. B. Joshi [1994]
摘要: 本文描述了仿真在柔性制造系统车间控制中的一项应用。仿真不仅被用作分析与评价工具,还被用作确定车间控制任务的任务生成器。采用这一方法,仿真中开发控制逻辑所付出的工作不会在控制系统开发中重复。相反,控制系统所采用的正是仿真中所用的同一套控制逻辑。此外,由于仿真正在实现这些控制,它能提供保真度很高的性能预测。本文描述了在两个柔性制造实验室中的实施经验。
分会: 柔性制造
论文: 利用仿真开发与分析柔性单元系统
作者: Edward F. Watson and Randall P. Sadowski [1994]
摘要: 本文开发并评价了若干柔性单元方案,以支持一家中型工业设备制造商的敏捷生产环境。基于传统的流程分析研究、以往经验与常识,开发了三种工作单元方案。仿真模型使分析人员既能在当前条件下评价各单元方案,也能在包含产品需求、产品组合与工艺技术变化的预期未来条件下加以评价。
分会: 生产系统的建模
论文: “准时制"生产的库存成本模型
作者: Mahesh Mathur [1994]
摘要: 本文给出一个仿真模型,用于在批量大小变化时比较准备成本与库存持有成本。虽然缩减批量是在单件车间环境中实施准时制(JIT)生产的必要步骤,但仍需仔细进行成本研究,以确定在当前设置条件下的最优批量。该仿真模型以动态方式在时间尺度上图形化地显示持有成本的波动与准备成本的累积。随后,最优批量的决策就可以基于现实的成本数据来作出。
分会: 制造系统的分析
论文: 制造系统中体力劳动强度的建模
作者: I. Ehrhardt, H. Herper, and H. Gebhardt [1994]
摘要: 本文描述了一个仿真模型,该模型把体力作业纳入考虑,以提高物流系统规划的有效性。尽管自动化程度不断提高,但在生产与物流中仍有一些关键任务交由人来完成。当前的仿真建模工作很少关注分配给人的体力活动。
分会: 制造案例研究
论文: 钢帘线制造中质量与生产率的仿真建模
作者: C. H. Turkseven and G. Ertek [2003]
摘要: 本文描述了仿真建模在估计和改善钢帘线制造系统质量与生产率表现方面的应用。它聚焦于断丝现象,这是系统扰动的一个重要来源。
分会: 制造分析与控制
论文: 生物技术制造中共享资源的产能分析
作者: P. V. Saraph [2003]
摘要: 本文讨论了仿真在分析拜耳公司(Bayer Corporation)某一制造设施中一项共享资源——速冻隧道(Blast Freezer)——产能需求方面的一项应用。仿真模型被用来分析工作负荷模式、运行不同的工作负荷方案(同时考虑不确定性与变动性),并就产能扩充计划提出建议。这项分析还证明了某些作业调度政策的益处。分析结果被用于确定 2002 年的资本投资。
分会: 制造分析与控制
论文: 采用选择性订单接收的订单生产制造系统中订单释放机制的行为
作者: A. Nandi and P. Rogers [2003]
摘要: 作者用一个仿真模型评价了一项有争议的政策,即在订单释放到车间之前,先让其在车间前缓冲池(preshop pool)中等待。在订单生产制造系统中,若产能是固定的、外生交期是不灵活的,那么让订单在车间前缓冲池中等待可能使系统整体的交期表现恶化。该模型被用来评价一种替代方法,即以有选择地拒绝订单的方式来应对需求激增,同时保持可接受的交期表现。
5 制造业示例:装配线仿真
本节描述一个用于最终装配"小装置”(gizmo)的生产线模型,随后重点说明如何用仿真来分析系统性能。
5.1 系统描述与模型假定
在某制造设施,一个工程团队已设计出一条用于最终装配小装置的新生产线。在为安装该新系统而投资之前,团队中的一些成员提议用仿真来分析该系统的性能,具体来说,是预测系统吞吐量(平均每 8 小时班次产出的小装置数)。此外,工程师们还希望评价对已设计系统的潜在改进措施。其中一项潜在改进是在相邻工作站之间增加用于存放在制品(WIP)的缓冲空间。
团队决定开发一个仿真模型并开展分析。他们的主要目标是:对给定的系统设计预测吞吐量(平均每班完成的小装置数),并评价其是否达到期望吞吐量。此外,若吞吐量低于预期,团队希望利用模型来帮助识别瓶颈、深入理解系统的动态行为,并评价潜在的设计改进措施。
所提出的生产线有六个工作站,以及用于在相邻工位之间存放 WIP 的专用货架。其中有四个人工工位,每个工位各有一名操作员;另有两个自动工位,两者共用一名操作员。六个工位按如下顺序执行生产任务:
工位 1:起始人工工位,开始新小装置的最终装配
工位 2:人工装配工位
工位 3:人工装配工位
工位 4:自动装配工位
工位 5:自动测试工位
工位 6:人工包装工位
在每个人工工位,操作员把小装置装到工作台上,执行若干任务,完成后把小装置卸下并放入供下一工作站使用的 WIP 存储中。操作员完成装卸任务分别需要 10 秒和 5 秒。
每一对相邻工位之间的 WIP 存储货架容量有限。如果某工位完成了其小装置上的任务,但下游货架已满,则该小装置必须留在工位内,从而阻塞任何进一步的工作。在初始设计中,WIP 存储货架的容量如表 2 所示。(假定工位 1 之前的 WIP 存储始终保持满,即 4 个单位;由于假定其始终是满的,其具体容量不起作用。)具有表 2 所列容量的系统设计称为基准配置(Baseline configuration)。
表 2 基准配置的 WIP 存储缓冲区容量
| 工位前的货架 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 缓冲区容量 | 4 | 2 | 2 | 2 | 1 | 2 |
不时会有工具发生故障,在人工或自动工位上造成未计划停机或意料之外的额外工作。此外,所有操作员都被安排在同一时间休息 30 分钟的午餐。午餐期间工作被中断,午餐后在中断处继续。这一中断/恢复规则适用于操作员的所有任务,包括装配作业、零件补给以及停机期间的维修。
在自动工位上,由机器执行装配或测试任务。自动工位可能有未计划(随机)停机,但在操作员午餐期间它们继续运行。一名操作员服务这两台机器,负责装卸小装置(分别为 10 秒和 5 秒)。装载完成之后,机器自行加工该小装置,除非发生停机,否则无需操作员进一步干预。在所有工位上,只要工位发生停机,操作员就按需要进行维修。
表 3 装配时间与零件补给时间
| 工位 | 每个小装置的装配时间(秒) | 零件号 | 零件补给时间(秒/批) | 每批零件数 |
|---|---|---|---|---|
| 1 | 40 | A | 10 | 15 |
| B | 15 | 10 | ||
| 2 | 38 | C | 20 | 8 |
| D | 15 | 14 | ||
| 3 | 38 | E | 30 | 25 |
| 4 | 35 | |||
| 5 | 35 | |||
| 6 | 40 | 30 | 32 |
a 在工位 6,零件号(F)代表运输容器。
表 3 给出了各工位的总装配时间与零件补给时间,以及一批中的零件数。人工工位的装配时间假定在表 3 所给数值的基础上上下浮动 2 秒(均匀分布)。零件补给并非对每个小装置都发生,而是在一批零件装配到小装置之后才发生。工位 4 与工位 5 的机器不消耗零件。
每个工位都可能出现未计划(随机)停机。人工工位 1、2 和 3 会出现刀具故障或其他意料之外的问题。自动工位偶尔会卡料,或出现其他需要指定操作员去处理的问题。工位 6(包装)不会出现这类停机。表 4 给出了失效时间(TTF)与修复时间(TTR)的分布假定,以及所假定的平均失效时间(MTTF)、平均修复时间(MTTR)与修复时间的离散程度(±)。例如,在工位 1,修复时间服从均值为 4.0 分钟、上下浮动 1.0 分钟的均匀分布;也就是说,均匀分布在 3.0 至 5.0 分钟之间。故障只可能在操作员或机器正在工作时发生;因此,TTF 的建模方式是只测量到故障发生为止的忙碌时间或加工时间。
模型的主要输出或响应量,是在所假定的每 8 小时班次中 7.5 个工作小时内的平均吞吐量。模型还要度量各工位的详细利用率,包括忙碌或加工时间、闲置或饥饿时间(没有准备好加工的零件)、阻塞时间(零件因下游 WIP 缓冲区已满而无法离开工位)、未计划停机,以及等待操作员的时间。
表 4 未计划停机的假定与数据
| 工位 | TTF | MTTF(分钟) | TTR | MTTR(分钟) | ± | 期望可用率 |
|---|---|---|---|---|---|---|
| 1 | 指数分布 | 36.0 | 均匀分布 | 4.0 | 1.0 | 90% |
| 2 | 指数分布 | 4.5 | 均匀分布 | 0.5 | 0.1 | 90% |
| 3 | 指数分布 | 27.0 | 均匀分布 | 3.0 | 1.0 | 90% |
| 4 | 指数分布 | 9.0 | 均匀分布 | 1.0 | 0.5 | 90% |
| 5 | 指数分布 | 18.0 | 均匀分布 | 2.0 | 1.0 | 90% |
当操作员与工位都已准备好加工下一个小装置、刚完成的小装置也离开了工位,但上游状况使得没有小装置准备好进入该生产步骤时,就发生了工位饥饿(starvation)。简言之,就是上游 WIP 缓冲区是空的。
当某工位完成了小装置上的全部任务,却因下游 WIP 缓冲区已满而无法释放该零件时,就发生了工位阻塞(blockage)。无论是饥饿还是阻塞,该工位的生产时间都被损失掉了,且无法补回。
当一名操作员服务多个工位时(如同服务工位 4 和 5 的那名操作员),两个工位有可能同时需要该操作员。这可能在该工位上造成额外延误,并用"等待操作员"状态来度量。将度量各工位的阻塞、饥饿与等待操作员时间,以帮助解释可能出现的吞吐量缺口,并协助识别潜在的系统改进措施。
5.2 仿真前分析
一项仿真前分析(presimulation analysis),在同时考虑平均工位周期时间与期望工位可用率(90%)的情况下,表明每个工位若不受阻碍,都能达到期望吞吐量。这项初步分析按本节所述方式进行。
根据所假定的停机数据,团队得以在(理想的)工位之间互不影响的假定下,估计工位的期望可用率。期望可用率表明每个工位在工作(不含午餐、不含休息)时间内的各自可用程度,其假定是操作员总能把完成的小装置放入下游货架存储,且下一个小装置已准备好在该工位开始工作。期望可用率由 MTTF/(MTTF+MTTR) 计算,即停机周期内的期望忙碌时间除以停机周期的长度(一个忙碌周期加一个修复周期),结果列于表 4。该计算忽略了问题中的某些方面,包括零件补给时间,以及只有一名操作员服务工位 4 和 5 所造成的任何延误。
所建模系统的设计目标是每 8 小时班次产出 390 个成品小装置。扣除午餐之后,每班最多有 7.5 小时可用工作时间。若未计划(随机)停机预计占可用时间的 10%,则工作时间进一步减少到 小时 = 6.75 小时。这意味着,总周期时间最慢的那个工位必须能在可用的 6.75 小时内生产 390 个小装置。因此,每个工位每个小装置的总周期时间不得超过 6.75 小时/390 = 62.3 秒。
现在,总周期时间由装配(或测试、包装)时间与零件补给时间(见表 3)构成,再加上小装置的装载时间 10 秒和卸载时间 5 秒。零件补给并非对每个小装置都发生,而是在经过一定数量的小装置(即用完某一批零件)之后才发生。例如,使用表 3 中工位 1 的数值,零件补给对零件 A 是每 15 个小装置花 10 秒,对零件 B 是每 10 个小装置花 15 秒,平均到每个小装置为 秒。
利用这些信息,各工位(最小)总周期时间的估计列于表 5。这些仿真前估计首先表明,每个理论周期时间都远低于 62.3 秒的要求;其次表明,若存在瓶颈,则工位 1 和 2 是潜在的瓶颈。
表 5 各工位总周期时间的估计
| 工位 | 估算周期时间的公式(秒) | 估计值(秒) |
|---|---|---|
| 1 | 57.2 | |
| 2 | 56.6 | |
| 3 | 54.2 | |
| 4 | 50.0 | |
| 5 | 50.0 | |
| 6 | 55.9 |
正如仿真分析稍后将展示的,工位 1 会因工位 2 的停机而发生阻塞,工位 2 则会因工位 1 的停机而偶发饥饿、因工位 3 的停机而发生阻塞。这些阻塞与饥饿状况把可用工作时间降低到所计算的 90% 以下;因此,对基准配置而言,它们使设计吞吐量远低于期望值,即每班 390 个小装置。总之,仿真前分析尽管有价值,但充其量只能给出系统性能的粗略估计。正如仿真将要表明的,忽略阻塞与饥饿会给出过于乐观的系统吞吐量估计。
5.3 仿真模型与已设计系统的分析
利用仿真模型,团队进行了第一组实验,用以估计按已设计方式建成的系统性能。团队中的仿真分析人员对模型作了 10 次重复,每次包含 2 小时的预热(warm-up)或初始化,其后是 5 天的仿真(每天 24 小时)。针对每班平均吞吐量计算了 95% 置信区间(CI):
每班平均吞吐量的 95% CI:(364.5, 366.8),即 365.7 ± 1.14。
以 95% 的置信度,模型预测:按已设计的系统,每 8 小时班次的平均(或长期平均)吞吐量将在 364.5 至 366.8 个小装置之间。这远低于每班 390 个小装置的设计吞吐量。
团队决定开展进一步分析,以识别可能的瓶颈与潜在的改进领域。
5.4 工位利用率分析
此时团队希望对吞吐量缺口有某种解释。他们怀疑这可能与 WIP 缓冲区容量过小以及由此产生的阻塞与饥饿有关。团队使用同一模型估计各工作站的详细利用率,希望它能对吞吐量缺口作出解释。表 6 给出前五个工作站的 95% 置信区间估计,包括停机时间百分比、阻塞时间百分比、饥饿时间百分比以及等待操作员时间百分比。(等待操作员只影响工位 4 和 5,因为这两个工位共用一名操作员;其余工位各有专属操作员。除表 6 中的利用率统计之外,操作员每 8 小时班次还有 30 分钟的午餐,相当于可用时间的 6.25%。)
表 6 基准配置下各工位利用率的置信区间
| 工位 | 停机百分比 | 阻塞百分比 | 饥饿百分比 | 等待操作员百分比 |
|---|---|---|---|---|
| 1 | (8.8,9.6) | (11.4,12.5) | (0.0,0.0) | (0.0,0.0) |
| 2 | (8.2,8.4) | (8.0,8.8) | (4.9,5.6) | (0.0,0.0) |
| 3 | (7.9,8.6) | (9.9,10.4) | (6.1,6.9) | (0.0,0.0) |
| 4 | (8.9,9.6) | (2.0,2.8) | (7.5,8.2) | (13.1,14.4) |
| 5 | (8.3,9.0) | (0.0,0.2) | (19.4,20.4) | (3.9,4.7) |
从表 6 的结果看,阻塞与饥饿解释了吞吐量缺口的一部分。此外,另一种可能的解释浮现出来:工位 4 经历了相当长时间在等待那名同时服务工位 4 和 5 的操作员。工位 4 上的这一延误可能造成 WIP 缓冲区被填满,而这反过来又有助于解释位于其上游的工位 3 的阻塞。工位 1 至 3 的阻塞时间百分比高于饥饿时间百分比,因此下游延误看来可能是显著的瓶颈。
团队提出了一些可能的系统改进方案:
- 由两名操作员(而不是目前设想的一名)服务工位 4 和 5;
- 增大部分 WIP 缓冲区的容量;
- 两者的组合。
由于额外的 WIP 存储空间开销不小,团队希望把缓冲区总空间尽可能地保持最小,只有在绝对必要时才增加操作员,同时又要达到每班 390 个小装置的设计目标。
5.5 潜在系统改进的分析
为评价增加一名操作员和采用更大 WIP 缓冲区这两种措施,对模型作了相应修改以允许这些变化,并开展了新的分析。在这次分析中,允许工位 2 至 6 的每个 WIP 缓冲区容量在表 2 所列基准值的基础上各增加一个单位。此外,还考虑了工位 4 和 5 增加第二名操作员的效果。这些可能性组合起来,共产生 64 个方案或模型配置。(为什么是 64?)每个方案作 10 次重复,合计 640 次仿真运行。
为便于分析,团队决定采用公共随机数(Common Random Number, CRN)技术。为正确实现该技术,需要先确定每一个随机变动的来源,并为其分配专门的随机数流。在本模型中,六个工作站的加工时间、TTF 和 TTR 均由统计分布建模。因此共定义了 18 个随机数流,每个工作站使用 3 个。这样一来,在每一组运行中,无论仿真的是哪一种配置,每个工作站经历的工作量与随机停机都是相同的。对于给定次数的重复,CRN 技术(亦称相关抽样,correlated sampling)预期能给出系统性能差值更短的置信区间。
表 7 备选配置下系统吞吐量的改进
| 工位 4 与 5 的操作员人数 | 缓冲区 2 | 缓冲区 3 | 缓冲区 4 | 缓冲区 5 | 缓冲区 6 | 合计 | 平均吞吐量增量(与基准相比) | CI 下限 | CI 上限 |
|---|---|---|---|---|---|---|---|---|---|
| 2 | 3 | 3 | 3 | 2 | 2 | 13 | 31.7 | 30.3 | 33.1 |
| 2 | 3 | 3 | 3 | 2 | 3 | 14 | 31.7 | 30.4 | 33.0 |
| 2 | 3 | 3 | 2 | 2 | 3 | 13 | 30.0 | 28.6 | 31.3 |
| 2 | 3 | 3 | 3 | 1 | 3 | 13 | 29.8 | 28.6 | 31.0 |
| 2 | 3 | 3 | 2 | 2 | 2 | 12 | 29.7 | 28.1 | 31.3 |
| 2 | 3 | 3 | 3 | 1 | 2 | 12 | 29.5 | 28.1 | 31.0 |
| 2 | 3 | 3 | 2 | 1 | 3 | 12 | 26.6 | 25.4 | 27.9 |
| 2 | 2 | 3 | 3 | 2 | 2 | 12 | 26.6 | 25.1 | 28.1 |
| 2 | 2 | 3 | 3 | 2 | 3 | 13 | 26.6 | 25.0 | 28.1 |
| 2 | 3 | 2 | 3 | 2 | 3 | 13 | 26.5 | 25.0 | 28.0 |
| 2 | 3 | 2 | 3 | 2 | 2 | 12 | 26.4 | 25.3 | 27.5 |
| 2 | 3 | 3 | 2 | 1 | 2 | 11 | 26.3 | 25.1 | 27.5 |
与基准配置相比,系统吞吐量改进最大的若干模型配置列于表 7。之所以选取这些配置作进一步评价,是因为每一个都显示出约 25 个或更多的潜在吞吐量改进;也就是说,95% 置信区间的下限为 25 或更高。“平均差值”(Ave Diff.)一列所列的数值,代表相对于基准配置的吞吐量增量。回顾一下,基准吞吐量此前曾以 95% 的置信度估计落在区间 (364.5, 366.8) 内。出于保守考虑,工程团队希望看到每班改进量为 390 − 364.5 = 25.5 个小装置。表 7 中前六个配置的置信区间下限都大于 25.5,因此它们很可能是达到期望吞吐量的候选方案。从统计意义上解释:置信区间的下限大于 25.5,因此结果以 95% 的置信度表明,在表 7 所列的前六个配置中,平均吞吐量将增加 25.5 或更多。
请注意,改进最显著的所有配置都包含工位 4 和 5 的两名操作员。配置为一名操作员的仿真结果(此处未列出)表明:至少在所考虑的缓冲区尺寸下,无法用一名操作员达到 390 的吞吐量。
有些配置可以排除掉,因为更省钱的选项取得了相近的吞吐量。以表 7 中的前两个配置为例:两者除缓冲区 6 的容量外完全相同。由于 WIP 缓冲区容量成本较高,总缓冲区容量较小的那个方案就是更省钱的选项。显然,没有必要把缓冲区 6 从 2 个单位扩到 3 个单位。“合计"这一列有助于快速排除那些并不优于"总缓冲区容量更小的相近方案"的配置。
在表 7 中,吞吐量增量达到 25.5 或以上且总缓冲区容量最小的是第五个配置,缓冲区 2 至 6 的容量依次为 (3,3,2,2,2)。基于这些考虑,该系统设计成为团队进一步评价的首选方案。下一步(此处未包括)将是对每个备选配置进行财务分析。
5.6 结语:小装置装配线仿真
与本例模型类似的真实世界实例包括:汽车零部件与汽车车身的装配线、汽车污染控制组件的装配、洗衣机、炉灶和洗碗机等消费品的装配,以及其他各种具有直通流程且工作站之间缓冲空间有限的装配作业。类似的模型与分析也可以应用于生产多种产品、工艺路线可变且在制品存储有限的单件车间。
6 小结
本章介绍了与制造仿真和物料搬运仿真最为相关的一些思想与概念。其要点包括:准确建模停机的重要性;跟踪驱动仿真就某些输入而言所具有的优势;以及在某些模型中对物料搬运设备与控制软件进行准确建模的必要性。
参考文献
BANKS, J. [1994], “Software for Simulation,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds., Lake Buena Vista, Fl, Dec. 11–14, pp. 26–33.
CLARK, G. M. [1994], “Introduction to Manufacturing Applications,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds., Lake Buena Vista, Fl, Dec. 11–14, pp. 15–21.
EHRHARDT, I., H. HERPER, AND H. GEBHARDT [1994], “Modelling Strain of Manual Work in Manufacturing Systems,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds., Lake Buena Vista, Fl, Dec. 11–14, pp. 1044–1049.
LAW, A. M. AND W. D. KELTON [2000], Simulation Modeling and Analysis, 3d ed., McGraw–Hill, New York.
MATHUR, M. [1994], “Inventory Cost Model for ‘Just-in-time’ Production,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds., Lake Buena Vista, Fl, Dec. 11–14, pp. 1020–1026.
NANDI, A., AND P. ROGERS [2003], “Behavior of an Order Release Mechanism in a Make-to-Order Manufacturing System with Selected Order Acceptance,” in Proceedings of the 2003 Winter Simulation Conference, S. E. Chick, P. J. Sánchez, D. Ferrin, and D. J. Morrice, eds., New Orleans, La, Dec. 7–10, pp. 1251–1259.
PIERCE, N. G., AND R. STAFFORD [1994], “Modeling and Simulation of Material Handling for Semiconductor Wafer Fabrication,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds., Lake Buena Vista, Fl, Dec. 11–14, pp. 900–906.
SARAPH, P. V. [2003], “Shared Resource Capacity Analysis in Biotech Manufacturing,” in Proceedings of the 2003 Winter Simulation Conference, S. E. Chick, P. J. Sánchez, D. Ferrin, and D. J. Morrice, eds, New Orleans, La, Dec. 7–10, pp. 1247–1250.
SCOTT, H. A. [1994], “Modeling Aircraft Assembly Operations,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds., Lake Buena Vista, Fl, Dec. 11–14, pp. 920–927.
SMITH, J. S., et al. [1994], “Discrete Event Simulation for Shop Floor Control,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds, Lake Buena Vista, Fl, Dec. 11–14, pp. 962–969.
TURKSEVEN, C. H., AND G. ERTEK [2003], “Simulation Modeling for Quality and Productivity in Steel Cord Manufacturing,” in Proceedings of the 2003 Winter Simulation Conference, S. E. Chick, P. J. Sánchez, D. Ferrin, and D. J. Morrice, eds., New Orleans, La, Dec. 7–10, pp. 1225–1229.
WATSON, E. F., AND R. P. SADOWSKI [1994], “Developing and Analyzing Flexible Cell Systems Using Simulation,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds., Lake Buena Vista, Fl, Dec. 11–14, pp. 978–985.
WILLIAMS, E. J. [1994], “Downtime Data— Its Collection, Analysis, and Importance,” in Proceedings of the 1994 Winter Simulation Conference, J. D. Tew, S. Manivannan, D. A. Sadowski, and A. F. Seila, eds., Lake Buena Vista, Fl, Dec. 11–14, pp. 1040–1043.
习题
致学生的说明:以下许多习题都包含输送带和车辆之类的物料搬运设备。学生应当使用任何能够在较高层次上对输送带和车辆建模的仿真语言或仿真器。
以下有些习题使用均匀分布、指数分布、正态分布或三角分布。几乎所有的仿真语言和仿真器都支持这些分布以及其他分布。
- 一个案例分拣系统由一条进料输送带和 12 条分拣通道组成,如下图所示(不按比例):

图 1 案例分拣系统示意图(不按比例)。
案例从左侧以每分钟 50 件的速率在随机时刻进入系统。所有案例的尺寸为 18 × 12 英寸,并沿其 18 英寸的边长方向行进。进料主线输送带宽 20 英寸、长 60 英尺(如图所示)。分拣通道从左到右编号为 1 至 12,宽 18 英寸、长 15 英尺,相邻通道之间间隔 2 英尺。(其他所需尺寸请自行估算。)进料输送带的速度为 180 英尺/分钟,分拣通道的速度为 90 英尺/分钟。所有输送带区段均为累积式,但从左侧进入时,进入的案例彼此之间(从前缘到前缘)至少相距 2 英尺。在分拣通道上,案例无间隙地累积在一起。
进入的案例按下列比例分配到 12 条通道:
| 通道 | 比例 | 通道 | 比例 |
|---|---|---|---|
| 1 | 6% | 7 | 11% |
| 2 | 6% | 8 | 6% |
| 3 | 5% | 9 | 5% |
| 4 | 24% | 10 | 5% |
| 5 | 15% | 11 | 3% |
| 6 | 14% | 12 | 0% |
第 12 条通道是溢出通道;只有当其他某条通道被填满且无法分流时才使用它。
在分拣通道的末端有一组操作员,他们用条形码扫描器扫描每个案例、贴上标签,然后把它放到托盘上。操作员在通道之间来回移动,以免某条通道被填满。每条通道有一个托盘,每个托盘可装 40 个案例。当托盘装满时,假定立刻有一个新的空托盘可用。如果某条通道已填满 10 个案例,而又一个案例到达分流点,则这最后一个案例继续沿 60 英尺长的主线输送带行进,并被分流到第 12 条通道,即溢出通道。
假定一名操作员平均每分钟能处理 8.5 个案例。忽略行走时间,也忽略把操作员指派到某一条具体通道的问题;换句话说,假定这些操作员作为一个小组,均匀分布在全部 12 条通道上。
(a) 设计一项改变操作员人数的实验,回答如下问题:需要多少名操作员?目标是在同时避免溢出的前提下,使操作员人数最少。
(b) 对 (a) 中的每项实验,报告下列输出统计量:
- 操作员利用率;
- 码放到托盘上的案例总数;
- 各通道码放到托盘上的案例数;
- 进入溢出通道的案例数。
(c) 对 (a) 中的每项实验,验证所有案例是否都在被码放到托盘上。换句话说,验证该系统能否处理每分钟 50 个案例,或者解释为何不能。
- 重新完成习题 1,但提高到更精细的程度:把操作员的行走时间和操作员对通道的指派都纳入建模。假定操作员的行走速度为每分钟 200 英尺,从一条通道到相邻通道的行走距离为 5 英尺。现在假定每分钟处理 7.5 个案例。设计一组可供操作员换通道时使用的规则。(提示:例如,只在当前通道已空或另一条通道达到某一水平时,才换到案例数最多的那条通道。)假定每名操作员被指派到若干条相邻的通道,并且只处理这些通道。不过在必要时,一条通道可以指派两名操作员(但不得更多);也就是说,操作员的指派范围可以重叠。
(a) 如果你的换通道规则含有数值参数,通过实验找出最佳设定。在这种情况下,需要多少名操作员?操作员的平均利用率是多少?
(b) 细节更多的模型(例如习题 2(a) 相对于习题 1)是否总是更准确?对这个特定的模型而言又如何?把习题 2(a) 的结果与习题 1 的结果作比较。所得到的结论是相同还是不同?
(c) 设计第二条换通道规则。比较两条规则的结果。比较两条规则下的总行走时间或用于行走的时间百分比。
建议:一条换通道规则可以有一个或两个"触发条件”。单触发条件规则可以这样表述:若某条通道达到某一水平,操作员就转到该通道。(提示:若不作修改,这样的规则可能导致操作员过度移动——如果两条通道在触发水平附近的案例数大致相同。)双触发条件规则可以这样表述:若某条通道达到某一水平、且操作员当前所在的通道变空,则换到新通道;但若某条通道达到某个更高的临界水平,则操作员立即换通道。
(d) 把你的结果与其他可能采用了不同换通道规则的学生所得的结果作比较。
重新完成习题 2,但采用不同的操作员指派规则。基本做法是:操作员可以视条件需要被指派到任意通道,但与前面一样,同一时刻一条通道不得指派超过两名操作员。回答与习题 2 中相同的 (a)–(d) 各项问题。
一个包裹分拣系统由一条进料输送带、12 条分拣通道(或滑槽)和一条输出输送带组成,如下图所示(不按比例):

图 2 包裹分拣系统示意图(不按比例)。
包裹从左侧(在 E 点)以每分钟 100 件的速率在随机时刻进入系统。包裹依据其发运目的地被分流到某条分拣通道;在模型中,按下表所列比例随机选取一定百分比的包裹,分派到各条通道。各通道/目的地的百分比如下:
| 通道 | 比例 | 通道 | 比例 |
|---|---|---|---|
| 1 | 6% | 7 | 10% |
| 2 | 6% | 8 | 6% |
| 3 | 5% | 9 | 4% |
| 4 | 24% | 10 | 4% |
| 5 | 15% | 11 | 3% |
| 6 | 14% | 12 | 3% |
在累积了 8 个包裹的一"串"(slug)之后,它们被一起释放到一段 50 英尺长的输出输送带上,朝标记为 T 的点行进;在那里它们以输送带速度转接到输出输送带的第二段上,该段的末端是一台条形码扫描仪(位于标记为 B 的点)。在上一串尚未完全通过 T 点之前,一串不能被释放。在本模型中,包裹在 B 点消失。
所有包裹的尺寸为 18 × 12 英寸,并沿其 18 英寸的边长方向行进。进料主线输送带宽 20 英寸、长 60 英尺(如图所示)。12 条分拣通道宽 18 英寸、长 15 英尺,相邻通道之间间隔 2 英尺。(其他所需尺寸请自行估算。)进料输送带的速度为 240 英尺/分钟,分拣通道的速度为 90 英尺/分钟。进料与分拣输送带区段均为累积式,但从左侧进入时,进入的包裹彼此之间(从前缘到前缘)至少相距 2 英尺。在分拣通道上,包裹无间隙地累积在一起。输出输送带的 50 英尺段是非累积式的带式输送带;30 英尺段则是累积式的。
当某条通道容纳了 8 个包裹时,在该通道被释放、且这一串完全通过滑槽底部之前,不允许再作分流。当某条通道已满,或在这一串尚未通过之前,若又有一个包裹到达需要分流的位置,则该受影响包裹不予分流,而是移动到进料输送带的末端,然后通过图中未画出的输送带重新返回进料输送带的起点。仿真时把这种回流视为 45 秒的时间延迟,而不必显式建模回流输送带本身。
(a) 设计一项实验,以确定输出输送带所需的最低速度,从而尽量减少或消除回流。供应商提供的输送带速度从每分钟 60 英尺起步,并以每分钟 30 英尺为增量递增。(输送带越快越贵,因此在回流不成问题的前提下,速度越低成本越低。)
(b) 对可用通道的目的地指派是否可以加以修改,从而改善系统性能?设计一条更好的指派规则,并用仿真模型加以检验。
- 一支 AGV(自动导引车,Automated Guided Vehicles)车队以串联方式服务 5 个工作站,通过把装夹具上的零件从一个工作站运到下一个工作站来运送物料,并自取货点起一直载着该零件通过所有工作站直至卸货点。来料缓存输送带、AGV 导引路径、5 个工作站(A–E)以及卸货输送带如下图所示(不按比例):

图 3 AGV 导引路径与工作站布局示意图(不按比例)。
AGV 沿顺时针方向行驶。起初它们全为空,在来料输送带标记为 “On” 的点上排队。各工作站标记为 A–E。装在夹具上的零件在来料输送带上暂存,并由 AGV 在标记为 “On” 的点上取走。随后 AGV 行驶到机器 A,并停在导引路径上标出的点上。在加工期间,零件与夹具始终留在 AGV 上,然后两者一起前往下一个工作站。在工作站 E 加工完成之后,AGV 行驶到标记为 “Off” 的点,零件连同夹具自动卸到卸货输送带上,空的 AGV 则在标记为 “On” 的点上排队等待下一个零件。
假定来料输送带始终是满的。它长 15 英尺,可容纳 3 个带夹具的零件,每个占用 5 英尺的输送带空间。因此,每当一个带夹具的零件被 AGV 取走,就会有另一个零件连同夹具被放到输送带末端。取货时间为 30 秒。来料输送带的速度为每分钟 30 英尺。
当一个零件在所有工作站完成加工并被运到标记为 “Off” 的卸货点时,卸货操作耗时 45 秒。卸货输送带本身的速度为每分钟 30 英尺。零件与夹具虽然占用 3 英尺 × 3 英尺的空间,但在输送带上需要 5 英尺。
初始的工作站位置只是示意性的概略安排,没有给出确切位置。约束条件是:每个工作站都必须布置在示意图上所示的那段直线路径上,且 AGV 停车点距曲线段的入口或出口不得少于 5 英尺。来料输送带与卸货输送带必须按图所示布置,卸货点距前一段曲线的末端 20 英尺,取货点再往右 40 英尺。除此之外,各工作站的 AGV 停车点可以布置在直线路径上的任意位置。
AGV 的行驶速度为每秒 15 英尺,加速度与减速度为 3 英尺/秒/秒。它们长 7 英尺,在工作站处等待加工位置时以及在输送带的取货/卸货位置处,彼此相隔 8 英尺排队(两台 AGV 之间留 1 英尺间隙)。
各工作站的单件加工时间、平均失效时间(MTTF)和平均修复时间(MTTR)如下:
表 8 各工作站的加工时间、失效时间与修复时间
| 工作站 | 加工时间(秒) | MTTF(分钟) | MTTR(分钟) |
|---|---|---|---|
| A | 120 | 90 | 3.1 |
| B | 100 | 82 | 4.0 |
| C | 140 | 110 | 4.5 |
| D | 45 | 20 | 5.0 |
| E | 100 | 240 | 9.0 |
由于没有详细数据,故对失效时间和修复时间作如下假定:假定实际失效时间服从指数分布,取所指定的均值(MTTF)。假定修复时间需要一名维修人员,而只有一名可调用。实际修复时间服从均匀分布,均值如表所示,半宽为该均值的一半。失效时间是对照挂钟时间度量的,而不是对照工位忙碌时间。修复之后,取出剩余的加工时间,该零件继续加工。
有三个基本问题:
(1) 系统的最大吞吐量是多少?
(2) 需要多少台 AGV?
(3) 在上述约束之内,工作站的最佳布置是什么?
对于 (a)、(b) 两组实验中的每一组,都应考虑下列问题:
(1) 是否应当设置一段用于装载系统的预热期,在此期间不收集统计量?
(2) 仿真应当运行多长时间?
(一项建议:预热期至少应持续到若干个零件完成加工为止。运行时长应当允许每台机器上至少发生 10 次停机。先用尽可能多的、能合理地停在导引路径上的 AGV 进行仿真,然后再在不降低吞吐量的前提下逐步减少其数量。)
你的实验应当改变 AGV 的数量和工作站的布置。在仿真之前,先就工作站的布置作出你最好的估计,并论证该选择的理由。同时,就 AGV 数量的可能取值范围作出合理估计。
(a) 在第一组实验中,使用一个不显式建模 AGV 的粗略模型。计算相邻工作站之间的近似行驶时间,并在模型中把该值用作时间延迟。假定 AGV 数量充足。(提示:用该模型来回答最大吞吐量的问题,但不用于回答所需 AGV 数量的问题。)这种做法有哪些优点和局限?
(b) 在第二组实验中,显式地建模 AGV 与导引路径。设计一项实验,用以确定在 AGV 数量最少的前提下的最大系统吞吐量(件/小时)。
- 关于习题 5 中各工作站的失效时间,已获得更准确的信息。用新的信息重新完成习题 5。故障看来与所加工的零件数量关系比与所经过的时间关系更为密切。新数据如下:
表 9 以零件数计的平均失效时间
| 工作站 | MTTF(件) | MTTR(分钟) |
|---|---|---|
| A | 45 | 3.1 |
| B | 49 | 4.0 |
| C | 47 | 4.5 |
| D | 27 | 5.0 |
| E | 144 | 9.0 |
请注意,MTTF(平均失效时间)是以零件数量来度量的,但关于修复时间的假定与习题 5 相同。例如,对工作站 A,若失效时间恰好是 45 个零件,那么在一次故障之后,第 45 个零件就会遇到下一次故障。实际上,故障是在加工过程中发生的,但就建模目的而言,假定故障恰好在加工开始时发生。(这会造成任何差别吗?)
对于失效时间的分布,假定采用离散均匀分布,均值为 MTTF,取值范围从 1 到 $2*MTTF - 1$ 。例如,对工作站 A,实际失效时间取 1 到 89 件之间的任一值都是等可能的。
回答与习题 5 中相同的问题。这些新假定会造成任何差别吗?与修正后的假定相比,在第一组假定下每个 8 小时班次会发生多少次故障?
- 针对习题 5 和习题 6 中的问题,曾做过一项研究,以便更准确地评估各工作站的修复时间。结果发现,三角分布与实际修复时间更为吻合。对三角分布假定如下参数:
表 10 各工作站的修复时间(三角分布参数)
| 工作站 | 最小值(分钟) | 最可能值(分钟) | 最大值(分钟) | 平均值(分钟) |
|---|---|---|---|---|
| A | 1.0 | 2.3 | 6.0 | 3.1 |
| B | 2.0 | 3.0 | 7.0 | 4.0 |
| C | 2.5 | 3.5 | 7.5 | 4.5 |
| D | 2.0 | 4.0 | 9.0 | 5.0 |
| E | 4.0 | 7.0 | 16.0 | 9.0 |
请注意,平均修复时间与习题 5 和 6 中所假定的平均值(MTTR)完全相同,只是分布为三角分布而非均匀分布。(大多数仿真语言或仿真器都内置了三角分布,需要指定其最小值、最可能值(众数)和最大值。平均值仅供信息参考;它等于其余三个参数之和除以 3。)
(a) 采用新的修复时间假定,重新完成习题 5。
(b) 采用新的修复时间假定,重新完成习题 6。
- 本章讨论过的一种停机建模方法(但并不推荐),是用一个更大的、经调整的处理时间替代原来的处理时间,并把停机排除在外。该经调整的处理时间意在至少从长期和平均的角度上反映停机的影响。这种方法会给习题 5 的结果带来什么影响?
(a) 对习题 5,计算各工作站经调整的处理时间。
(b) 对习题 5,使用经调整的处理时间,并排除所有由故障引起的显式停机。这会如何改变结果?这种方法对该模型而言是否合适?
假定更好的维护和更好的机器能够完全消除习题 5 系统中因故障而引起的停机。吞吐量会提高多少?
为例 1 开发一个模型,并设法在定性上重现正文中关于模拟停机的不同假定所得到的结果。不必刻意得到完全相同的数值结果,只需展示相同的定性结果。
(a) 你的模型是否支持正文中所讨论的结论?请给出讨论与结论。
(b) 绘制队列中实体数量随时间变化的曲线。你能判断出故障发生在什么时候吗?修复之后,队列大约需要多长时间才恢复正常?
- 在例 1 中,与一个实体的加工时间相比,故障发生的频率较低。失效时间为 1000 分钟,而到达间隔时间为 10 分钟,这意味着很少有实体会遇到故障。但当一个实体确实遇到故障时(平均 50 分钟),其持续时间是 7.5 分钟加工时间的数倍。
重新为例 1 建立模型,但假定高频故障。具体而言,假定失效时间服从指数分布、均值为 2 分钟,修复时间服从指数分布、均值为 0.1 分钟即 6 秒。与低频情形相比,实体往往会经历若干次短暂的停机。
对于低频停机与高频停机,请比较:每个实体经历的平均停机次数、经历的平均停机持续时间、完成服务的平均时间(含停机时间,如有),以及停机时间所占的百分比。
请注意,机器因维修而停机的时间百分比在两种情形下应当相同:
根据仿真结果验证停机时间百分比。结果是相同的吗?……是接近的吗?它们应当是完全相同,还是仅仅接近?随着仿真运行时长的增加,停机时间百分比应当发生什么变化?
在高频故障情形下,你是否得出了与正文中关于模拟停机的不同方式所得出的相同结论?关于低频故障与高频故障应当如何建模,请提出建议。
重新完成习题 11(以例 1 为基础),但作一处改动:当一个实体遇到停机时,它必须从头重新加工。若服务时间是随机的,则从所假定的分布中重新抽取一次;若服务时间是恒定的,则重新从头开始。这一假定会如何影响结果?
重新完成习题 11(以例 1 为基础),但作一处改动:当一个实体遇到停机时,该实体被报废。在故障时报废实体,会如何影响低频情形和高频情形下的结果?对于零件在故障时被报废的情况下,低频停机与高频停机应当如何处理,请提出你的建议。
金属板依次通过 4 台压力机:剪切机、冲孔机、成型机和折弯机。每台机器都会出现停机与换模。各机器的参数如下:
表 11 各压力机的加工速率、失效时间、修复时间与换模参数
| 压力机 | 加工速率(件/分钟) | 失效时间(分钟) | 修复时间(分钟) | 每次换模的板件数(件) | 换模时间(分钟) |
|---|---|---|---|---|---|
| 剪切机 | 4.5 | 100 | 8 | 500 | 25 |
| 冲孔机 | 5.5 | 90 | 10 | 400 | 25 |
| 成型机 | 3.8 | 180 | 9 | 750 | 25 |
| 折弯机 | 3.2 | 240 | 20 | 600 | 25 |
请注意,加工时间是以速率给出的;例如,剪切机的工作速率为每分钟 4.5 件。假定加工时间为常数。自动化设备使换模时间相当稳定,因此假定它总是 25 分钟。换模发生在表中所示数量的板件通过某台机器之后、连续两件板件冲压之间。假定失效时间服从指数分布,均值取自表中。假定修复时间服从均匀分布,均值取自表中,半宽为 5 分钟。当发生故障时,20% 的板件被报废。其余 80% 在修复之后于发生故障的机器上重新加工。
假定在剪切机前方有无限量的物料供应;只要它与下一台机器(冲孔机)之间还有可用空间,剪切机就连续地一件接一件地加工。一般而言,一台机器连续地一件接一件地加工,只有在下列三种情况下才停止:发生停机、进行换模,或它与下一台机器之间的可用缓冲空间已被填满。假定板件在折弯机折弯之后被运走。缓冲空间划分为 3 个彼此独立的区域:第一个在剪切机与冲孔机之间,第二个在冲孔机与成型机之间,第三个在成型机与折弯机之间。
(a) 假定机器之间的空间是无限的。仿真运行 480 小时(按每天 24 小时、每周 5 天计约合 1 个月)。积压发生在何处?如果全部三个缓冲区的总缓冲空间限定为 15 件板件(剪切机之前与折弯机之后的不计),你会建议如何在这三对相邻机器之间分配这些空间?本次仿真是否提供了足够的信息以作出合理的决策?
(b) 修改模型,使相邻机器之间具有有限的缓冲区。当缓冲区被填满、而向该缓冲区供料的机器完成了一件板件时,该板件无法离开机器。它滞留在机器内,阻塞进一步的工作。假定三个缓冲区的总缓冲空间为 15 件板件。
以 (a) 中的建议作为每个缓冲区尺寸的起点。尽量减少运行的次数。每个缓冲区最多允许试验 3 种缓冲尺寸。(这样一共需要多少次运行?)运行一组实验,以确定使产量最大的缓冲空间分配方案。每种备选方案至少仿真 1000 小时。
报告平均每小时的总产量、压力机利用率(分解为忙碌、停机、换模和空闲各占的时间百分比),以及每个缓冲区中板件的平均数量。