挑战
作者:Stephen D. Roberts(北卡罗来纳州立大学)和 Dennis Pegden(Simio LLC)
在 2017 年冬季模拟大会上发表
在过去的半个世纪里,仿真作为操作系统分析的首选工具取得了长足的进步。技术的进步催生了新产品和新环境,但却没有软件标准或方法上的共性。每种新的仿真语言或产品都有自己独特的特点和功能。然而,这些仿真产品是研究、开发和应用的演变。在本文中,我们将解读仿真建模的历史发展。我们认为,仿真建模是仿真问题解决过程中侧重于模型开发的部分。它是用一种能够对真实世界过程进行仿真的仿真语言来解释真实的生产(或服务)问题。虽然 "解释 "是在 "观察者"(即我们)的眼中,但有一些历史观点和方法会影响仿真模型的设计。
导言
模型与建模
经过几十年的研究,人们已经建立了正式的运营数学和统计模型。然而,当一个模型的应用超出其假设范围时,它的适用性就成了问题,建模者就面临着调整模型或开发新模型的问题。调整或创建新的分析模型是一项艰巨的任务,对建模者的分析能力提出了挑战,可能需要花费更多的时间和精力,而且可能没有实际效果。
模型的价值在于使用。由于单个模型有其局限性,模型的扩展可能令人望而生畏,因此一些研究人员和从业人员更喜欢更灵活的建模环境。长期以来,模拟一直被视为一种建模工具,它具有非常广阔的开发环境,在开发和使用模型时不需要数学或统计方面的复杂性。此外,为了减轻开发仿真模型的负担,人们还开发了多种仿真语言。每种仿真语言都有自己的建模结构,可以在其中构建、仿真和分析仿真模型。随着时间的推移,这些语言也在不断变化,但建模方法与其仿真执行视角密不可分。
建模
本文的目的是介绍仿真建模的个性化(因此也是有限的)历史,因为仿真建模在很大程度上是通过冬季仿真大会普及开来的。在解决问题的过程中使用仿真建模需要掌握几项技能:
- 正确定义问题并设定对象。
- 使用建模概念将系统的基本特征抽象为模型。
- 为模型收集和汇编数据和输入。
- 将模型转换成能够模拟系统的计算机可读代码。
- 指导计算机在各种情况下正确有效地进行模拟。
- 将模拟输出总结分析为性能指标。
Kiviat (1967) 是最早描述建模过程和所需技能的人之一。对几乎所有通用编程语言有深入了解的用户都能掌握其中的大部分技能。然而,实现最终模拟的负担是非常艰巨的,因为程序员需要提供软件来完成所有需要的组件,包括随机数生成、随机变量生成、状态更新和时间提前、统计数据收集和显示等。要在一个模型上完成所有这些工作,一般来说难度很大,而仿真语言和仿真库可以减轻创建仿真的负担。
虽然仿真语言层出不穷,但基本的仿真方法却大同小异。仿真语言执行系统模型,随着时间的推移动态演算出系统的行为。这是通过在模拟时间内改变状态变量的值来实现的。仿真语言一般可分为两大类:离散型和连续型。离散型工具对系统进行建模,系统的状态在特定事件时间内以离散的单位发生变化。连续工具对系统进行建模,系统状态在部分时间内连续变化。这里的重点是离散系统,但也考虑连续系统。如今,大多数仿真语言都是多模式的,支持多种建模范式,通常将离散和连续功能混合在一起。
解决方案
建模世界观
离散仿真由一组状态变量和在事件发生时改变这些变量的机制组成。仿真建模世界观为实践者提供了一个框架,以足够详细的方式定义系统,从而实现仿真系统行为的目标。与简单的静态描述工具(如流程图(https://en.wikipedia.org/wiki/Flowchart)、Visio(https://en.wikipedia.org/wiki/Microsoft_Visio)、IDEF(https://en.wikipedia.org/wiki/IDEF)、UML(https://en.wikipedia.org/wiki/Unified_Modeling_Language)等)不同,仿真建模世界观必须精确考虑随时间发生的动态状态转换。世界观为推进时间和改变模型的离散状态(或连续状态)提供了一套明确的规则。
在模拟的 60 年历史中,我们判断有四种不同的世界观在使用中占主导地位:事件、活动、过程和对象(尽管也有其他术语和分类法)(见 Overstreet 和 Nance,1986 年)。这些观点都是由 20 世纪 60 年代的模拟先驱们提出的(Gordon 1961;Markowitz 等人 1962;Tocher 1963;Dahl 和 Nygaard 1966),尽管这些世界观在过去 50 年中得到了极大的改进,但基本思想并没有改变。建模工具的发展侧重于实现易用性和灵活性之间的平衡。事件世界观提供了最大的灵活性,但却更难使用。基于活动的世界观为活动提供了更多的上下文,但在建模方面有一些限制。流程视图更易于使用,但代价是建模灵活性降低。对象视图是所有视图中最简单、最自然的,但也要付出建模复杂度增加的代价。仿真语言发展的历史一般都集中在使过程视图和对象视图更加灵活,同时保留其易用性的优势。同时,大多数现代仿真语言都融合了它们的执行方法(使用事件处理来处理未来事件和扫描当前事件),并采用了多模式表示法(如网络、过程、动态),因此它们并不能简单地归入一个简单的分类法。
用事件建模
事件是系统状态发生变化的连续时间点。建模者有责任确保事件被识别并发生状态变化。确定事件是建模者的选择,但并不总是显而易见的。这种选择部分取决于系统的行为,部分取决于仿真所需的性能指标的性质。确定事件只是挑战的一部分。一旦事件发生,就必须映射从当前状态到后续状态的过渡。此外,还必须有某种方法来连续维护和添加事件。还必须收集和显示适当的输出。
事件建模的核心是未来事件日历(其实际数据结构不断演变,可能各不相同)的作用,该日历可维护所有未来事件。离散事件仿真语言通常通过以下方式工作:(1) 在事件日历中移除下一个事件,并将仿真时间更新为该事件时间;(2) 然后执行与该事件相关的状态更新程序。
事件逻辑可以用任何通用编程语言实现,如 Fortran、C++、C# 等。不过,由于随机变量生成和事件调度等许多仿真功能在大多数仿真中都是通用的,因此在编程语言中使用此类功能库可以极大地方便仿真程序的开发。使用 GASP 增强 Fortran(Pritsker 和 Kiviat,1969 年)和 CSIM 的 C 语言编程(Schwetman,1986 年)就是一例。另一方面,SIMSCRIPT II.5(Russell,1983 年)提供了自己的编程语言来扩充其仿真库。它还增加了定义实体、为实体分配属性以及将实体收集到集合中的基本功能。
事件世界观工具在仿真技术发展的前 20 年得到了广泛应用。这些工具受到许多人的青睐,因为它们非常灵活,可用于对各种复杂系统进行高效建模。需要注意的是,在这一时期,效率更为重要,因为计算机内存较小,速度明显较慢。然而,基于事件的模型往往难以理解和调试,而且需要熟练的编程技巧,这限制了它们的普遍使用。
可能是由于其通用性,目前还没有被广泛接受的事件建模工具。建模者通常使用流程图和非正式图纸。有些人主张使用 Petri 网(Haas,2002 年)和信号流程图。事件图是离散事件可视化建模的一种通用方法,由 Schruben(Schruben,1983 年)提出。虽然事件图是理解离散事件仿真的重要工具,但它作为一般建模工具的用途非常有限,需要对其进行一些扩展和完善才能普遍使用。
用活动建模:三阶段方法
以事件为重点的建模在北美地区的仿真模型开发中占据主导地位,而英国的 K. D. Tocher 则提出了一种略有不同的离散建模方法,即三阶段方法(见 Hollocks,2008 年)。皮德(Pidd,2004 年)介绍了一种名为活动扫描的相关方法。活动(由事件引发的操作)是事件发生时状态变化的基础。这种三阶段方法不断演变,但基本包括:(1) 将时间提前到下一个事件(称为下一个(与时间相关的)绑定事件);(2) 处理一个或多个下一个绑定事件;(3) 处理以绑定事件发生为条件的所有其他操作。在需要未来事件日历的同时,也需要绑定事件和条件事件列表。这些后置条件(取决于状态)事件列表会被重新扫描,直到没有活动可以启动为止。
三阶段方法的核心是使用一种现在称为 "活动周期图"(最初称为 "轮形图")的概念建模工具。要确定任何系统中的活动,首先要确定参与活动的实体类型。例如,这些实体可能是工作和操作员。作业到达后等待机器,然后离开。操作员安装机器,然后操作机器。否则,当没有作业需要加工时,操作员就会处于闲置状态。加工、设置和到达是受约束的活动,而等待和闲置是有条件的,取决于受约束的操作。这里使用活动循环图来确定三阶段模拟的要素。
流程建模
过程建模主要以 GPSS(Gordon,1961 年)的形式出现,与事件和活动建模的发展并行。GPSS 由 IBM 公司开发,既是一种建模工具,也是一种仿真语言。它将世界视为实体(称为 "事务"),这些实体在由特殊用途块组成的模型中移动。每个模块都有一定的功能。模块图和仿真代码之间几乎是一一对应的。因此,仿真模型既有视觉解释,也有书面解释。这种对应关系非常重要,因为 GPSS 建模人员基本上可以将可视化模型几乎直接转化为 "语句 "模型,视觉语义代替语言语法成为建模的主要手段。这种方法意味着仿真建模者不需要是程序员,因此 GPSS 吸引了大量原本不会参与仿真的人尝试仿真。1974 年,密歇根大学的 Tomas J. Schriber 出版了经典著作《使用 GPSS 的仿真》(Schriber 1974),进一步激发了人们对 GPSS 的兴趣。这本书是最早提出仿真建模应以结构化方式进行的书籍之一。
虽然 GPSS 被广泛认为易学易用,但人们对其执行效率提出了许多质疑。在 GPSS 中,仿真执行两个列表:未来事件日历和当前事件日历。当实体生成时,它们尽可能地在框图中前进。如果它们遇到一个可以安排在稍后时间离开的区块,该实体就会被放在未来事件日历上。但是,如果实体无法继续(可能资源不可用),那么实体就会被放在当前事件日历上。对当前事件日历进行扫描和重新扫描,直到没有进一步的行动(有点像活动扫描),然后从事件日历中删除下一个事件,并将时间提前。对当前事件日历的扫描以及其他一些问题是 1983 年 GPSS 大幅改进版本 GPSS/H(Henriksen 和 Crain,1983 年)的基础,GPSS/H 能够将执行时间缩短四倍或更多,其中包括 GPSS/H 是编译版本,而 IBM 版本是解释版本。
受 GPSS 块建模被广泛接受的启发,一系列新的(20 世纪 70 年代末、80 年代初)基于块(节点)网络的流程语言应运而生。其中包括 QGERT(Pritsker,1979 年)和 SLAM(Pegden 和 Pritsker,1979 年)。20 世纪 80 年代初,个人电脑出现,SIMAN(Pegden,1982 年)是在这一平台上执行的早期仿真语言之一。SIMAN 也采用了风格化块来创建实体模型,这些实体流经由各个处理位置组成的网络。
流程建模语言一般采用未来事件日历和当前事件日历。但是,为了减少对当前事件日历的扫描,增加了使用真实时钟时间代替整数时钟时间的效率,并取消了对状态不会改变的实体和当前事件的扫描(如排在其他人后面)。20 世纪 80 年代的其他改进还包括随机数和随机变量生成的改进、方差的减少、高效的日历管理以及更高效的统计数据收集。由于仿真语言与开发和维护仿真语言的商业机构之间的关系越来越密切,并将其内部操作视为知识产权,因此很少有建模人员了解这些改进。仿真语言与商业机构的一对一关系一直延续至今。
流程导向的一个重要优势是流程模型是以流程图的形式定义的(见 Fishman 1973)。因此,用户不必是程序员也能创建系统模型。流程模型与事件方法相比,模型逻辑的定义和理解/学习要简单得多,而且几乎不需要编程技能。然而,流程模拟语言有其固有的局限性,因为并非每种情况都有相应的语言块。例如,在急诊室中,病人可以被看作是在操作区块中移动的实体,但也有一些资源在移动,而这些资源并不能很好地用实体建模。最终,流程建模人员会在表示方面 "碰壁",要么必须在当前语言中找到一些不太容易接受的表示方法,要么找到其他方法来增加所需的功能(通常是通过编程)。
流程建模在概念上的另一个进步是引入了分层建模工具,它支持特定领域流程库的概念。其基本概念是允许用户通过组合现有的流程步骤和模块来定义自己的流程步骤和模块。广泛使用的 Arena 建模系统(https://www.arenasimulation.com/) 就是这种功能的一个很好的例子。1992 年,Cota 和 Sargent(Cota 和 Sargent,1992 年)增加了流程的模块化和封装功能,随后产生了分层控制流图(Hierarchical Control Flow Graphs),提供了仿真模型的图形表示(和计算)功能(Sargent,1997 年)。SLX(Henriksen,1995 年)是最近在面向对象框架内开发的面向过程语言的一个例子。
面向对象建模
流程建模的另一种观点认为,模型是一组相互作用的流程或更一般的对象。20 世纪 60 年代开发的 Simula(Dahl 和 Nygaard,1966 年)提供了一种早期的实现方法,提倡将对象作为仿真元素的思想,这些对象可以包括控制该对象的逻辑描述的动作,并且可以与其他对象同步或异步交互(有些思想是从人工智能语言 List 2 发展而来的)(见 Nygaard 和 Dahl,1981 年)。尽管在 20 世纪 60 年代初,List 2 作为一种仿真语言被开发出来,但它在北美很少得到认可,在美国也没有广泛传播。它之所以曝光率有限,部分原因是它是一种基于 Algol 的仿真编程语言,因此除了提供一些非常独特的仿真概念外,还需要一些独特的(对美国而言)软件/硬件。事后看来,Simula 的价值是对仿真技术的重大贡献,但它首先在编程界得到了更广泛的认可。随着面向对象仿真的发展,Simula 作为当前许多仿真语言的先驱被重新发现。
面向对象仿真建模通常分为两大阵营。第一个阵营以 Simula 为代表,认为仿真语言应包含面向对象的概念,允许建模者开发复杂的仿真程序。在这种方法中,抽象数据类型、继承、多态性、组合、参数化类型等概念都是相关的,因为它们允许广泛的对象和行为。这些模型紧凑、高效、可扩展。换句话说,它们是模拟编程的更好环境。如今,模型通常是在仿真软件包的背景下用 C++ 或 Java 构建的。
Simula 引入的思想为仿真语言设计者最近取得的一些进步奠定了基础,使面向对象的建模方法既易于使用又灵活多变。虽然这些思想是作为仿真建模概念引入的,但它们已经彻底改变了编程工具的设计和实现。Simula 的思想直接影响了后来的许多编程语言,包括 Smalltalk、LISP、C++、Java 和 C#。Simula 引入的面向对象思想不仅是仿真软件领域最重要的发展,或许也是过去 50 年计算机科学领域最伟大的进步。
除了将仿真作为编程挑战之外,另一个面向对象的仿真建模阵营认为面向对象的仿真是由大量预定义的对象组成的,每个对象都有一套被认为与控制和使用对象相关的行为。这种建模方向提供了一种更自然的建模范式,在许多情况下更易于使用,从而简化了模型构建过程。在基于对象的建模方法中,我们通过在模型中放置软件对象来创建模型,这些对象代表了系统的物理组件,如医生、机器操作员、叉车、传送带等。这些对象可以通过指定服务时间、行驶速度等属性值进行定制。例如,我们通过放置和描述组成工厂的工人、机器、传送带、机器人和其他对象的属性来建立工厂模型。在流程导向下,建模者要描述实体在流程中移动时在系统中发生的动作。需要注意的是,流程步骤由动词(抓取、延迟、释放)来描述,而对象则由名词(机器、机器人、工人)来描述。在面向对象中,建模者只需描述系统中的物理组件,以及这些对象的行为和动作,这些行为和动作已经内置于对象中。因此,工人对象具有预定义的行为,可以与模型中的机器和其他工人进行交互。
很难想象有什么比使用预先构建的建模组件集合来模拟真实系统中的组件更自然的方法来构建模型。这种方法面临的挑战是,如果我们想对真实世界中的任何事物进行建模,我们就需要一个庞大的对象库,以便能够捕捉到可能遇到的多种多样的真实对象。例如,仅有一个名为机器人的对象是不够的,因为现实世界中有许多不同类型的机器人。仿真语言开发人员希望基于对象方法创建实用的仿真工具,这说明了在同一仿真建模工具中同时具备灵活性和易用性所面临的挑战。尽管过程导向所提供的灵活性使其仍然是一种广泛使用的仿真建模方法,但在过去 20 年中,基于对象导向的成功仿真产品也越来越多。正如第二个 20 年从事件导向到过程导向的转变一样,过去 20 年也见证了从过程导向到面向对象的转变。较新的面向对象工具拥有丰富的对象库,主要集中在制造、供应链和医疗保健等特定应用领域。其中一些工具还允许用户针对特定应用领域创建和定制自己的对象库。能够创建自定义对象这一正式概念的基本思想是由奥斯陆挪威计算中心的 OleJohan Dahl 和 Kristen Nygaard 于 20 世纪 60 年代在 Simula 和 Simula 67(Dahl 等人,1967 年)中提出的。Simula 引入了行为类(如服务器、工人、机器人)及其实例(对象,如 Fred 和 Drill)的概念,作为显式建模范例的一部分。建模者可以创建一个对象类(如汽车),然后将该类的多个实例放入模型中,并通过设置属性值自定义每个实例的行为。他们还引入了子类对象的概念。这个强大的概念允许用户通过继承、覆盖和扩展对象类的行为,从现有的对象类中创建一个新的对象类。例如,通过重新定义一些行为并添加一些新行为,可以从名为 "汽车 "的对象类中创建一个名为 "卡车 "的新对象类。从具有某些所需行为的现有对象类开始,创建一个新对象类的能力大大简化了对象库的开发。
仿真语言设计方面的许多创新工作都发生在面向对象的仿真工具中。这些工具在保持易用性优势的同时,也变得越来越灵活,从而取代了面向过程的工具。这些工具在动画方面也具有重要优势。在面向事件和面向过程的情况下,添加动画是一个分两步走的过程,用户首先要建立逻辑模型,然后作为一个单独的步骤创建动画,最后再将这两个部分联系在一起。在对象导向中,预定义的对象不仅包含相关的属性、状态和行为,还包含相关的三维动画。这样,用户就可以在一个步骤中快速建立模型逻辑和动画。
系统动态建模
系统动力学是由 Jay Forrester(Forrester,1961 年)于 20 世纪 50 年代末在麻省理工学院开发的一种建模方法。它是一种连续模拟形式,其中的变量可随时间连续变化。有时,系统动力学被用于近似大规模离散系统(如人口建模)。系统动力学的一般形式是将一组状态变量与一组微分方程动态地联系起来。然而,在大多数应用中,模型由 "水平 "和 "速率 "组成,其中水平是简单的状态变量,速率是一阶微分方程(Sterman,2000 年)。只需采用这种简单的形式,就可以对各种动态系统问题进行建模。系统动态通常以因果循环图和存量与流量图来描述。
因果循环图是显示系统结构和行为的直观手段。然而,更详细的模型是存量和流量表示法。存量可以表示为填充和清空的水箱,用于测量状态变量的水平,例如急诊室的病人数量或感染某种疾病的人数。流量可以表示为一个阀门,用于控制存量的变化率。在这个例子中,急诊室病人的流量可能受保险范围的控制。随着投保人数的增加,急诊室的就诊率也会下降。但所有这一切都可能被成本所缓解,因为成本增加了未投保人数,这反过来又增加了急诊室的使用率。
Forrester 于 1961 年出版了该领域的第一本经典著作《工业动力学》(Forrester,1961 年)。最著名的系统动力学模型之一是世界人口增长模型,该模型在 1972 年的畅销书《增长的极限》(Meadows et al.)该模型预测,在资源有限的情况下,人口和资本将呈指数增长,并在各种情况下导致经济崩溃。最初的模型有五个层次,分别衡量世界人口、工业化、污染、粮食生产和资源枯竭。
尽管任何连续模拟工具都可以用来模拟系统动力学模型,但人们还是开发出了一些特定的建模工具。例如(见https://en.wikipedia.org/wiki/Comparison_of_system_dynamics_software)。最初,系统动力学的主要仿真语言是 Dynamo(现已废弃),但现在 Stella(https://www.iseesystems.com/store/products/stella-architect.aspx) 和 Vensim(http://vensim.com/) 等语言在系统动力学界很流行。其他仿真语言如 PowerSim(http://www.powersim.com/) 和 AnyLogic(http://anylogic.com/) 也有系统动力学组件,但现在还提供与事件和过程元素的其他组合。另外,尽管系统动力学模型是以连续系统的形式表达的,但大多数应用都涉及对具有许多实体的大规模离散系统建模。对于大规模离散系统,代理建模是系统动力学的一个替代方案。
基于代理的建模
基于代理的建模(ABM)将对象的概念扩展为 "代理",其属性与人类行为密切相关,尽管对代理的定义尚未达成普遍一致。这种将代理视为人的倾向意味着代理需要具有智能、自主的特征和独立决策的能力。虽然代理可能是独立的,但它们处于由其他代理组成的环境中,因此,个人决策以及与其他代理的互动都有规则可循。一般来说,人工智能模型倾向于应用于反映社会行为的社会问题,如蜂拥、成群、跟随等。人工智能管理的一些要素还包括系统动力学。
基于代理建模的基本概念(见 North 和 Macal,2007 年)是,通过在系统中放置代理,让系统从这些代理的互动中演化出来,从而对系统进行建模。每个代理都是与系统中其他实体交互的自主实体。重点在于对代理行为建模,而不是对系统行为建模。在传统的流程导向中,实体遵循一系列流程步骤,这些步骤是从自上而下的系统角度定义的。相比之下,基于代理的建模是从自下而上的角度定义每个实体的本地行为规则(通常比较简单)。系统行为是代理相互影响的累积结果。应用实例包括在某一区域移动的人群、对新产品介绍做出反应的客户或作战中的部队。
代理的状态转换框架可以使用任何世界观进行建模。基于代理的建模通常使用面向对象的仿真工具来实现。因此,这并不是一种新的离散事件世界观,而是一组通常使用对象世界观建模的应用。类用于定义代理状态和行为,实例(通常是大量实例)被放置在模型中。代理(对象)相互作用,系统状态随时间不断变化。基于代理建模的某些应用领域面临着一些独特的挑战,尤其是涉及到大量代理时(例如,模拟球迷从体育场撤离)。
对于基于代理建模的简单应用来说,具有继承和子类化功能的完整面向对象框架有时会显得力不从心,而简单的状态图可能就足以定义每个代理的类行为。状态图的概念是由香农和韦弗(Shannon and Weaver,1949 年)在 1949 年出版的《通信数学理论》一书中提出的。状态图定义了代理可能处于的有限状态集,以及导致一对状态之间转换的过渡条件。每个图通常定义了给定类对象的行为,以及该类对象实例的状态转换。尽管目前使用的状态图有几种不同的变体,但它们都将状态定义为节点,并将状态之间的转换定义为弧。例如,代理的状态图可以显示如何处理受感染的群体,以及状态如何随时间发生变化。
由于计算机管理大量代理的能力不断提高,以前使用系统动力学方法离散近似建立的一些模型,现在使用基于代理的建模方法可以更好地完成。这种方法允许逻辑具有更大的灵活性,但执行时间较长。早期的基于代理的模型之一是约翰-康威(John Conway)在 20 世纪 70 年代开发的生命游戏(Conway 1970)。生命游戏是一个涉及细胞生长的二维模型,以固定的时间步长进行演化,每个细胞都有两种状态,即存活和死亡。一个细胞的状态取决于上一个时间步的邻近细胞的状态。康威的游戏展示了从简单规则中产生复杂性的基本概念。
20 世纪 90 年代,随着各种基于代理的工具,特别是 Swarm(https://en.wikipedia.org/wiki/Swarm_(app))、NetLogo(https://ccl.northwestern.edu/netlogo/)、Recursive Porous Agent Simulation Toolkit (Repast)(http://repast.sourceforge.net/repast_3/) 和 AnyLogic (http://anylogic.com/)的出现,人们对基于代理的建模的兴趣持续增长并不断丰富。
个人建模经验
我们在仿真建模和仿真语言方面的经验从 20 世纪 70 年代末一直延续至今。虽然建模方法各不相同,而且从前面讨论的观点中延伸出来,但它们仍然以事件和过程技术为基础,并对面向对象方法和多范式视角产生了新的兴趣。我们将从历史角度对这些方法提出看法。
SLAM 的开发源于 C. Dennis Pegden 于 1978 年春季在亨茨维尔阿拉巴马大学(UAH)教授的一门模拟课程。虽然佩格登最近在普渡大学攻读研究生期间完成了 A. Alan B. Pritsker 的仿真课程,但他的博士学位和研究重点是数学优化,因此在 UAH 教授这门研究生仿真课程对佩格登来说既是一次挑战,也是一次学习经历。班上有十几名兼职研究生,其中许多人每天都在美国国家航空航天局和几家航空航天承包商的全职工作中使用仿真技术。其中一些学生已经是 GPSS、SIMSCRIPT 和其他仿真工具的专业用户。鉴于研究生们令人印象深刻的背景,Pegden 决定利用团队教学法发挥学生们的专长,重点比较事件、过程和对象方法,以及实施仿真工具的高效算法。在这门课上,Pegden 了解了事件、过程和对象方法之间的差异,并产生了将事件和过程建模语言合并为一个框架的想法。由于 GASP IV 软件属于公共领域,Pegden 将 GASP IV 用作 SLAM 的事件和连续组件,然后扩展了这一框架,加入了新的流程建模功能。SLAM 语言是与这门课同时开发的,也是这门课的直接成果。
在 SLAM 完成之时,Pritsker and Associates 公司正在销售 GASP IV 仿真产品,该产品是 Nicholas Hurst 在 Alan Pritsker 指导下开发的博士论文。由于 SLAM 提供了 GASP IV 的所有功能,并增加了流程建模功能,因此与 GASP IV 相比有了明显的改进。1978 年夏天,Pegden 专程拜访了 Pritsker 和 Associated,向他们介绍了 SLAM 的优势,并建议 Pritsker 和 Associated 将 SLAM 推向市场,取代 GASP IV。双方达成了市场推广协议,并共同编写了一本关于使用 SLAM 进行仿真的新教科书。在新书和 Pritsker 的支持下,SLAM 很快在市场上取得了成功。
在接下来的几年里,Pegden 将他的研究兴趣从优化转向了仿真,并开始使用 SLAM 对复杂系统进行建模。他很快意识到,虽然该产品能很好地解决许多教科书上的问题,但流程建模功能的局限性迫使用户不得不在大多数复杂的实际应用中回到事件视图。因此,对于许多复杂的应用--尤其是制造环境中的应用--来说,最初的目标--制作一个更易于学习和使用的仿真工具--并没有实现。很显然,要实现这一目标,需要一种内容更丰富、功能更强大的流程语言,而且还需要一些特殊功能来满足某些制造应用的需要。因此,佩格登决定从头开始,开发 SIMAN 语言。
SIMAN 语言的开发始于 1981 年春季。设计的重点是扩大流程功能的完整性和提高执行效率。1981 年夏天,第一台 IBM PC 发布,这成为 SIMAN 开发的目标平台,对内存效率和执行速度提出了更高的要求。1981 年 8 月,佩格登在俄勒冈州波特兰市的泰克公司休假一年,全心致力于 SIMAN 语言的开发。在此期间,使用该语言的测试版成功地对几个制造过程进行了建模,从而验证了 SIMAN 能够显著提高过程建模能力的观点。在这段休假期间,还编写了一本关于使用 SIMAN 进行仿真的教科书(Pegden,1982 年)。
1982 年夏天,Pegden 联系了 Pritsker 和 Associates,询问他们是否有兴趣销售 SIMAN。然而,他们在 SLAM 上投入了大量资金,对新的 SIMAN 产品不感兴趣。因此,1982 年 12 月,丹尼斯和丽莎-佩格登成立了系统建模公司,并将 SIMAN 语言推向市场,一举获得成功。推动最初市场增长的三个关键因素是(1) SIMAN 显著提高了流程建模能力,(2) 以制造应用为重点的功能,(3) SIMAN 能够在新的 IBM PC 上运行。SIMAN 采用了特定的结构来模拟 AGV 和传送带等复杂的物料搬运设备。SIMAN 还采用了 Zeigler(Zeigler,1984 年)提倡的实验框架概念,即将模型逻辑与实验分离开来。
SIMAN 推出后,系统建模公司开发了基于 PC 的 Cinema 动画系统(1985 年),为 SIMAN 模型提供实时动画。与现有的基于角色的动画系统相比,该系统提供了更高的逼真度,并且通过与 SIMAN 模型并行执行,为模型提供了一个强大的交互式验证/确认平台。这是在仿真中利用动画功能的重要一步。由于当时还没有微软视窗系统,Cinema 是使用定制的窗口系统开发的。由于标准个人电脑的分辨率仅为 320 x 200,因此最初版本的 Cinema 需要一个特殊的第三方高端图形卡和显示器,以提供制作高质量动画所需的分辨率。SIMAN 和 Cinema 之后合并为 Arena 仿真系统(1991 年),并移植到微软视窗上。Arena 引入了以图形过程代替语句建立模型的概念,并提供了输入属性的对话框界面。它还支持输入和输出分析。Arena 在商业应用中广为流行,并成为大学用于仿真概念教学的主要仿真产品。在大学中大受欢迎的原因是 SIMAN 建模的灵活性、图形界面的易用性,以及 W. David Kelton、Randall P. Sadowski、Deborah A. Sadowski 和 David T. Sturrock 编写的广受欢迎的 "Simulation with Arena "教科书。2000 年,系统建模公司被罗克韦尔收购,后者目前负责 Arena 产品的销售和支持。
尽管 SIMAN 在建模灵活性方面向前迈进了一步,但仍有许多复杂的应用程序难以用流程视图建模。经常出现的一个问题是,SIMAN 中的资源(以及实体)没有自定义决策能力。虽然实体可以夺取资源,但资源在流程中没有发言权。在某些系统(如医疗保健)中,让资源控制自己的逻辑更为自然。斯蒂芬-罗伯茨(Stephen Roberts)的工作重点就在于为需要复杂资源逻辑的系统建模。
1973 年,罗伯茨受聘成为普渡大学的一名教师,并与位于印第安纳州印第安纳波利斯的印第安纳大学医学院的大型综合和多专科医疗保健诊所内的 Regenstrief 医疗保健研究所联合任职。在对这些诊所数年来的运营特点进行分析后发现,只有模拟才能对这些设施中复杂的随机成分进行分析。在普渡大学,Alan Pritsker 和他的学生们正在开发基于 GASP IV 离散仿真部分的网络(流程)仿真语言。虽然这些语言强调实体在流程中的流动,但很明显,在医疗服务中,"病人和相关流动 "只是环境的一部分,病人的流动受到繁忙的医疗服务提供者和工作人员的严重限制,他们在动态环境中提供服务,这与在制造设施中可能看到的机器和设备形成鲜明对比。事实上,流动几乎总是受到非常活跃的人力资源的限制,他们决定做什么,这取决于几个因素。
因此,在 20 世纪 70 年代末和 80 年代初,Regenstrief 研究所开发了一种名为 INSIGHT(前身为 INS)的仿真产品,其中包括实体的流动(当时称为交易),但以各种 "人员 "资源执行的 "工作描述 "为导向。建模采用活动作为实体和资源的服务点。活动指定了所需资源的数量、类型和组合,以及相关的活动时间,但活动前的逻辑队列会在服务开始前保存实体。因此,资源为活动提供服务,但为队列中的实体提供服务。实体不会移动到活动中,而是等待资源将其移动到活动中。资源可单独识别,也可按类型识别。每个资源都与资源决策树中的一个主节点相关联。可以定义多个资源决策树。主节点可以指向模型内的队列和/或其他主节点。这些主节点表达了通过搜索标准评估相关队列和其他节点的方法。例如,护士的主要决策节点可能是首先为检查室中需要护士服务的患者队列提供服务,然后为等待被安排到检查室并进行生命体征测量的患者队列提供服务,然后执行另一个主要决策节点,即根据个人的等待时间帮助登记或退出。这一决策过程可以是其他决策过程的一部分,也可以是某一资源所独有的。
无论如何,资源决策过程是动态的,关键取决于系统的状态。使决策过程发挥作用的是模拟语言所使用的状态更新算法。由于活动结束事件在所有其他事件中占主导地位,因此其更新是建模的核心,并被称为两阶段过程。当一项活动结束时,资源会暂时处于缓冲存储状态。此时,第一阶段是将实体送入网络,直到它因需要获取资源、开始活动或离开而停止前进。当阶段 1 完成后,阶段 2 被调用,缓冲存储器中的每个资源都会使用其决策树来决定下一步该做什么。它要么忙于另一项活动,要么闲置。有一些规范允许实体从缓冲存储器中识别和认领资源,并允许更新资源导致实体开始活动。需要注意的是,实体可能会因为同步要求(如收集或远程移动)而延迟。在活动中使用的资源之间的进一步优先权可能会导致活动的抢占或恢复。
INSIGHT 仿真语言的开发一直持续到 20 世纪 80 年代,并在 WSC 的教程中进行了介绍。该语言从未在商业上取得成功,1990 年罗伯茨前往北卡罗来纳州立大学工作后,Regenstrief 研究所暂停了该语言的开发。20 世纪 90 年代,罗伯茨主要与杰夫-乔因斯(Jeff Joines)一起开发了一种面向对象的 C++ 仿真语言,其过程仿真功能与 INSIGHT 非常相似。由于对象的多态性,这种仿真语言可以在一个扩展的决策过程中使用 "团队 "以及个人和类型资源。此外,该开发项目还展示了如何通过真正的面向对象特性来扩展和延伸 INSIGHT 这样的语言。然而,使用 INSIGHT 需要大量的 C++ 编程经验,因此它的接受度非常有限,开发不到十年就被淘汰了。尽管 INSIGHT 从未取得商业上的成功,但它强调了将建模的灵活性扩展到简单实体流之外,从而支持复杂资源逻辑建模的重要性。
离开仿真行业几年后,佩格登应邀在 2005 年冬季仿真大会上发表了关于仿真未来发展方向的泰坦演讲。这次演讲促使他花时间思考仿真的现状,以及如何改进现有工具。这促使佩格登提出了修改面向对象基本概念的概念,用流程取代编码方法,同时保留类、子类、继承、多态性、重载等基本概念。这一想法的动机是利用图形流程带来面向对象方法的好处,从而避免需要复杂的编程技巧。
Pegden 利用为泰坦演讲开发的这些概念,创建了 Simio 仿真软件,并于 2008 年推向市场。有了 Simio,用户无需使用 C++ 或 Java 等面向对象语言编码,就能更轻松地扩展和创建对象库。Simio 还进一步扩展了 INSIGHT 引入的智能资源理念。在 Simio 中,资源(和实体)也是可以使用自己的自定义流程逻辑响应请求的对象。这使得实体或资源能够控制自身行为的情况更容易建模。
Simio 的另一个关键进步是为对象使用附加流程的概念,以便在不修改对象定义的情况下逐个实例地修改其行为。在 Simio 引入这一概念之前,向对象实例添加自定义逻辑的主要方法是向对象添加自定义编码的事件。插件流程是一项重大突破,因为它们不仅更易于使用,而且功能更强大。新增的功能来自于流程逻辑,它可以表示跨越时间的活动,而编码事件则仅限于瞬间时间。
从 SLAM 到 SIMAN 再到 Arena 再到 Simio 的演变经历了近 40 年的时间。在此期间,主要的建模范式从事件转变为流程,再转变为对象。SLAM 的主要建模方法是事件,并尽可能使用流程。SIMAN 的主要建模方法是流程,必要时使用事件。使用 Cinema/Arena 时,动画成为建模和验证/确认过程的核心部分。使用 Simio 时,主要建模方法是基于对象,必要时使用流程。这一演变使仿真更易于使用,同时又不影响建模的灵活性。
多范式建模
最早的仿真建模方法反映了单一的仿真范式,即事件、活动、过程和对象。20 世纪 70 年代,出现了一种 "组合 "范式建模观点,允许用户选择最适合问题的建模方法,或根据情况组合建模方法。GASP IV(Pritsker,1974 年)普及了在同一模型中结合离散和连续框架的思想,尽管其他一些人在此之前也做过这方面的努力(例如,参见 Tocher 和 Splaine,1966 年)。该框架允许在同一仿真模型中同时进行离散事件建模和连续建模。它同时提供时间和状态事件,因此离散事件可以影响连续变量,而时间事件可以影响离散变量。SLAM(Pegden 和 Pritsker,1979 年)将这一组合推向了流程建模,是最早广泛使用的工具之一,旨在推广在同一模型中混合使用其他建模方法(流程、事件和连续)的理念。在 SLAM 中,过程/连续建模用于基本建模,而事件建模则用作 "后门",以提供更多的灵活性。
将仿真与其他分析工具结合使用的想法在仿真历史的早期就被非正式地采用了。1983 年,Shanthikumar 和 Sargent(1983 年)提出了仿真/分析混合模型的统一定义。他们提出了四类混合模型,分别代表了仿真模型和分析模型的交互方式。Swinerd 和 McNaught(2012 年)最近将基于代理的仿真与分析模型相结合,创建了一个混合仿真案例。
现代面向对象仿真工具也采用了多范式方法。这些工具将对象提供的简便快速建模与用户指定事件和/或流程带来的灵活性相结合。例如,代表服务器的对象可以在对象逻辑中选择一些点,用户可以在这些点上插入自己的事件逻辑或流程逻辑。事件逻辑通常使用 Java 或 C++ 等编程语言或可代替代码使用的特殊脚本语言纳入对象。不过,无论哪种情况,事件逻辑都有一个主要限制:模拟时间不能在事件中前进。这严重限制了可插入对象实例的逻辑类型。例如,无法在事件中等待工人可用,因为这需要时间前进。Simio(https://www.simio.com/index.php) 引入了一种功能更强大的方法,允许用户将对象与流程相结合。由于进程可以跨越时间,因此为用户提供了更多扩展其对象行为的能力。因此,可以在对象中嵌入进程,以等待指定的时间或指定的条件(如 Fred 可用)。这种方法将流程的全部功能和灵活性与对象的简易性和快速建模能力结合在一起。
AnyLogic(http://anylogic.com/) 将基于代理的建模、系统动态建模和离散事件建模结合到一个工具中。一个 AnyLogic 模型可以结合所有三种建模方法来表示系统行为。
此外,与对多范式的兴趣相辅相成的是对在特定框架或仿真理论内统一仿真建模的兴趣。1981 年,南斯(Nance,1981 年)描述了时间和状态在离散事件仿真中的基本作用,并最终提出了锥形方法论(Overstreet 和 Nance,1985 年),该方法论为封装事件、活动和过程等基本建模观点提供了一个框架。
最著名的仿真理论是 Zeigler 于 1984 年首次提出的形式主义(Zeigler 1984),现在被称为 DEVS(离散事件系统规范)。多年来,该理论得到了发展,并应用于众多案例(见 Zeigler 和 Muzy 2017)。DEVS 是一种正式的系统理论,由输入、状态和输出组成,结合时间推进函数,对离散和连续系统(可能是分层的)组件进行建模。这种抽象提供了一个框架,将建模和仿真执行分离开来,以突出事件的排序和潜在并行执行。DEVS 形式主义引起了全世界的兴趣,其表述方式也得到了许多扩展和解释。
Schruben 和 Yucesan(Schruben 和 Yücesan 1993 年)采用图论方法表明,离散事件仿真的事件图视图可用于创建完整一致的模型开发(问题解决)环境。事件图模型不仅具有视觉吸引力,还为模型构建提供了严格的框架(Savage 等人,2005 年)。
用动画建模
在仿真的最初 30 年中,输出都是文本报告的形式。虽然早在 1970 年(Reitman 等人,1970 年)就设想过仿真执行的视觉动画,但将动画融入商业仿真还是在 20 世纪 80 年代。关于动画的优劣曾有过激烈的争论。许多人认为动画只是一种装饰,对仿真项目的成功没有实际影响。但现在,动画已被视为成功仿真项目的重要组成部分,在企业内部扩大仿真应用方面发挥着关键作用。动画的重要优势之一是能够将模型行为传达给模型的所有利益相关者。从车间到顶层,每个人都能看到模型中的行为。动画使建模假设清晰明了,是验证和确认模型的有力工具。
在没有动画之前,决策者需要相信模型能够在适当的细节水平上准确再现真实系统的行为。模型逻辑中经常会出现错误,但却没有简单直观的方法来检测逻辑中的错误。有了动画,模型栩栩如生,行为清晰可见。动画与交互式调试器相结合,从根本上提高了发现和修复模型逻辑错误的能力。动画不仅能帮助建模人员发现和修复逻辑中未处理的错误,还能帮助传达任何模型中都有的计划简化假设。动画是建立对模型结果信心的重要组成部分。
早期的仿真动画系统之一是 80 年代末开发的名为 See Why 的产品,它使用了基于角色的基本动画。Witness 仿真软件(https://www.lanner.com/technology/witness-simulation-software.html) 就是在 See Why 的基础上开发的。Cinema 动画系统是同一时期开发的基于二维矢量的动画系统,是 SIMAN 模型的实时动画系统。随后,Cinema 动画系统和 SIMAN 建模系统被整合到一个平台上,形成了广泛使用的 Arena 产品。另一个早期的二维动画系统是 Wolverine Software 公司的 Jimes O. Henriksen 于 1989 年开发的 Proof(http://www.wolverinesoftware.com/ProofProducts.htm)。
90 年代,三维动画功能开始出现。早期的系统包括 AutoMod(专注于材料处理系统)(http://www.appliedmaterials.com/global-services/automationsoftware/automod)、Taylor ED(FlexSim 的前身(https://www.flexsim.com/))和 Simple++(PlantSim 的前身 (https://www.plm.automation.siemens.com/))。关于动画的争论还延伸到是否需要高保真三维动画与二维动画的问题。一些人认为,二维动画足以获得动画的大部分益处,而三维动画所需的额外工作带来的回报却越来越少。虽然与二维动画相比,高质量的三维动画不会改变底层模型或结果,但逼真度的提高有助于传达模型结果。此外,随着三维动画的改进和三维符号的广泛使用,制作三维动画不再需要花费大量的时间和精力。因此,大多数现代仿真工具都提供了三维动画环境。
事实证明,面向对象框架、身临其境的三维建模环境和改进的三维绘图功能三者的完美结合,将三维动画带入了仿真建模的主流。现在,大多数现代仿真工具都将三维作为一项标准功能。
仿真动画的下一个浪潮是开发用于显示仿真动画的全虚拟现实(VR)环境。这可以让观众沉浸在模型中,在模拟真实系统的 VR 环境中穿行,并通过移动物体、重新引导交通或改变模拟活动与模拟进行交互。一些仿真系统(如 Simio、FlexSim、Emulate3D(https://www.demo3d.com/))已经支持在 VR 环境中观看动画。允许用户干预动画是开发 VR 显示的下一步。
商业影响
评论
在仿真技术的发展史上,有许多仿真语言和仿真软件包,每种语言和软件包通常都声称拥有独特的建模组件。由于无法抓住仿真受众,许多仿真语言和仿真软件包在市场上大行其道。连续仿真的基础是微分方程的求解,而离散仿真则不同,没有通用的、公认的基础理论。因此,仿真建模更多地是一种 "艺术"。在实践中,模拟的艺术要求对所使用的工具能够模拟的内容有相当全面的了解,而不是一味地关注所要解决的问题。因此,成功的仿真通常是某些商业利益的产物,并辅以丰富的文档和学习工具,所有这些都是在促进工具效益的框架内进行的。
人们普遍认为,将问题转化为模拟是系统性能目标、可用输入数据和建模人员建模技能的综合体现。处理可用输入数据和不同性能指标的方法有很多(见 Banks 等人,2010 年;Law,2015 年)。模型概念化通常依赖于图形表示法(框图、流程图、活动循环图等),这些表示法通常与特定的仿真语言相关联,对一般方法的系统讨论还很有限。罗宾逊(Robinson,2008a, b)提出了一个由两部分组成的概念建模框架。概念模型的含义和要求包括:有效性、可信性、实用性和可行性。实际建模活动包括:理解问题情境、确定建模和一般项目目标、确定模型输出、确定模型输入以及确定模型内容。这些工作共同提供了一个概念化框架,但尚未产生一个计算模型。概念模型的实现还必须由仿真建模人员可以使用的仿真语言或仿真软件包来实现。
仿真语言在仿真建模中的作用仍然是密不可分的。通过图形技术和自然语言使建模更加透明和可见的努力为仿真建模提供了巨大的潜力。然而,随着计算技术的发展,仿真技术必须与大型数据存储和分析技术相结合,才能发挥更大的潜力。

