1.3 组合仿真方法的发展
1.3.1 模块化的仿真组合方法
模块化的模型组合方法源于面向过程的软件设计和包含输入/输出的功能模型建模方法。通过功能模块的输入/输出(I/O)可以描述层次化、模块化的仿真模型。20 世纪70年代至90 年代初期的仿真系统实现也基本采用模块化的程序设计方法建立仿真模型和仿真系统。在模块化程序设计方法的支持下,建立仿真函数库是仿真模型实现的有效方法,其好处在于建模者可以专注于模型的逻辑关系而不必担心模型实现的细节。这些仿真函数库一般包括随机数生成、微分方程求解、仿真运行调度、资源管理、仿真结果收集、仿真结果分析等功能。仿真函数库的这些功能主要通过一系列的库函数实现,建模过程中通过调用相应的库函数完成仿真模型需要实现的功能,这样可以减少建模人员的工作量。仿真函数库中的功能及相应的库函数也可以根据需求进行扩展。CSIM等系统是一个典型的基于模块的离散事件仿真程序库。
20世纪80年代,B. P. Zeigler教授提出的面向DEVS规范也是在层次化、模块化的思想指导下开发的。DEVS把每个子系统都看做是一个具有独立内部结构和明确I/O接口的模块,若干个模块可以通过一定的连接关系组成组合模型,组合模型可以作为更大的组合模型的元素支持更高层次的组合,从而形成对模型的层次、模块化描述。与DEVS对应的是DEVS-Simulator,即抽象仿真器。抽象仿真器是一种算法描述,用以说明怎样将执行指令隐含地传送给DEVS模型,从而产生模型的行为。抽象仿真器与模型之间存在一一对应的关系。每个模块或组合模型都有一个与之对应的抽象仿真器,它负责收发消息,调用模块的转移函数,并修改本地的仿真时钟。另外MatLab中的Simulink工具也是完全基于功能模块的思想开发的,用户可以在建模环境中对功能模块的I/O进行组合,从而形成层次化的功能模块组合模型。
某些情况下,面向模块化的组合很难适于仿真系统的使用。如采用临时实体、永久实体、活动、进程等对离散事件系统进行建模时,用户将面临较大的困难。所以,很多20世纪80 年代的仿真系统为用户建模提供面向对象的用户接口。如Simula 67、SLAM、SIMSCRIPT、ModSAF等为用户提供面向实体的模型描述接口,简化用户建模的负担。Simula 67 引进了实体和对象对模型进行抽象;SLAM通过进程网络支持用户描述实体进程;SIMSCRIPT通过实体、资源和实体集合等描述实体的进程交互。CSIM和ModSAF中则采用了类似于X窗口库中C语言函数指针的回调机制支持用户建立新的实体行为模型。虽然这些系统面向最终用户时可以提高模型的可组合能力,然而当用户需要特殊的模型行为描述或对系统模型框架进行扩展时,这些基于模块化方法的仿真系统仅能通过库函数支持模型的描述,不能适应大规模复杂系统的仿真需求。虽然基于模块化程序设计的仿真系统存在系统扩展性差,开发人员使用复杂的问题,但其中面向用户开发的可组合思想,如实体、属性、抽象、进程等概念催生了面向对象软件设计技术的发展,也促进了面向对象仿真的发展。