1第6章终态仿真输出分析在本书2.6节中曾提醒读者,当建立仿真模型时,随机数据(即分布或概率驱动的)输入会带来输出的随机性及相关统计分析问题,这是迄今为止本书中建立的所有模型都面临的问题。本章中,将以第5章中所建立的汽车维修店仿真模型5-2为例,教读者如何在仿真中采集适当的数据,如何从已得到的输出报告对这些数据进行统计分析。同时,本章还介绍如何使用输出分析器(OutputAnalyzer)做更为深入复杂的统计分析(对仿真模型中两个不同方案进行比较),如何使用过程分析器(ProcessAnalyzer)(通过运行多种可行的备选方案,从中选择出最佳方案,或是衡量输入数据对输出数据的影响作用),以及如何使用Arena中的OptQuestforArena工具与Arena配套的仿真优化软件(它将控制仿真模型的运行,从而寻找输入控制参量的最佳配置)。在第6.1节中,将讨论仿真运行的时间类型,它对输出统计分析有很大影响。在6.2和6.3节中将以模型5-2为例,介绍单变量数据收集并对其进行统计分析的基本技巧。6.4节中将对该模型的输入参数进行简单的改动并利用Arena中的输出分析器来验证仿真结果是否发生改变。6.5节将引入更多的模型变化,使用过程分析器以一种更高效有序的方式运行它们,从而找出那些效果可能最好的参数,并且分析输入数据对输出结果的影响作用。最后,6.6节中将应用OptQuestforArena工具在大量可能的模型输入参数组合中,快捷高效地搜寻至少在某种意义下是最优的模型结构。总之,本章将阐明获得精确可靠结果的统计分析方法,这些数据将帮助决策者做出正确且富有远见的决策。过去许多人几乎忽略了上述的问题,所幸那令人羞愧的事现在已经没有了。如果仅仅运行一次仿真模型,之后就试验几个随机抽出的方案(并且只运行一次),那么这样的结果或结论的有效性、精确性或者一般性显然是无法保证的。有时候结论的有效性、精确性以及一般性是不正确的,因此有可能做出不适当的估计及错误的决策。读者将会发现,要做好这些事情其实不费太多的力气,只是你的计算机可能会忙碌一些,但无论如何计算机在大部分的工作时间里还是闲置的,并且机器运行是廉价的(相对于读者将要根据仿真结果所做出的决策而言)。读者已经辛苦地建好了仿真模型,现在该是让模型(及计算机)运行并检验其性能的时候了,这样你才能有充分的把握将这些结论应用到决策中去。26.1仿真类型多数仿真都可以被归类为终态仿真或稳态仿真。对大多数模型来说,这主要取决于研究目的,与模型的内部逻辑或是结构没有太大关系。终态仿真就是在仿真模型中明确地规定了仿真开始和结束的条件,这些条件是目标系统实际运行模式的反映。正如其名称所显示的,仿真运行将在模型中某个定义好的规则或是条件下终止。譬如,一家商店在早晨9点开门营业,正常情况下晚上9点关门结束营业,但是当还有顾客排队时,商店会适当延长营业时间直到所有顾客都离去。另一个例子,某流水线车间根据订单需要生产500件产品,那么系统就一直运行到所有500件产品都装配完成为止。在终态仿真的时间结构中,最关键的一点是有一个明确定义的起始点以及一个明确定义的自然的终止点(尽管可能在仿真开始时并不知道这个终止时间是多少)。与终态仿真不同,稳态仿真中对于数量的估计是建立在长期运行的基础上的,理论上运行时间是趋于无穷的。在理论上(尽管在实际中常常不是这样)仿真的初始条件是不影响仿真结果的。当然,稳态仿真也会在某一时刻终止,读者可以猜想到那是相当长的一个运行过程;读者还需要做另外一些工作来确保仿真运行时间已足够长,这将是本书在7.2节中讨论的问题。以急诊室为例,它将永远不会真正停止工作或是重新开始,故而采用稳态仿真将是非常恰当且合乎实际的。有时人们在做一个系统的稳态仿真时也会让它在一定的时候终止下来,这样做的目的是为了设计某些最坏的情形或是峰值负荷的情形。本章中,将以第五章中的汽车维修店仿真模型5-2为例,对其进行终态仿真统计分析,该系统将在第五章中描述的情形下开始运行,并在20个工作日(每个仿真工作日为12小时)后终止仿真运行,仿真时间大约一个月。(本模型同样适用于稳态仿真,让运行时间大大超过20个工作日即可,但除了仿真长度外没有别的变化;这里选择运行20个工作日只是将其作为终态仿真来研究而已。)稳态仿真的统计分析与终态仿真是不同的(本书将在第7.2节中以7.1节建立的模型为例进行说明)。6.2数据收集及分析策略对于终态仿真,要为统计分析收集恰当的数据从概念上讲是非常简单的做n次独立的重复运行即可。11虽然概念上很简单,但也说明了对于大型的或是有很多变量的仿真模型来说,需要大量的运行时间。3为完成这一工作,打开RunSetupReplicationParameters对话框,在NumberofReplication选项中键入读者希望的重复仿真次数n。值得注意的是,要确保InitializeBetweenReplications栏中的两个复选框都是被选中的(缺省值),这样才能保证系统状态变量以及统计累加器在每次仿真结束后都被清零,也即各次重复仿真所使用的是独立同分布(IID)的数据。这些设置将能够保证仿真重复运行n次,每次运行都从初始状态开始运行(初始的系统状态及清空的统计累加器)并且应用了独立随机数来驱动仿真2。对每次重复仿真而言,都独立产生该次仿真的输出报告,可通过CategorybyReplication报告查看。表6-1模型5-2重复仿真10次所得的每天平均利润(DailyProfit)与未能按时完成服务的等待顾客数(DailyLateWaitJobs)重复次数DailyProfit(美元)DailyLateWaitJobs1475.430.65002525.170.65003513.986.55004389.420.60005513.960.70006401.201.05007450.520.65008388.710.90009574.670.400010565.810.2500举例来说,我们对模型5-2进行n=10次独立重复仿真试验,可得到如表6-1所示的DailyProfit与DailyLateWaitJobs的性能指标。一定要记住表中的任何一个值都是基于一次完整仿真运行过程的结果,并且它们都只是在某一次具有特定开始和终止条件的随机重复仿真中,代表DailyProfit与DailyLateWaitJobs的随机变量的一个“观测值”(或者“实现值”)。我们能提前得知n=10是恰当的重复仿真次数吗?答案是否定的。而且如果我们不对这些数据进行分析,那么就仍然不能知道重复仿真多少次是恰当的,这是因为我们无法预先知道仿真结束后在输出报告中的输出变量变化范围是多少。下面将说明如何找到(或是猜测)一个合理的样本量。顺便说一下,为了统计分析而进行重复运行时,读者也许希望关掉动画,可以通过如下操作完成:选择RunRunControl并选择BatchRun(NoAnimation),从而消除动画。若想以后再恢复动画,只需再回去清除上述的选择即可。2实际上,每次重复仿真都是由同一随机数流推进的,在12章中将介绍随机数发生器如何工作以及如何控制它。4相信读者不希望将每次重复仿真的所有性能指标的观测值都先复制出来,再应用统计软件包、或是电子数据表格、或是计算器来进行分析。值得庆幸的是,Arena内部自动跟踪了输出报告中每一次重复仿真的记录。如果读者进行了多于一次的重复仿真,在Arena的分类汇总报告(CategoryOverviewreport)中将会给出各次重复仿真的输出结果的均值,并给出输出结果的置信度为95%的置信区间;这些内容将在第6.3节介绍。读者可以将每次重复仿真结果中感兴趣的部分保存到扩展名为“.dat”的二进制文件中(以后可以导入到Arena输出分析器中,6.4节中将谈到这一应用)。可在Statistic数据模块中定义输出文件的名字,这个文件就将记录表6-1中的数据。6.3终态仿真系统的置信区间正如在2.6.2节中的手工仿真那样(应用那里给出的公式),可以总结一下表6-1中重复仿真10次所得到的输出数据。在表6-2中给出了样本均值、样本标准差、95%置信区间半长、以及各次重复仿真输出结果的最小值和最大值。表6-2模型5-2的10次重复仿真输出结果统计分析DailyProfit(美元)DailyLateWaitJobs样本均值479.890.6400样本标准差70.170.051095%置信区间半长50.200.1616最小值388.710.2500最大值574.671.0500如果读者在RunSetupReplicationParameters中选择多于一次重复仿真的话,在Arena的分类汇总报告中会自动记录表6-2中的信息(样本标准差除外,但是在半长中已经包含了本质上相同的信息)。图6-1显示了模型5-2重复仿真10次后的分类汇总报告中的相关内容;除了微小的舍入误差外,这些数据与表6-1中手算的数值是吻合的。原书P260图6-1模型5-2重复仿真10次的结果需要提醒读者的是,当进行多次重复仿真后,关于分类汇总报告有几点需要注意。第一,5当进行不多于100次的重复仿真时,在“半长”(HalfWidth)栏显示的置信区间的半长值是精确的;否则这些项将比实际数据大,导致这样的结果是由于生成这项报告的CrystalReport软件所存在的一些局限。但是,在扩展名为“.out”的文件中的半长值是准确的,其它一些Arena内部处理过程以及一些应用分析工具(如输出分析器、过程分析器、与Arena配套的仿真优化软件)的数据都是准确的。第二,对某些在单次仿真中取整数值的仿真输出数据(例如对某种物体的计数),虽然其在多次仿真下的平均值未必是整数,但在报告中却会对它们舍入取整;但这样的问题也只出现在分类汇总报告中,而在“.out”文件或是其它内部处理及应用分析中都不会出现。(这些问题可通过下载一个补丁得以解决;详见附录E。)如果读者想要改变一些条件或是报告内容,比如定义非0.95的置信度,或是以某种组合形式输出结果,或者绘制置信区间、最小值、最大值的曲线图,就需要将数据保存在某一“.dat”文件中,并应用输出分析器来完成这样的工作(详见6.4节)。读者也可以使用过程分析器来得到置信区间的曲线图。显而易见,如果想要减少DailyProfit与DailyLateWaitJobs的期望值的置信区间半长,就要增加样本数量n。但是到底增加多少才合适呢?如果读者在心中已有一个希望半长大小的预期值,就可以很容易地算出大概多大的n可以达到这个目标(尽管这可能不是一个准确值)。假定读者根据初始的几次重复仿真得到了样本均值及标准差,以及一个半长相当大的置信区间。例如,从我们初始的10次重复仿真中得到的DailyProfit,可得出样本均值是479.89,样本标准差是70.17,以及0.95置信度的置信区间的半长是20.50$1017.70$262.22/1,1nstn它表示点估计值$479.89有一个10.5%的误差范围。如果读者想要得到一个特定的半长h(当然比初始重复仿真得到的半长要小一些),就可以应用上面的半长公式来求得相应的n的值:2222/1,1hstnn这里存在的困难是,公式右端项也依赖于n的取值(t分布的自由度与n有关,样本标准差s也与n有关,并且s不但依赖于n的值,而且依赖于n次重复仿真所得到的数据集)。然而,为了得到样本量的一个粗略估计值,读者可以将公式中的t分布用标准正态分布来替代(二者在n大于30的条件下是接近的),并且假定当前估计的标准差s与计算大样本时的值是相同的。这样就得到如下所示的近似求取一定置信度下特定半长h所要求的样本量n的公式:62222/1hszn上式中,s是根据初始重复仿真所得到初始数据计算出的标准差(这一数值需要提前计算出来)。另外一个更简单但是稍微不同的近似公式是(将代数证明留给读者来完成)2200hhnn上式中,n0表示初始重复仿真次数,h0表示初始数据求