Skip to main content

模拟

Original Essay:https://staff.um.edu.mt/jskl1/simul.html

 

“所有的捷克人民都是模仿者”

 摘自《好兵帅克》,作者雅罗斯拉夫·哈谢克

 

何为模拟

持续模拟

分离模拟

面向对象模拟

线上模拟

参照


何为模拟

 

在最通用的层面上,模拟都应被视为认知的一种形式。(认知即为获取知识的行为或过程。)获得客观现实信息(知识)有三种基本方式:实验、分析和模拟。来举一个实际例子来说明这三种方式的性质:被研究的系统是一家只有一名服务人员的加油站。问题是“汽车在加油站加油平均花费的时间是多少”。为获得答案,有以下三种可能:

 

实验法:带上秒表,测出每辆汽车在加油站所花时间。清点汽车数量,将所有的时间相加后处以汽车数量。

 

分析法:使用排队论的公式直接计算系统中花费的平均时长。而使用公式则必须假设适用的排队模型,这也意味着实际系统得到了极大的简化,且需要一些定量参数(此处则是到达加油站的车流量 – 每时间单位中到达汽车的数量和服务强度 – 每时间单元中加油的汽车量)。

 

模拟法:编写一套模拟系统,生成随机到达的汽车和服务时长。该系统必须对所有活动进行适当排序,以与真实系统建立一对一的对应关系。且也必须对观察、统计数据收集和评估进行编程(计算每辆车话费的时间,收集此时间信息,清点汽车数量并在最后计算和展示平均值)。

 

上述三种方式无法排名因其各有利弊。仅在考虑各种标准的特定情况下才能进行比较。无论如何,下列一些基本事实显而易见:

 

实验法一直是最准确的方法,任何可行的情况下都应该采取这个方法。但不幸的是实验常常会有下列情况:

  • 过于危险(如核反应堆在危急情况下的表现,飞机在关闭其中一个引擎时降落等)
  • 过于昂贵(如所有可能造成破坏的情况,适用租用电话线路长时间研究数据网络的吞吐量等)
  • 若研究的系统暂时无法使用则实验完全无法开展(如在设计阶段评估更多可能的备选方案)

 

分析法(大多为数学分析)通常基于强有力的假设,而此类假设一般在现实生活中均不成立。分析法另一个可能的缺陷在于使用的设备过于复杂且/或计算过长。例如排队网络的分析。但另一方面,使用公式可以快速得出结论,并可以通过简单地向公式中代入不同的参数值来检查大量的备选方案。实验法大都非常耗时。另一个问题在于必要参数的可用性。用于将其准确测量的方法可能也无法实现,或无法在设计阶段获得。而使用预估数据或其他相似系统中的数据则会降低结果的可信度。

 

模拟法也是实验方法的一种。与其使用真正的系统进行实验,模拟则是使用仿真模型进行实验(因此仿真模型的设计是该研究的重点)。而此方法也有不少缺陷,以下为最重要的一些实例:

 

  • 创造仿真模型要求太高。一般语言(例如Pascal)编程仿真模型太困难。另也存有有效的仿真语言但其往往意味着最初极大的投入往往并不合理。还有其他的仿真模拟工具,其通常基于某些图形技术,可以简化或甚至自动创建某系特定的仿真模型。如果想了解此类工具的更多信息,可转至Petri Nets.
  • 对模拟系统的知识有限。首先必须了解一些定量参数。上述的例子中,有必要在到达时间和随机服务时间中生成随机的间隔。在这里相较于分析,模拟更加灵活 – 模拟语言支持生成几乎具有任何分布的随机数。在以上的事例中,两个随机数据都可以基于任何(如通过实验获得的)分布。尽管如此,任何分布都需要多个参数(若为理论参数)或为直接分布函数(若此分布由测量获得)。系统中(通常在设计阶段)也可能存在无法量化的数据,因此通常有必要接受这样的事实,即可能存在我们完全没有考虑到的方面。
  • 计算太过于耗时。例如分析具有多个并行工作组件的大型系统。原因在于正真的并行性应用系统仍未普遍,因此此类系统一般由单个处理器执行程序来模拟。并行的工作一次只能执行一次(尽管用户认为其应多个同时运行,且仿真模型的设计也认为其可“多个同时运行”)。而结果则是仿真模拟比实际可能慢很多(模型一秒钟则需要CPU运行十分钟)。这也导致实时控制中的仿真应用程序无法实现。

 

一般值得推荐的规则为:

“若实验法可行,则采用实验法。在考虑所有方面的情况下,实验法永远是做准确的方法。即使在设计阶段采用了其他方式,实验法仍可以作为最终评估系统的方法。若实验法不可行,则尽可能找到合适的分析法。若分析法也不可行,再选用模拟。”

尽管上述描述中将模拟法归为最后才用的方法,但也不尽如此。仿真模拟不仅仅可以通过为最初的问题提供答案,从而极大地帮助理解所分析的系统。很多时候,仿真模型的创建意味着很多特定事物第一次被代入考虑。模拟系统的规范能够(并在很多时候)可以揭示设计系统中的错误或歧义。因此,仿真模拟可以避免未来对现有系统进行非常昂贵的更新而起到很大的帮助作用。

 

返回标题

 


 

持续模拟

 

五十年代后期开发的连续模拟语言是模拟计算机的模拟器。对此的模拟则是基于创建电子系统的模拟,而后者的行为通常被同样的数学模型(微积分方程组)描述为被研究的系统。电子系统是通过将主要运行放大器(修改后用作积分器、加法器和其他功能单元)的标准块进行互连。之后用户通过应用合适的输入并记录特定输出点(示波器、绘图仪)的电压,使用该电子系统进行实验。变化的电压代表了一个时间函数,与描述物理性质可能完全不同(机械位移、温度等)的原始系统变化的函数相同。

 

模拟计算机的主要问题在于某些操作的模拟运用,例如乘法、某些函数的生成和延迟的生成等。数字计算机很容易执行所有的这些功能,而如今持续模拟仅在此类功能上执行。然后,模拟计算机在一项操作中表现很好 – 集成。与模拟积分器的积分相比,数字计算机使用的数值积分往往速度较慢且准确度较低。因此,一些基于快速相应的特殊应用使用所谓的混合计算机,其中包含了通过A/D和D/A转换器链接的模拟和数字部分。而数字部分则完成除集成以外的所有工作。其先计算出积分器的输入,然后由D/A转换器转换为输入模拟积分器的模拟信号。其输出则会以完全相仿的方式处理。数字部分还控制模拟部分的互连,因此在计算过程中有可能会发生变化。

 

持续模拟语言的分类

 

 

面向块的仿真语言基于模拟计算机的方法。系统必须以定于功能单元互连及其量化 参数的框图形式表达。“编程”意味着进入了块之间的互连及其描述。之后用户便可添加控制模拟的语句和/或指令。如果系统被描述为一组方程式,则必须将其转换为框图。此类型的转换是一种简单且直接的过程。大多数面向连续块的语言中可用的典型块为积分器、限制器、延迟、乘法器、滞后、常数值、加法器、保持器、增益(系数)和其他。

 

面向表达式的连续语言则是基于代表数学模型的书写表达式(方程式)。因此所模拟的系统必须由一系列的方程式来表示。之后用户便可添加控制模拟的语句和/或指令。一些语言上述二者均能支持。模拟往往意味着在下列选项中做出选择:集成方法(因为有些语言可以提供更多),集成步骤,应观察的变量(块的输出),收集用于打印和/或绘图的数据间的间隔,输出的缩放(也可自动完成),模拟运行的持续时间,重复次数以及其中某些值的更改方式等。

 

可下载models1.zip 文件,其中包含了多个使用Turbo Pascal语言编写的连续仿真模型。该模型使用基于面向表达的方法在简单连续环境中创建,可以轻松修改以模拟微分方程描述的任何其他系统。

 

返回标题

 

 


 

分离模拟

 

分离模拟处理的系统,其动态(由于抽象级别)可视为是离散时间点的一系列事件。其关键点在于控制模型中活动的正确排序方式。这也是用户在使用语言是“看世界”的方式,同样也是离散模拟语言分类的依据。

 

分离模拟语言的分类

 

面向流程图的语言以GPSS(即通用仿真系统)语言为代表,其在各种计算机上均有许多不同的版本。用户必须通过框图将系统的动态是为所谓的交易流。交易生成后即可通过区块网络路径,并在推出时销毁。其中,交易可能会被延迟、处理并传递给其他区块。区块在程序中由执行模型活动的语句表示。

 

面向活动的语言并不基于对未来活动的明确时间安排。对于每个活动,用于均可对其发生的条件进行描述(如果条件达到特定时间,则也包含时间安排)。模拟控制的算法反复递增时间并测试所有活动的条件。这种方法的缺陷非常明显 – 需要在每一步中评估所有的条件,此举非常耗时。另一方面,其概念则非常简单,算法可以轻松用通用的高级语言中实现(现存有基于使用此方法的模拟语言,但未广泛使用)。可下载models2.zip 文件,其中包含了一个简单排队系统(于Turbo Pascal中)的两个模型,其清楚演示了面向活动的方法。此类模型通常伴随着几个单元,而该单元会在双向链表上实现操作,链表则会在之后用于实现堆栈和队列。

 

 

面向事件的语言则基于对未来事件的直接调度和取消。此方法使用非常广泛。用户必须将模拟的系统动态视为一系列相对独立的事件。每个事件都可以调度和/或取消另一个事件。系统例程必须记录所有调度的事件。这也就是为什么每个事件都由所谓的事件通知来表示,其中包含了时间、事件类型和其他用户数据。事件通知都保存在俗称的日历中,其中所有事件通知都会按预定的时间安排。在一个事件例程完成后,系统将从日历中删除时间最短的事件通知,并根据时间更新模型时间,最后启动相应的历程。这一系列的操作会不断重复,直至日历全部清空或程序因其他原因停止运行。安排调度则意味着在预定的时间内将时间通知插入日历,取消则意味着删除。基于事件表达的方法统称为离散事件模拟,有时也会直接规划为离散模拟本身。这组语言的典型代表是SIMSCRIPT 语言(但其II.5版本也支持面向过程的模拟)。

 

 

面向过程的模拟基于以下事实:事件并非独立存在。事件往往是前序事件的结果。换句话说,通常可以定义事件的序列,而此序列则可被视为更高层级的仿真模拟试题。这一系列的事件则称之为过程。但与时间过程具有时间维度不同。基于抽象系统的过程十分接近现实,因其总是由同时存在且相互作用的各种对象组成。这也就是为什么,查看动态系统的过程方式非常自然。大多数情况下,过程模拟真实对象的活动。大众相信:面向过程的离散仿真是创建其最佳的方式。这种语言的典型代表有MODSIM、SIMSCRIPT II.5 和Simula 语言中的系统类别SIMULATION。

 

返回标题

 

 

 


 

面向对象模拟

 

面向对象模拟(以下简称OOS)可被认为是面向对象编程(以下简称OOP)的一个特例。OOP中的一些原则,例如不同数量的干扰对象实例,长期以来一直在模拟环境中标准使用,且通常使用其他术语。模拟语言(曾被称为Simula 67)则是首个对象导向语言。自出现至今30年有余,其仍包含了OOP的绝大多数(且最为重要)的机制和原则。在几年前OOP热潮重新发现以前,一些类似分类、继承、虚拟方法等已经在Simula中定义了很长一段时间。学习更多相关知识,请访问ASU(Simula用户协会)页面。也可以浏览Introduction to OOP in Simula ,该文档在Simula 三十周年之际在马耳他大学的演讲中发表。MODSIM是另一种面向对象的仿真语言。

 

OOS广为接受的特点有:

 

  1. 算法或动力系统以并行存在且相互作用的对象来表达。每个对象都表示为:

- 参数(在对象生成时可以分配的实际值)

- 属性(也称为内部属性或值属性)

- 方法(也称为实际行动或过程属性)

- 生命,代表对象创建后开始的行为。

对象可以以下列方式进行相互作用:

- 直接获取参数或属性

- 方法的相互调用

- 对象生命的交流与同步

简单来说:对象 = 数据 + 称之为封装的程序。通常对象的数据或其中一部分时隐藏的,且只能通过(明确定义的)方法才能获取和修改。这样的概念称之为信息隐藏

 

  1. 相似的对象(参与者)被分组到所谓的“类别”(也称为“原型”)中。同一类别中的对象具有相同的参数、属性、方法和生命。类别定义也被解释为模式。可以创建任意数量的单个对象(参与者),即对象实例。此类实例可能因其参数和/或属性值的不同而有区别。因此有必要明确区分此类类别和使用类别定义生成的实例。类别也可以解释为关于某种特定对象的知识。此类知识由数据部分,及利用数据执行的操作表示。与抽象数据类型类似,但类别多得多。在这里,抽象数据类型也被认为是不使用派生类别的退化版本。

 

  1. 对象可以通过所谓的继承派生按层次分类。经常会引入术语“子类”对此进行描述。X类别下的Y子类会继承X类别下的所有参数、属性和方法。其定义中可以加入任何额外的参数、属性和方法。子类也可以为母类的生命中加入一些活动。前者也可以作为其他子类的母类。一些OOP语言(非Simula)允许所谓的多重继承派生。这种情况下,子类可以从超过一种母类中继承派生。子类可以定义为比母类描述更丰富的知识。因此母类可以代表一般通用的知识,而子类则是通过任何步骤对此进行的进一步细化。继承派生以特定方式对抗Pascal等强类型语言。

 

一般情况下可以声明引用变量,该变量可以引用某特定类别及其所有子类的实例。特定方法因当前引用对象实例以不同的方式运行,且可能在程序执行期间动态变更。称为后期绑定的机制则支持了这个称谓多态性的概念,所涉及的方法称之为虚拟方法,可能在层次结构的每个级别都发生变化。

 

  1. 对象实例的并行存在需要能够支持其生命周期协作与同步的设施。对象的生命周期不一定具有时间维度,只有在 OOS中才是必须存在。此类Simula对象本身就可以在没有时间概念的情况下进行交互。Simula系统中的SIMULATION类别则定义了生命存在于实践中的类别,即“过程”。对此,也有相关设施支持过程的通信和生活同步。

 

返回标题

 


 

 线上模拟

 

互联网、Jave和JaveScript为解决问题带来了很多难以置信的可能性。无需耗时的下载以及安装软件包,直接打开各种问题解决器成了现实,尤其是针对不常见的问题和无需太多计算的问题。作为我在此方向上迈出的第一步,我使用JaveScript编写了简单的仿真模型,解决并模拟了单队列系统和排队网络。可前往线上解决方法&模拟器页面立即尝试。

 

返回标题

 

 


 

参考

 

本页面包含自下述作品的摘录:

Sklenar, J.: 《仿真模拟》(马耳他大学,2000年出版)在马耳他大学教授的几门运筹学相关课程中使用。

因搜索引擎会弹出许多关于“仿真模拟”的条目,因此也可以在网络上找到许多信息。可以从下列包含其他链接、参考、机构信息或会议等处开始学习。

 

返回标题