第27卷第8期 文章编号:1006—9348(2010)08—0311—05 计算机仿真 2010年8月 规则引擎在离散事件仿真平台中的应用 罗钦扬 ,杜斌 ,朱俊 ,秘慧杰 (1.上海交通大学电子信息与电气工程学院,上海200240; 2.宝山钢铁股份有限公司研究院,上海201900) 摘要:在物流仿真平台中,经常需要根据一系列的规则流来决定物流的走向,而在仿真平台中对复杂规则流的实现、维护以 及更改常常是一项艰苦的工作。为了对离散物流事件快速查找,提供了方便,提供了一种将规则引擎引入传统物流仿真平 台的技术,实现了规则和程序的相分离,使得仿真平台的用户在仿真的过程当中,随时输入和查看以及修改规则流,从而显 著提高了仿真系统的性能,维护的效率。最后给出了一个简单的应用实例用来说明嵌入规则引擎之后的离散事件仿真平台 的仿真效果。 关键词:规则流;规则引擎;离散事件;YS真平台;物流仿真 中图分类号:TP311.1 文献标识码:B A Rule Engine and Application on Platform for Discrete Event Simulation LUO Qin—yang ,DU Bin ,ZHU Jun ,MI Hui—jje (1.Department of Automation,Shanghai Jiao Tong University,Shanghai 200240,China; 2.Research Institute of Automation,Academy of BaoSteel,Shanghai 200240,China) ABSTRACT:On the P1atfo丌n for Discrete Event Simulation.rule string iS always used to decide the direction of Dis. tribution.However,realization,maintenance and modiifcation of complex rule string are always hard work.This arti— cle presents a technology introducing the Rule Engine into the Platform for Discrete Event Simulation,which realizes the separation of the rule and the program.It enables user to input,view and modify the rule sting atr any time dur- ing the simulation and thus increases the efficiency of developing and maintaining the simulation system.A simple ex— ample of application is given at the last part of this article in order to show the actual result of Platform for Discrete E. vent Simulation after the Rule Engine was embedded. KEYWORDS:Rule string;Rule engine;Discrete event;Simulation platform;Logistics system simulation 的时候,这种通过单一功能的模块进行组合的方式便显得比 1 引言 离散事件仿真就是按照实际的工作流程,在规定的时间 内顺序地改变实体或设备的状态,所谓工作流程是指实体在 整个仿真过程中活动的顺序。每发生一个事件,系统的状态 较繁琐并且缺乏灵活性 ]。如果可以设计出一个“自定义 模块”,让用户可以在这个“自定义模块”中以键盘写入“if”、 “else”语句的方式方便的编写控制规则流,那么只使用一个 模块就可以实现多个单一模块组合的效果,甚至是实现单一 模块组合所无法达到的效果,并且在需要变更规则流时也非 常方便,只需要修改原有的…if’、“else”语句即可,这将给仿 真系统的建立、测试和维护都带来极大的便利。 在这种设想下,笔者开发了一个针对该平台的“规则引 就发生一次变化。在实际活动中,事件的发生不是连续的, 发生时问的间隔也不相等,而是具有某种随机性。 在离散事件仿真平台中,一般需要对工作流程的走向进 行控制,这种控制往往是基于…if’、“else”等语句构成的规则 流。传统的离散事件仿真平台,一般只能通过一些单一功能 的规则模块的组合来实现规则流控制 ],当规则流比较复杂 收稿13期:2009—05—11修回日期:2009—06—26 擎”程序,嵌入封装在原有的离散事件仿真平台中,实现了上 述的规则流自由写入,收到了较好的效果。“规则引擎”由 “解析器”和“转换器”两部分构成,其中“转换器”用来将用 户输人的规则流转换成“解析器”能够读懂的格式,而“解析 一311— 器”则用来分析和解释“转换器”转换过的规则流,两部分协 调工作从而使规则引擎能够接受用户外部输入的规则并且 将规则添加到离散事件仿真系统当中。 uation Engine编写输入,但是这样一种代码又必须符合Eval— uation Engine预定义的格式,不然的话Evaluation Engine无法 读懂,所以这样的输入在格式上又不同于通常代码的格式, 因而叫做“伪代码” “ ,如下所示为一段示例输入: a:=10; 2离散事件仿真平台 本文所介绍的离散事件仿真平台是宝钢自主研发的,以 b:=avg[3,4,5]; C: a+b; 宝钢的冶金物流仿真为背景的通用的离散事件仿真平台 。 该平台库采用C++编写,建立在对一般离散事件系统仿真 的共性进行抽象分析和建模的基础上,并结合了面向对象的 思想和方法,能应用于各种不同规模和复杂度的离散事件仿 iif[C>100,“approved”,“denied”] 将这段“伪代码”输入到Evaluation Engine自带的编辑 器中,就可以解析得到结果result=“denied”。可以看出,E- 真需求。通过该平台,仿真开发人员可以将主要精力集中于 仿真系统的分析建模和逻辑描述方面,不用花费大量时间编 写底层细节代码,从而较大程度上减少了仿真程序的编写和 测试维护工作,提高了工作效率。 该平台用户界面采用图形拖拽建模方式,内嵌离散仿真 计算引擎,封装了离散仿真程序设计的大部分通用特性和底 层代码,并预定义了一些最常使用的可视化功能模块,这些 模块功能相对,并且定义有模型逻辑连接接口,用户建 立仿真系统的主要工作就是按照动态实体的处理顺序,从工 具箱中拖拽出相应的模块,放置到仿真主界面上,并将各个 模块按照逻辑关系连接起来,即可搭建生成仿真系统。仿真 系统搭建完毕之后,可以运行查看整个仿真过程的动态演 示,以及仿真系统各个节点的相关仿真数据,如图1所示。 图1 离散事件仿真平台用户界面 3解析器Evaluation Engine Evaluation Engine是一款基于.NET平台的开源解析器, 它可以分析和解释程序外部输入的“伪代码”,并将结果与程 序内部的代码进行互动。 3.1伪代码输入 之所以称Evaluation Engine的外部输入为“伪代码”是 因为Evaluation Engine能够接受变量、常量、字符串等各种形 式的数据以及可以实现数学计算、布尔操作、赋值、引用函 数、注释等各种操作,因此用户可以像编写代码那样向Eval一 一3l2一 valuation Engine的输入在变量赋值、函数操作等方面都有其 预定义的格式,这样一种预定义的格式是为了使其功能同时 达到较好的广泛性和稳定性的情况下所不得不在其输入便 利性上做出的一些让步,也就是说,只有在对输入做必要的 的条件下,才能保证它所提供的广泛的功能能够安全稳 定地完成。 3.2 EvMuafion Engine的函数操作 Evaluation Engine有着较丰富的内置函数,比如数学函 数有:求平均值avg、求最大值NumericMax等;字符串函数 有:求字符串长度len、取子字符串SubString等;逻辑函数有: 条件函数 等。丰富的内置函数使得Evaluation Engine有 可能完成数算、字符串操作、逻辑判断等等众多的功能, 但是前面说过的输人格式的也制约了其功能的实现,因 此要想将Evaluation Engine应用到特定的项目当中,需要在 原有的源代码基础上进行扩展。对于本课题来说,希望通过 Evaluation Engine能够解析外部输入的“if”、“else”规则流, 规则流中要能够实现基于变量的布尔条件判断、规则嵌套以 及根据不同的判断结果实行不同的赋值操作,Evaluation En— igne本身无法实现所有这些功能,因此笔者在Evaluation En— gine和外部输入之间插入了一个规则流转换器,用来将用户 惯用的包含规则嵌套、判断赋值等功能的“if”、“else”格式的 规则流转换成Evaluation Engine能够接受的形式。 4规则流转换器Rule String Converter Rule Stirng Converter是针对Evaluation Engine在处理规 则流方面功能的不足而设计的一个功能补偿模块。由于E- valuation Engine的定位是一个基层的解析器,因此它提供了 数算、布尔运算、字符串操作等等广泛的功能,但是并没 有专注于某一个单一的功能,因此用户一般需要在其基础上 进行再开发。在本课题中,就是将Rule Stirng Converter结合 到Evaluation Engine中,共同构成规则引擎,从而较好的实现 了对规则流的处理。 4.1 Rule String Converter的工作原理 Rule Stirng Converter解决的主要问题是将Evaluation En— gine所不能处理的规则嵌套和判断赋值转换成Evaluation Engine可以处理的形式,而并不改变规则流本身的意义,也 就是说,改变了规则流的外貌,但是保持了其本质。其主要 工作原理如图2所示。 图2 Rule String Converter工作原理简图 如图2所示,输入的规则流被逐个字符的读入到暂存 区,在暂存区中识别并抽取出条件判断部分跟赋值操作部 分,分别存储到不同的两个区域,在此过程中,由记录器记录 暂存区中当前的嵌套位置,并将各个条件部分跟赋值部分的 嵌套位置信息添加到其对应的存储单元当中,最后将带有嵌 套信息的条件部分跟赋值部分以一定的顺序读取出来,并且 以一定的格式组合在一起,最终输出经转换后的规则流。 5将规则引擎应用到离散事件仿真平台 5.1自定义模块Custom的建立 由于该仿真平台本身就是采用基于模块的设计框架,所 以能够比较方便的向程序添加新的模块。平台的模块分为 视图层跟逻辑层两个层面,在视图层中设计好Custom模块 的外观之后,在逻辑层中再添加逻辑结构,即前面所介绍的 规则引擎即可,而不论是视图层还是逻辑层都有预先设计好 的基本框架,这种设计不但能够减少新建模块的代码编写 量,增加代码的复用率,而且能够使不同的模块的底层构架 保持一致,便于各种通用功能的实现。 当有事件到达Custom时,处理过程如下: 1)检查事件类型是“到达”还是“离开”。 2)若事件类型是“到达”,记录事件,转到7)。 3)若事件类型是“离开”,记录事件,转到4)。 4)根据外部写入的规则流文件激活规则引擎。 5)根据事件所携带的动态实体的属性,经规则引擎,获 得出口路径。 6)检查出口路径是否存在,若不存在,抛出异常;若存 在,转到7)。 7)结束,传递事件。 5.2实例分析 下面结合宝钢生产现场的一个应用实例来说明添加 Custom模块之后离散事件仿真平台的仿真效果。宝钢现有 一条新建成的自动化生产线,由于刚建成不久,现场操作理 论还未完备,经常需要面临原料产品属性发生变化等现场状 况改变所产生的问题,因此采用了前面介绍的嵌入规则引擎 的离散事件仿真平台来对生产系统进行仿真,这样当现场情 况发生变化的时候,可以不用重新搭建仿真系统,而只需要 对原仿真系统的规则流的实现部分进行少量改动就可以适 应变化,因此可以快速模拟现场情况的改变,从而实时的、迅 速的应对不同的现场状况,降低了生产风险,提高了生产 效率。 现在有一批产品(规则文件中用Prod指代)需要根据它 们的两种属性,即属性A和属性B(规则文件中用Prod.AttrA 和Prod.AttrB指代)的不同来决定其不同的走向(规则文件 中用Result指代),其中Prod.AttrA是字符串型的(取值范围 为{ConstStrA,ConstStrB}),Prod.AttrB是浮点型的(取值范 围为[0,1],在规则文件中某一浮点型常数ConstFhA [0, 1]),用离散事件仿真平台来仿真该物流过程,从而获得整个 物流过程的队列长度、等待时间等属性的一个总体的了解, 用来指导生产现场的资源分配。根据要求,可以编写规则流 文件如下: if(Prod.AttrA:”ConstStrA”) { if(Prod.AttrB<ConstFhA) Result=1; } else if(Prod.AttrB>=ConstFltA) { Result=2: } else if(Prod.AttrA=”ConstStrB”) { if(Prod.AttrB<ConstFhA) { Result=3; } else if(Prod.AttrB>=ConstFhA) { Result=4; } } 这一规则流文件虽然简单,但是却包含了判断、嵌套、赋 值等基本要素,而复杂的规则流都是以这些基本要素为基础 搭建起来的,所以这可以说是一个具体而微的例子。 在离散事件仿真平台图形界面上搭建好这个仿真系统 之后,将上述规则流文件写入Custom模块中,便可以运行并 观察物流过程了,如图3所示。 一31 3— | 鼍强强 簿毪豫|| 臻 B 乞矗.&一是 蠢 薯 骨爵 母 llJ 图3嵌入规则引擎之后的离散事件仿真平台 现假设现场的情况突然发生了改变,生产线上引进了一 批跟上述产品同一种类的另一批产品,这批产品的属性A, 即规则文件中的Prod.AttrA,不再是在ConstStrA,和Const. StrB中取值,而是取一新值,即ConstStrC,现场的要求是将这 一批Prod.AttrA为ConstStrC的产品单独安排一条新的走向。 可以想象,对于传统的由单一规则模块组合方式构成规则流 的离散事件仿真平台,如果现场情况突然发生了上述的改 变,那么将需要拆散原有的规则流部分的模块构架,将新的 因素添加进去之后再重新构架新的规则流模块系统,当整个 仿真系统比较庞大和复杂的时候,这种打破原有构架的修改 规则的方式有可能会带来不可预知的后果。 如果离散事件仿真平台的规则流的实现部分使用的是 本课题所介绍的基于规则引擎的自定义Custom模块,那么 适应前面所说的那样的规则的改变或添加将会变得非常简 单:只需要将Custom模块中的规则流文件进行少量的修改 或添加,然后将仿真系统中的其他相关部分做相应的调整即 可。对于前面所说的那个例子,只需要在原来的规则文件的 基础上添加几行新的规则,即 else if(Prod.AttrA=”ConstStrC”) { Result:5; } 添加之后的规则文件如下: if(Prod.AttrA=”ConstStrA”) { if(Prod.AttrB<ConstFltA) { Result=1; } else if(Prod.AttrB>=ConstFhA) { Result=2; } 一314一 e]se if(Prod.AttrA=”ConstStrB”) { if(Prod.AttrB<ConstFltA) { Result:3; } else if(Prod.AttrB>=ConstFhA) { Result=4; } } else if(Prod.AttrA=”ConstStrC”) { Result=5: } 然后再在仿真系统中为新属性的产品添加一条新的走 向,之后便可运行观察新系统的仿真过程,如图4所示。 图4 改变规则之后的仿真系统 由此可见,加入基于规则引擎的自定义Custom模块之 后,当需要改变规则的时候,只需要在原来的规则流文件上 面进行修改即可,特别是当需要添加规则的时候,只需要在 规则流文件中添加“伪代码”,而且可以方便的在规则流中的 任何嵌套位置进行添加。如果用单一规则模块的组合来实 现相同的功能,那么当修改规则特别是添加规则的时候,都 有可能需要拆毁原来的仿真系统结构并重新构架,特别是当 规则的嵌套层数较多的时候,处理起来就更加费时费力。如 果使用Custom模块,那么问题就简化多了,在处理大型的系 统仿真的时候,使用基于规则引擎的Custom模块的优势就 会更加突出。 6总结 本课题从离散系统仿真平台在实际应用中处理复杂规 则流时遇到的问题出发,将开源解析器Evaluation Engine结 合规则流转换器Rule Stirng Converter构成的规则引擎,封装 成的自定义Custom模块,添加到原来的离散系统仿真 平台当中,使得用户可以在仿真的过程当中以键盘输入的方 式方便快捷地编写、修改规则流,控制物流走向,收到了较好 的效果。这种将规则引擎嵌入到原来的软件以使原软件获 得处理外部输入规则的能力的做法,是一种较新的尝试,对 于其他跟规则相关的软件的设计有一定的借鉴意义。 参考文献: [1] Gilbert Chen,Boleslaw K Szymanki.COST:A Component Often- ted Discrete Event Simulator[c].In Proceedings of the 2002 Winter Simulation Conference,eds.E.Yucesan,C.H.Chen,J. [4] 严蔚敏,吴伟民.数据结构[M].北京:清华大学出版 社,1997. [5] Jon Bentley,黄倩,钱丽艳.编程珠玑[M].北京:人民邮电出 版社,2008. [作者简介】 罗钦扬(1984一),男(汉族),湖南衡阳人,上海交 通大学控制理论与控制工程专业硕士研究生,研究 方向为规则引擎,计划调度等。 杜斌(1957一),男(汉族),江西吉安人,教授级 高工,上海交通大学博士生导师,宝钢研究院自动 化所所长,研究方向为工业系统的建模与优化,大型连续离散混合型 工业生产计划优化及工业应用等。 L.SnowDon,and J.M.Chames,2002. [2] M C Little,D L McCue.Construction and use of a simulation package in C++[R].Technical Report,Department of Comput・ er Science,University of Newcastle upon Tyne,U.K. 朱俊(1982一),男(汉族),浙江临海人,宝钢研究院自动化所助 理研究员,研究方向为组合优化,离散事件仿真,计划调度。 秘慧杰(1985一),男(汉族),河北石家庄人,上海交通大学控制理 论与控制工程专业硕士研究生,研究方向为组合优化,智能算法,计 划调度。 [3]何骏,等.面向对象离散事件仿真平台的设计[J].计算机仿 真,2008,25(7):209—301. (上接第200页) 2)EG及一个进化周期的结束能自适应地调节。 参考文献: [1] M Garey,D Johnson.Computers and Intractability[M].w H Freeman,San Francisco,1979. [2]李敏强,等.遗传算法的基本理论与应用[M].北京:科学出 版社,2003. [3]杨辉,康立山,陈毓屏.一种基于构建基因库求解TSP问题的 遗传算法[J].计算机学报,2003,26(12):1753—1758. [4] 王斌,李元香,王治.一种求解TSP问题的单亲遗传算法[J]. 计算机科学,2003,30(5):73—74. [5]康立山,等.非数值并行算法(第一册):模拟退火算法[M]. 北京:科学出版社,1997. [6] G Reinelt.TSPLIB—A traveling salesman library[J].ORSA J. Comput,1991,3(4):376—384. [7]宋勇,陈贤富,戴蓓倩.弹性TSP及其并行遗传优化[J].小型 图3 ll574的路径图 微型计算机系统,2006,27(5):842—845 [8]蔡之华,等.一种改进的求解TSP问题的演化算法[J].计算 有效提高了遗传算法的效率。同时使用文中提出的组合算 机学报,2005,28(5):823—828. 子作为主要遗传作算子和采用具有进化周期性特点的算法 框架的PGA具有较高的求解质量,同时,对较大规模的城市 也具有较强的全局寻优能力。 [9] s H Lee.Greedy Randomized Adaptive Search Procedure for Tray— eling Salesman Problem[D].Texas A&M University,2006. 从实验可以看到,基于基因库的PGA算法如果除开群 体规模和算法的终止条件,则只使用了一个参数及一个进化 周期所进化的代数EG。改进的算法是所有的进化周期都固 定为相同的进化代数EG。对于本文的后继工作主要考虑以 下几点: 1)基因库一旦建立,就可以更新与保存,可以由此考虑 动态的TSP问题; 一 [教计刘授张算建,希硕。萍 玉士(研197究694生一),主女男作要(者汉研族简究)方介,山】向 东:遗省传滨济算州南法市、人智,助能教 ,博士生导师,主要研究方向:信息管理和管理信 息系统(MIS)的研究及开发。 一3l5一