本发明涉及建模与仿真技术领域,尤其涉及一种适用于复杂系统仿真的并行离散事件仿真系统自动初始化实现方法。
背景技术:
自20世纪90年代欧美等发达国家开始对并行离散事件仿真技术进行研究以来,相继推出了多个基于高性能计算平台的并行离散事件仿真运行支撑环境,如speedes、warped、parsec、usik等。这些并行离散事件仿真支撑环境广泛应用于大规模生态环境仿真、计算系统生物学仿真、复杂战争环境下的大规模作战模拟、国家与国防战略研究、危机预测预警与处置决策等复杂系统仿真应用中,为复杂系统及复杂性问题的研究提供了重要的科学实验方法和工具。
并行离散事件仿真系统初始化是进行仿真推演的第一步,正确高效的初始化对仿真系统的顺利执行至关重要。在军事仿真系统中,仿真想定作为不可或缺的重要环节,能够反映出作战双方的兵力部署和作战方案等信息。仿真系统初始化前,需要从仿真想定文件中获取仿真系统运行所需的先决条件以及初始化数据,如想定环境、实体集合、航迹集、责任区等,以生成仿真应用系统的初始化程序,对相应的变量进行初始化赋值,为仿真系统的正确运行提供支持。
基于并行离散事件仿真技术实现的复杂系统仿真应用通常由多个仿真对象组成,每个仿真对象又可能由多个仿真模型组成,并且随着复杂系统仿真应用的不断深入,仿真对象规模越来越大,仿真模型越来越复杂,使得复杂系统仿真应用的初始化程序也越来越复杂,开发难度也越来越高;其次,仿真想定文件的数据组织结构是面向军事仿真人员的,与并行离散事件仿真系统的组织结构存在较大的差异性,难以直接建立起仿真想定数据与仿真系统初始化变量之间的映射关系;再次,在仿真系统的实际应用过程中,军事仿真人员通常需要频繁修改仿真系统参数,以对不同场景下系统的性能进行评估,这对仿真系统初始化程序的适应性提出了较高的要求。
传统的并行离散事件仿真初始化程序通常采用“堆砌代码”式的开发方式,如基于speedes的仿真应用开发方法等。此类方法要求仿真开发人员在理解系统初始化需求和想定文件数据结构的基础上,人工从想定文件中搜索对应的初始化数据,并手动编写代码为相应的初始化变量赋值,导致仿真系统初始化程序的实现工作量较大,引入人工错误的概率较高,对想定文件变化的适应能力也较差。
技术实现要素:
本发明要解决的技术问题就在于:针对现有技术存在的技术问题,本发明提供一种实现方法简单、初始化成本低、初始化精度及效率高的并行离散事件仿真系统自动初始化实现方法,采用模块化的设计方法实现仿真系统的自动初始化,能够大大减少人工参与仿真系统初始化的工作量,提高初始化程序开发效率,避免引入人工随机错误,同时能够更好地适应仿真想定文件的变化。
为解决上述技术问题,本发明提出的技术方案为:
一种并行离散事件仿真系统自动初始化实现方法,步骤包括:
s1.想定文件解析及数据存储:获取想定文件并进行解析,将解析得到的初始化数据存储至预先构建的想定数据存储结构中;
s2.构建赋值函数模板库:构建包含有初始化数据与仿真对象的属性之间映射关系的赋值函数模板库;
s3.仿真自动初始化:读取仿真对象模型描述文件,根据所述赋值函数模板库从所述想定数据存储结构中搜索仿真对象的初始化数据,对仿真对象进行初始化赋值。
作为本发明方法的进一步改进:所述想定数据存储结构具体为根据仿真系统结构层次,基于哈希表嵌套构建得到,使得构建得到的想定数据存储结构与仿真系统结构层次相匹配。
作为本发明方法的进一步改进:所述想定数据存储结构具体为依次由仿真对象类哈希表、仿真对象实例哈希表以及仿真对象实例属性哈希表嵌套构建得到,其中所述仿真对象类哈希表为基于仿真对象类信息、所述仿真对象实例哈希表构建哈希表得到,所述仿真对象实例哈希表为基于仿真对象实例信息、所述仿真对象实例属性哈希表构建哈希表得到,所述仿真对象实例属性哈希表为基于对象属性信息构建哈希表得到。
作为本发明方法的进一步改进:所述仿真对象实例属性哈希表具体为基于对象属性信息、仿真对象属性集合哈希表构建哈希表得到,所述仿真对象属性集合哈希表为由属性信息集合构建哈希表得到;所述仿真对象属性集合哈希表包括由第一属性信息构建哈希表得到的第一属性集合、以及由第二属性信息构建哈希表得到的第二属性集合。
作为本发明方法的进一步改进:所述第一属性信息为包括属性名称、属性值域的基本属性信息;所述第二属性信息为包括航迹id或多粒度属性信息、属性集的复杂属性信息。
作为本发明方法的进一步改进,所述步骤s1的具体步骤为:
s11.设置想定文件与样本编号,每一个想定文件包含多个样本,且每一个样本包含进行一次仿真系统初始化所需的所有初始化数据;
s12.根据所述步骤s11中的设置解析仿真对象数据集、分析仿真对象类数目;
s13.依次嵌套构建仿真对象类哈希表、仿真对象实例哈希表以及仿真对象实例属性哈希表;
s14.根据所述步骤s11中设置解析公共属性信息以及编组信息;
s15.将解析得到的所述公共属性信息以及编组信息插入所述仿真对象实例属性哈希表中;
作为本发明方法的进一步改进,所述步骤s13的具体步骤为:
s131.将仿真对象类名作为key值,以及构建仿真对象实例属性哈希表h2并作为value值,分别存入所述仿真对象类哈希表h1;
s132.将仿真对象实例号作为key值,以及构建仿真对象属性哈希表h3并作为value值,分别存入所述仿真对象实例属性哈希表h2;
s133.将仿真对象属性名称作为key值,以及构建用于存储仿真对象属性值的仿真对象属性容器作为value值,分别存入所述仿真对象属性集合哈希表h3。
作为本发明方法的进一步改进:所述赋值函数模板库为基于适配器模式的接口函数库,所述接口函数库中接口函数包括对应多种仿真对象属性的变量参数。
作为本发明方法的进一步改进:所述接口函数具体包括对应仿真对象类名称、仿真对象实例编号、仿真对象实例名称、模型初始化参数结构中的变量名称的多种变量参数。
作为本发明方法的进一步改进,所述步骤s3的具体步骤为:
s31.根据仿真对象类名称、仿真对象实例名称或实例编号,以及需要被初始化的属性名称,在所述赋值函数模板库中搜索对应的赋值函数模板;
s32.在仿真对象初始化函数中,根据需要被初始化的属性名称及搜索到的赋值函数模板,生成相应的赋值语句;
s33.执行所述步骤s32生成的赋值语句,使得从所述想定存储结构中搜索到所述仿真对象的值域,并将搜索到的值为仿真对象的状态变量赋初始值。
与现有技术相比,本发明的优点在于:
1)本发明通过将想定数据存储在想定数据存储结构中,同时通过构建赋值函数模板库,建立想定数据与仿真对象的属性之间的映射关系,将存储数据与仿真系统初始化变量之间进行匹配对应,并且能自动生成仿真对象初始化代码,完成仿真对象初始化变量自动赋初始值,从而避免人工查找初始化变量值并编写仿真系统初始化代码,提高仿真系统的开发效率,减少人工参与以及由于人工操作造成的错误率,实现自动初始化;
2)本发明通过嵌套哈希结构的想定数据存储结构存储想定数据,可以通过根据仿真应用系统的层次,从仿真对象类、仿真对象实例、计算模型实例、属性变量的序列重新组织想定文件中的数据信息,使得既能够避免每次初始化时都需要扫描一次想定文件,又能够方便仿真系统快速查找初始化变量,从而减少仿真系统处理时间,提高了初始化效率;
3)本发明通过基于适配器模式的接口函数库为实现自动生成仿真对象初始化提供接口,
通过调用适配器接口函数库中的接口函数,能够按照仿真对象类名称、仿真对象实例编号、仿真对象实例名称、模型初始化参数结构中的变量名称等自动搜索想定数据存储结构,搜索出对应属性的初始化数据并赋值给初始化变量,建立想定数据与对象属性名称之间的映射关系,从而实现仿真对象与其初始化变量值之间的对应匹配;
4)本发明通过代码自动生成技术实现仿真系统的自动初始化,能自动生成初始化赋值语句,相比较于传统的手工编写的代码,人工错误率低,同时自动生成代码具有灵活的同步机制,当开发人员需要大批量修改代码,或者仿真想定文件内数据发生改变时,只需要稍作更改,再次运行仿真初始化代码生成器即可生成仿真初始化代码,提高了工作效率。
附图说明
图1是本实施例并行离散事件仿真系统自动初始化实现方法的实现流程示意图。
图2是本实施例实现并行离散事件仿真系统自动初始化方法的装置的结构原理示意图。
图3是本实施例想定数据存储结构的原理示意图。
图4是本实施例采用想定数据存储结构进行数据存储的实现流程示意图。
图5是本实施例想定文件解析的具体流程示意图。
图6是本发明具体实施例中进行初始化变量赋值的原理示意图。
具体实施方式
以下结合说明书附图和具体优选的实施例对本发明作进一步描述,但并不因此而限制本发明的保护范围。
如图1、2所示,本实施例并行离散事件仿真系统自动初始化实现方法,步骤包括:
s1.想定文件解析及数据存储:获取仿真想定文件并进行解析,将解析得到的初始化数据存储至预先构建的想定数据存储结构中。
对仿真想定文件进行解析时,通过将想定文件里的数据信息存储到定义好的想定数据存储结构里,可以避免对每个仿真对象初始化时都需要扫描一次想定文件而造成效率低下等问题,方便仿真应用系统初始化时能快速高效地查找并读取出对应的想定存储数据。
本实施例中,想定数据存储结构具体为根据仿真系统结构层次,基于哈希表构建得到,使得构建得到的想定数据存储结构与仿真系统结构层次相匹配。哈希表是利用哈希算法和哈希值直接寻址并定位数据结构,能在较短时间内访问表内任何的数据元素。
传统的如采用树结构来加载和解析xml文件时,需要以结构树的形式将整个文件载入系统内存,当随着仿真规模增大,以及仿真想定文件复杂程度越来越高时,xml的数据量也随即增加,同时异构性也越来越强,因而使用树形结构等方式存储xml文件会造成内存消耗过大,同时增加算法的空间复杂度,使得查询效率大大降低。与传统的如采用树结构存储的方式相比,本实施例采用哈希表存储想定数据,所需的内存消耗小且复杂度低,能够快速、准确的在存储结构中检索出对应的数据类型,从而方便仿真系统快速、精确的定位出需查找的数据。
在具体实施例中,考虑到与仿真系统相对应的层次结构,本实施例具体采用嵌套式的哈希结构存储想定数据,如图3、4所示,本实施例想定数据存储结构具体为依次由仿真对象类哈希表(仿真对象类hashmap)、仿真对象实例哈希表(仿真对象实例hashmap)以及仿真对象实例属性哈希表(仿真对象实例属性hashmap)嵌套构建得到,其中仿真对象类哈希表为基于仿真对象类信息、仿真对象实例哈希表构建哈希表得到,仿真对象类信息为仿真对象类名称;仿真对象实例哈希表为基于仿真对象实例信息、仿真对象实例属性哈希表构建哈希表得到,仿真对象实例信息为仿真对象实例id;仿真对象实例属性哈希表为基于对象属性信息构建哈希表得到,对象属性信息为对象属性名称、对象属性值域,上述嵌套式想定数据存储结构能够与仿真系统结构的层次相匹配。
本实施例通过上述哈希结构的想定数据存储结构存储想定数据,根据仿真应用系统的层次,将原本与仿真系统初始化变量结构异构的想定数据重新梳理,从仿真对象类、仿真对象实例、计算模型实例、属性变量的序列重新组织想定文件中的数据信息,使得既能够避免每次初始化时都需要扫描一次想定文件,又能够方便仿真系统快速查找初始化变量,从而减少仿真系统处理时间,提高了初始化效率。
如图5所示,本发明具体实施例中上述步骤s1的具体步骤为:
s11.设置想定文件与样本编号,其中每一个仿真想定文件包含多个样本,由一个样本编号对应标识一个样本,每一个样本包含进行一次仿真系统初始化所需的所有初始化数据;
s12.根据步骤s11中的设置解析仿真对象数据集、仿真对象类数目;
s13.根据步骤s12解析得到的信息,依次嵌套构建仿真对象类哈希表、仿真对象实例哈希表以及仿真对象实例属性哈希表;
s14.根据步骤s11中设置解析公共属性信息以及编组信息;
s15.将解析得到的公共属性信息以及编组信息插入仿真对象实例属性哈希表中。
本实施例中,步骤s13中嵌套构建仿真对象类哈希表、仿真对象实例哈希表以及仿真对象实例属性哈希表具体如上所述,即基于仿真对象类名称、仿真对象实例哈希表构建得到仿真对象类哈希表,基于仿真对象实例id、仿真对象实例属性哈希表构建得到仿真对象实例哈希表,基于对象属性名称、对象属性值域构建得到仿真对象实例属性哈希表。
如图4所示,本实施例中步骤s13基于嵌套哈希表构建想定数据存储结构的具体步骤为:
s131.将仿真对象类名classname作为key值,以及构建仿真对象实例属性哈希表h2(instance_map)并作为value值,分别存入仿真对象类哈希表h1(class_instance_map);
s132.将仿真对象实例号instanceid作为key值,以及构建仿真对象属性哈希表h3(attribution_map)并作为value值,分别存入仿真对象实例属性哈希表h2(instance_map);
s133.将仿真对象属性名称attrname作为key值,以及构建用于存储仿真对象属性值的仿真对象属性容器vector并作为value值,分别存入仿真对象属性集合哈希表h3(attribution_map)。
通过上述存储得到仿真对象数据存储结构,则根据所需要查找的仿真对象类名、目标属性名、目标仿真对象属性类型,依次查找对应的仿真对象类哈希表、仿真对象实例属性哈希表、仿真对象属性哈希表,查找到对应的仿真对象属性容器vector,从而查找到对应的仿真对象属性值。
s2.构建赋值函数模板库:构建包含有初始化数据与仿真对象的属性之间映射关系的初始化变量赋值函数模板库。
通过设置赋值函数模板库,建立想定数据与对象属性名称之间的映射关系,从而实现仿真对象与其初始化变量值之间的对应匹配,以用于后续实现自动初始化。
本实施例中,赋值函数模板库具体为基于适配器模式的接口函数库,为后续实现自动生成仿真对象初始化提供接口,接口函数库中接口函数包括对应多种仿真对象属性的变量参数。适配器模式是结构型模式的一种,能够将一个类的接口转换成所需的另一个接口,适配器模式的主要功能是进行转换匹配,使得原本已有的功能得到复用,如由于接口不能兼容而不能一起使用的类通过适配器模式转换后能够一起使用。
在具体实施例中,接口函数具体包括对应仿真对象类名称、仿真对象实例编号、仿真对象实例名称、模型初始化参数结构中的变量名称的多种变量参数。通过调用适配器接口函数库中的接口函数,能够按照仿真对象类名称、仿真对象实例编号、仿真对象实例名称、模型初始化参数结构中的变量名称,自动搜索想定数据存储结构,从中搜索出对应属性的初始化数据并赋值给初始化变量,建立想定数据与对象属性名称之间的映射关系,从而实现仿真对象与其初始化变量值之间的对应匹配。
在具体实施例中,接口函数库中接口函数的基本形式为:
get/type/value(stringsimobjname,intinstancenumber,stringparametername)或者
get/type/value(stringsimobjname,stringinstancename,stringparametername)
其中,返回值的数据类型为type(如intgetintvalue,doublegetdoublevalue等),simobjname为仿真对象类名称,instancenumber为实例编号,instancename为实例名称,parametername为变量名称。
一个具体实施例中所采用的适配器接口函数集如下所示:
classsupe_utility//解析想定的通用函数
{
private:
stringm_sceneriofile;//想定文件
intm_samplenumber;//样本编号
public:
//设置想定文件
voidsetsceneriofile(stringfile);
//设置样本编号
intsetsamplenumber(intnumber);
//返回布尔型参数值
intgetboolvalue(stringsimobjname,intinstancenumber,boolparametername);
intgetboolvalue(stringsimobjname,stringinstancenumber,boolparametername);
//返回整型参数值
intgetintvalue(stringsimobjname,intinstancenumber,stringparametername);
intgetintvalue(stringsimobjname,stringinstancenumber,stringparametername);
//返回单精度浮点型参数值
floatgetfloatvalue(stringsimobjname,intinstancenumber,stringparametername);
floatgetfloatvalue(stringsimobjname,stringinstancenumber,stringparametername);
//返回双精度浮点型参数值
doublegetdoublevalue(stringsimobjname,intinstancenumber,stringparametername);
doublegetdoublevalue(stringsimobjname,stringinstancenumber,stringparametername);
//返回数组类型参数值
vector<int>getvectorintvalue(stringsimobjname,intinstancenumber,stringparametername);
vector<int>getvectorintvalue(stringsimobjname,stringinstancenumber,stringparametername);
}
在具体实施例中,如图6所示,调用接口函数为初始化变量赋值的格式为:
((radarinitdata*)pentityinitial)->radarname=supe_utility.getstringvalue(s_radar,getmodelid(),“radarname”),其中s_radar为radar模型所在仿真对象类名,getmodelid()为仿真对象实例id,“radarname”为radar模型初始化参数结构中的变量名称,radarinitdata数据结构是radar模型初始化函数initialize(radarinitdata*pentityinitial)的参数,radarname是radarinitdata结构中的变量,即string类型,则采用getstringvalue函数赋值。
s3.仿真自动初始化:读取仿真对象模型描述文件,根据赋值函数模板库从想定数据存储结构中搜索仿真对象的初始化数据,对仿真对象进行初始化。
首先构建初始化代码自动生成模块,由初始化代码自动生成模块读取仿真对象模型描述文件,根据赋值函数模板库生成相应的初始化变量赋值函数,由此赋值函数实现从想定数据存储结构中搜索仿真对象的初始化数据,对仿真对象初始化变量进行赋值。
通过实现并行仿真系统的自动初始化,相比于传统的需要手工编写代码相比,降低了代码的错误率,同时自动生成代码具有灵活的同步机制,当需要大批量修改代码,或者仿真想定文件内数据发生改变时,仅需要少量的修改操作,再次运行仿真初始化代码生成器即可生成新的所需仿真初始化程序,有效提高了工作效率。
在具体应用实施例中,步骤s3具体自动生成仿真对象初始化变量赋值的程序,由生成的自动化程序读取模型描述文件,按照仿真对象属性调用仿真想定适配器接口函数库中的相应的接口函数,通过调用的接口函数在想定存储数据结构中搜素仿真对象的值域,将搜索到的值域为仿真对象的状态变量赋初始值,详细步骤为:
s31.根据仿真对象类名称、仿真对象实例名称或实例编号,以及需要被初始化的属性名称,在赋值函数模板库中搜索对应的赋值函数模板,即为对应的接口函数;
s32.在仿真对象初始化函数init()中,根据需要被初始化的属性名称及搜索到的赋值函数模板,生成相应的赋值函数语句;
s33.执行所生成的赋值函数语句,使得从想定存储结构中搜索到仿真对象的值域,并将搜索到的值为仿真对象的状态变量赋初始值。
在具体实施例中,采用上述方法通过java编程语言自动生成初始化程序,根据存储的想定数据和赋值函数模板库利用velocity引擎自动生成代码,实现自动生成初始化程序的功能,即按照初始化变量名称,通过调用仿真想定适配器接口函数库中的相应的接口为仿真对象的状态变量进行自动赋初始值。
本实施例上述方法需要自动生成以下程序:
自动初始化程序。该部分代码位于仿真对象类的voidinit()函数中,用于按照对象属性名称在想定数据存储结构中搜索其值域,并为仿真对象属性赋初始值。
生成自动初始化程序时,具体根据需要初始化的变量的数据类型,从接口函数库中选择相应的赋值函数,一个具体实施例中自动初始化程序如下所示:
voids_ship::init()
{
//通过赋值函数给相应的参数初始化
intcountry=supe_utility.getintvalue(s_ship,spgetsimobjkindid(),“country”);
doublelongtitude=supe_utility.getdoublevalue(s_ship,spgetsimobjkindid(),“longtitude”);
}
本实施例采用上述方法,通过将想定文件里的数据读取出来并进行重组及存储,以方便仿真系统实时高效的查找、提取所需数据,避免如传统的仿真系统初始化时每次都需要读取一次想定文件,提高数据查找效率;同时通过构建赋值函数模板库,建立想定数据与仿真对象的属性之间的映射关系,将存储数据与仿真系统初始化变量之间进行匹配对应,再基于上述赋值函数模板库以及想定数据存储结构,自动生成初始化赋值语句,生成的语句调用接口函数从想定存储数据结构中搜索到仿真对象的值域,实现并行仿真系统的自动初始化,解决了复杂仿真系统中难以建立起仿真想定数据与初始化变量之间的转换关系,以及仿真系统初始化程序与想定解析逻辑耦合程度高的问题;基于自动初始化方式,能够减少人工参与以及由于人工操作造成的错误率,有效提高仿真系统开发的效率及精度。
如图2所示,本实施例实现上述并行仿真系统自动初始化实现方法的装置,包括:
想定文件解析模块,用设置仿真想定文件并进行解析,将解析得到的初始化数据存储至预先构建的想定数据存储结构中;
赋值函数模板库模块,用于构建包含有想定数据与仿真对象的属性之间映射关系的赋值函数模板库;
仿真自动初始化模块,用于取仿真对象模型描述文件,根据所述赋值函数模板库从所述想定数据存储结构中搜索仿真对象的初始化数据,对仿真对象进行初始化赋值。
通过构建上述想定文件解析及数据存储模块、赋值函数模板库、仿真自动初始化模块可实现仿真系统的自动初始化,想定文件解析及数据存储模块中采用层次式想定数据存储结构采重新组织想定数据,想定数据存储结构具体如上所述,能够便于在初始化程序执行时快速搜索到对应的仿真变量初始值;赋值函数模板库建立仿真想定数据与仿真系统初始化变量之间的映射关系,结合仿真自动初始化模块即可实现自动初始化变量赋值;仿真自动初始化模块通过自动生成初始化赋值语句,避免了手动编写代码致使工作量大,人工错误率高等问题,提高了对仿真想定文件变化的适应能力,能够提高并行离散事件仿真系统的自动化程度、减少人工参与及错误,同时提高系统开发效率。
本实施例中,想定文件解析及数据存储模块包括:
设置单元,用于设置想定文件与样本编号;
第一解析单元,用于根据设置单元中的设置解析实体数据集、分析实体类数目;
哈希表构建单元,用于依次嵌套构建仿真对象类哈希表、仿真对象实例哈希表以及仿真对象实例属性哈希表;
第二解析单元,用于根据设置单元中设置解析公共属性信息以及编组信息;
信息数据存储单元,用于将解析的公共属性信息以及编组信息插入仿真对象实例属性哈希表中。
本实施例中,赋值函数模板库构建模块中赋值函数模板库为基于适配器模式的接口函数库,接口函数库中接口函数包括对应多种仿真对象属性的变量参数。
仿真自动初始化模块读取到模型描述文件后,获取需要初始化的仿真对象类名、实例名等信息,自动生成初始化赋值语句。生成的代码通过调用的接口函数在想定数据存储结构中搜素仿真对象的值域,将搜索到的值域为仿真对象的状态变量赋初始值,如图2所示:
(1)根据仿真对象类名称(如simobja)、仿真对象实例名称或实例编号(如1),以及需要被初始化的属性名称(country),在赋值函数模板库中搜索对应的赋值函数模板(getstringvalue);(2)在仿真对象初始化函数init()中,根据需要被初始化的属性名称(如country)及搜索到的赋值函数模板(getstringvalue),生成相应的赋值语句(如string)。
上述只是本发明的较佳实施例,并非对本发明作任何形式上的限制。虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明。因此,凡是未脱离本发明技术方案的内容,依据本发明技术实质对以上实施例所做的任何简单修改、等同变化及修饰,均应落在本发明技术方案保护的范围内。