|  | 
 
| 不可多得的好文章,为了方便大众学习,Jeff不辞辛劳把它翻译成了中文,英文见 * ~) I# \! {4 R0 jhttp://www.simulway.com/bbs/thread-13861-1-1.html3 |- H$ B& B; T6 {; i, H7 N
 
 . K3 x/ B& f' d仿真实践的ABCs
 8 z) G8 ]; E3 e! A: B1 C( l$ N- p7 m0 l. ]- N7 D
 从“Arrival”(到达)到 “Z-价值”,一个对于仿真问题如何应用知识和判断的过程中“关键元素”的ABC头字语的总结。+ ~6 g  m3 d# ]
 作者   Jerry BANKS ,RANDALL R.GIBSON
 3 H1 R9 B" r7 c, o4 s$ f$ `! N; v翻译   Jeffzz111/ Jeffvnlog (周峥)  上海交通大学物流工程专业硕士
 ' R: ]% I. ]8 m1 x# }! ?1 V0 ^/ o
 7 K! I6 {+ j3 i' R/ V译者语:仿真在国内还处于发展阶段,如何让业界、学术界来接收它,需要大家推广和实践,特花一个晚上的时间把仿真领域权威学者Jerry BANKS的多年实际经验总结翻译成中文,以飨读者。( e; S  C2 Y: j4 m
 你或许了解仿真的原理,但是并不知道如何用它来解决现实世界的问题。仿真实践活动需要培训,经验,和专业判断力。这是靠时间来积累的,就如同旧时候的学徒工,期间被培训者接触到大量的项目,涉及问题定义、直到写出最终的技术报告,当然这些任务是在有经验的仿真咨询师或从业者的监督下完成的。7 c" e7 s* B. G6 t& U7 F3 Q1 l
 在监督的期间内,被培训者观察现场的运作过程,对流程提出各种问题,学习公司如何来模拟类似的场景。并不存在适合于所有项目的一个步骤或者方法论。一个成功的仿真从业者大量的依靠经验来构建不同的方法来完成项目,挑战自己。
 $ A$ w( X0 J2 Y; U  x/ F
 ( U9 ^2 ~# R2 \/ t3 e% f/ t判断能力通过实践获得,观察什么是可行的,什么不可行,为什么不。或许这是成功仿真实践活动中最不为人所知的技能,但是确实最重要的。
 ' _% F0 e# x! Q. h3 c( M. O5 h  a! d3 y: z" I8 ^
 成功的仿真从业者在很多方面依赖经验和判断能力。例如,决定需要解决的实际问题,而不是症状所显露的表面问题。另外需要决定 校验和验证(V&V)是否已经足够,使我们可以接受仿真模型作为现实世界的替代.还有哪些数据是实验所必须的,哪些可忽略.诸如此类的判断是很多的,贯穿在解决问题过程中. ( a6 r& H( `" s& z2 x3 x
 在下面的文章里,我们总结了我们所认为的”仿真实践的ABC”,我们一个字母一个字母地总结了我们认为比较重要的应用知识和判断能力来解决仿真问题的一些“关键元素”的26个字母。我们并不说这是 “the 26”个元素(即比较权威的的,标准的说法),其他仿真分析人员可以有自己的一个说法,或者他们可以对于某个字母有若干个元素,而对于其他字母则没有。+ \7 X  v/ U, B" _$ Z
 文章中我们的评论并不一定可以在仿真教科书上找到。我们更加多的是揭示如何运用仿真来解决现实世界的实际问题。教科书的理解和实践的知识是成功运用仿真的二驾马车。如果你希望了解教科书的信息,请参考BANKS和LAW的相关书籍。7 A% d. q* V' A9 t0 Z
 0 L5 H3 z9 }# o0 f1 u: a4 y0 ]
 A :  到达(Arrival)或者实体到达:
 $ x6 [# @4 p- s% d; b. O“到达”的概念是离散系统仿真的驱动者。是非常适合开始就讨论的。既然“到达”是仿真的重要输入,那么确保它们正确是关键的。如果我们在“数据输入”方面没有很好地模仿现实,那么我们会引入错误。如果“到达”随着时间不同而变化,那么我们需要捕捉到这种现象。
 . v1 h' s. R6 H6 ^( a; T" L
 " Q& A' ~/ A) V0 n& u( j6 h/ D0 T! d, r: Z+ }$ |7 B3 J- j3 d
 6 ?1 W7 \8 i' o- T
 B :基准(BaseLine)9 i+ k% Q$ T# P
 如果我们要重新设计一个系统,那么我们首先要模仿旧的系统,即现状(as-is)或叫基准配置。如果我们对于基准配置的模仿很满意,我们修改模型来重新设计未来(to-be)的系统。对于基准状况的的模拟仿真对于我们理解系统的运作方式是很有帮助的。在某些情况下,当我们在模拟基准的系统配置时,可以获得现有系统的足够的理解,以至于不许要进一步建模我们就可以使系统大大地改善。
 4 A/ L6 L; }6 h" C: I" a6 F, u, B3 f, L$ A" \
 C :置信区间(Confidence Interval)
 * k8 }$ H0 \/ @9 H* O置信区间是统计输出分析方法的专业词汇。(我们假定你的模型有随机输入,会有随机输出)。在最基础的水平上,我们试着来预测一个单一系统设计的性能或者比较2个或以上的替代性的系统设计。接着我们区分“终态仿真”和“稳态仿真”,稳态仿真更加难于分析,因为需要设定初始条件和合理的运行时间。终态仿真可以理解为从0时刻开始到某个结束时间的仿真,我们运行很多次模型的副本,每一个运行都会有不同的结果,因为输入有随机性。通过使用统计的方法或者统计软件,我们可以找到自己想要的置信区间。一般是95%或者99%。
 8 b* G4 }: W# N" pD:数据(Data):
 5 i, R9 W! X# f' O5 B  j/ w5 ~数据采集是解决现实问题的一项最大的任务。(除了到达间隔时间外,还有服务时间,实效时间,修理时间,实体走某个路径的比例,行走速度,及其他很多数据。),它也是仿真过程中最重要的步骤之一。记得GIGO这个术语。同样适用于仿真的数据输入。(即:输入垃圾,则输出垃圾)即使模型的构架是有效的,如何输入数据采集的不够精确,或者分析的不当,那么输出结果会误导你,或者就是完全错误的,这样的决策是代价昂贵的,或者更糟。/ y0 }5 l4 W0 j
 0 R8 ]3 E( V) s% Y4 M( R
 E:试验(Experimentation):
 5 S+ s# J4 F9 v# v7 l我们强调仿真分析人员在试验中走极端。每个队列都要保证能有限的增长,但不是一直是空的队列。如果队列无限增长,那么仿真是不稳定的。一个空的队列可能意味着模型结构有错误,或者输入数据有错误。我们也建议通过试验,给仿真分析员带来一些系统的见解。必须对模型进行压力试验,就是说,让输入值增加,直到模型变的不稳定,以确保模型的结构是合理的。
 . ^/ P( w2 G3 c( `% t/ p# P  j
 F:可信度或者保真度(Fidelity):: K( `6 v' X6 W! q* ]
 可信度就是模型能够模仿现实系统的行为和运作过程的精确程度,(把可信度和我们的音响系统联系起来-如何高精度地重现录制的声音)对于模型的可信度的要求和我们通过模型所要解决的问题之间存在一个函数关系,和模型的细节程度以及输入数据的精度也有关。增加模型的可信度带来巨大的代价,大大增加建模和测试所花的精力。分析人员要判断需要什么样的可信度和数据精度。
 . k0 ^; R6 L! T0 B6 `4 J1 c# |0 o0 C  F# q" k" x
 G:图像(Graphics):% M! a$ [' r6 w/ r+ n  K1 v
 俗话说;一个图可以顶一千句话。但是,我们也说:一个好的分析可以顶一千张图画。我们警告大家不要被花哨的图像所动摇。图像的作用我们觉得是两面的,首先,动画图像帮助仿真分析人员发现模型错误,第二,图像可以作为推销方案的工具。不要通过所提供的动画图像来做决策,而要通过仿真的强大分析能力来解决问题。
 " g9 {2 o0 ?+ ~' D5 k  G( v* I4 O0 ]
 . i1 R  u5 y3 h) MH:直方图(Histogram):) x3 E2 ]! G) {
 简单的数据作图可以帮助理解仿真的系统。直方图就是一种简单的图像。它在水平轴上有区间,在Y轴上有发生的频率(概率)。这些可以用Excel表格画出来,除了直方图,简单图表还包括散点图,要因分析图,柏拉图,统计须盒图等等。这些很容易理解,我们极力推荐使用它们来解释输入数据和输出数据。  O$ Q/ t5 r' d) k' F
 3 _5 a& G/ d0 c/ y
 : @+ z8 ]) ?  T
 I:初始条件(Initial Condition):我们思考一次模型的运行,为了研究系统行为的稳定态,开始是闲置和空的,需要通过一段时间来达到稳定态,队列长度接近于长期的平均值.如果我们在0时刻开始我们的数据分析,在系统的表现上就会有初始的偏差影响.我们可以有几个选项..一、是以我们认为比较现实的被服务的实体数和在队列的实体数开始,我们可能要放一些处于故障中的机器。二、是把输出数据分成2部分,第1个是加温期,从时间0到时间t*,第2是从时间t*开始到结束时间点的稳态部分。第二个选项在仿真实践中比较常用。& Z4 l7 }# Y6 X! i
 
 f+ ?: C4 }0 X- U( j2 \J:Java语言
 4 u6 W3 ~$ Z4 Y4 G6 \3 e. L) b2 V7 i3 [; `' |
 多年以来,很多仿真模型都是用编程语言写成。开始是FORTRAN,然后C,C++,现在是Java。然而,通用的编程语言不提供仿真的支持功能,比如时间调度,系统时钟和时间推进算法。仿真产品也是用这些编程语言编写的,但他们支持这些功能。作为用Java编写的模型,有一个优点就是一个独立的仿真模型可以用在任何的Windows电脑上。* h1 c) j/ f  W+ R9 X& _
 : {  y2 C4 [- |7 h8 O
 K:知识(Knowledge)
 $ V% a2 m/ D6 {- a6 ]% O0 ]你必须了解你要模拟的系统。你要提出很多问题。记住,没有两个人会有同样的看法。搜集许多信息;比如,一些CAD图纸可以作为被模拟的系统的动画图像的基础。CAD图纸上的一些资源可以直接转化成模型中的资源,省去大量时间,提高精确度,改善动画。在搜集到这些知识后,准备在你模型中要用到的假设条件,并要得到客户的认可。
 $ p' I; K! C* i! @0 A( h) }  F  ^
 w# D  k' w: ?# o0 _6 v$ tL:线性(Linearity)7 Q3 a0 t  t4 o6 F1 v
 我们建议寻找“线性”关系,并找到线性消失的点。例如,自动引导小车AGV系统。很可能2个小车要比1个好,但是3个小车未必就比2个好,因为系统被小车阻塞了。同样地,快速的传送带达到某个点,使得“合并”成为不可能。所以,理解 线性是有界限的。" a' ~* n8 M' }5 a/ h
 ) V& s& w& t% q6 O( ?% U- {
 M:制造或者物料处理
 2 s. w: E5 }3 M/ N大量的仿真围绕这2个领域。在原材料到成品的过程中,80%的时间是在途或者等待运输,即在物料处理系统中。这是一个很大的资金投资,可以被用到其他产生利润的替代性资源上去。很多仿真项目是解决制造或者物料处理系统中的问题的。
 ; r  `" o8 Y  U9 x# Y* W; t- \- p- Z+ ~, y
 
 8 f; m1 n& J) d  E9 k6 ZN:模拟内在流程的规律
 + |! @. d* D3 t* O! _+ g: E分析人员要充分理解流程 ,这是非常关键的,为了正确地模拟在仿真中的数据。譬如,假如Poisson过程描述“到达过程”,那么到达间隔时间是指数分布的。另外,当没有数据的时候,理解内在流程可以获得输入分布的一些初始估计。7 d; w+ L6 ?# \( D
 
 9 Z, J& V- e" P) Q! w" a9 fO:面向对象(OO)
 9 q1 G/ _! j( u& c- W- ?大多数新的仿真产品采用面向对象的编程系统,或者自身就是面向对象的。人们可以修改预置的标准对象,来构造客户化的对象。软件的对象模仿现实世界中代表的对象行为。(比如,一个机器)。并且和其他对象通过“信息”来交互。面向对象的系统在模型里能更自然地表达现实系统,但是需要一套不同的方法来设计和开发,和传统的基于过程的语言或者仿真系统不一样。面向对象的仿真系统是未来的发展方向,需要分析人员熟悉这种设计和建模的新方法。
 0 r: {: t1 ~% y$ {' L7 m. D: X- X* m( w3 W4 K5 ~) {9 y
 P:编程(Programming)$ G- l8 u+ @, y- L
 对于模型的有效性和实用性方面贡献最大的那些重要元素,是反映商业决策规则、控制算法或者其他控制逻辑的细节程度、复杂程度。脱离软件内在的点击和拖拉的规则限制,通过编写客户化的逻辑更加逼近实际的系统逻辑,获得这样的灵活性给模拟现实系统提供强大动力。编程是设计、建立、测试定制化逻辑的过程,和实施的语言和方法无关。
 | 
 |