APP下载

基于増广Petri网生成受控日志

2022-03-21邵叱风方贤文王吴松

计算机工程与设计 2022年3期
关键词:库所日志变迁

邵叱风,方贤文,王吴松

(1.安徽理工大学 数学与大数据学院,安徽 淮南 232001; 2.安徽科技学院 信息与网络工程学院,安徽 蚌埠 233030)

0 引 言

Petri Net[1]是常用系统建模语言之一,广泛应用于过程挖掘[1]、模型修复[3]、建模优化[4]及算术计算[5]等诸多领域。Prom是一个过程挖掘相关插件平台,可以利用XES[6]标准日志及挖掘算法生成结果,并利用Petri网等建模语言对挖掘结果进行可视化处理[7]。为了更好地测试和评估过程挖掘算法,需要人工生成的日志。文献[8]提出了一种日志生成方法,可用于随机生成多角度流程模型并进行仿真,以合成多角度事件日志。文献[9]可以根据用户定义的控制流规范随机自动地生成过程树和事件日志。它采用了一种通用的两步方法:生成一个流程树,然后将该树仿真为事件日志,在文献[10]中进行了描述。但通常需要生成日志解决的问题如:通过模拟所选过程模型来生成事件日志,然后对此日志应用了新颖的过程发现算法,最后将发现的模型与初始模型进行比较发现了特殊结构。但是在现实事件日志中,经常缺少这样的“特殊结构”。因此,能够以受控方式生成模型和日志很重要。文献[11]提出了一种基于BPMN模型生成日志的方法,但目前Petri网与BPMN之前的转换仍有诸多不便。在少量日志挖掘模型时,为提升挖掘能力,文献[12]提出一种基于增强日志的过程挖掘方法,加强了算法对多属性日志的依赖并提升对并发结构的识别能力,但在重构日志时较为复杂。在日志生成后可能存在一些与预期或模型有差距需修改的内容,文献[13]提出了一种基于神经网络的日志修复方法,在识别大量不同活动标签效率表现一般。

本文利用增广Petri网直接模拟系统运行并实现一种用于生成XES标准事件日志的具体方法,且通过直接修改多重集日志来降低生成预期日志的难度。

1 准备知识

本节介绍了部分定义用以辅助理解日志生成工具中关于网的输入、运行以及日志的导出。限于篇幅原因Petri网相关定义见文献[1]。在此选用増广Petri网作为建模语言,可在建模过程中以更简洁的结构便捷模拟现实条件。

定义1[1]带抑制弧Petri网:一个带抑制弧的Petri网是一个五元组∑=(S,T,F,I,M), 其中, (S,T,F) 是一个网,M是网的一个标识,I⊂S×T称为抑制弧集,I∩F=Φ。

对于t∈T, 如果

则t在标识M有发生权,记为M[t>。

若M[t>, 则变迁t在M可以发生,t在M发生产生新的标识M′

为增加PSLG(Petri simulation log generation)的实用性,利用输入矩阵对网模型进行输入。对如图1所示的6种关系和库所中的token数量均在输入矩阵中进行了定义。

图1 输入矩阵中库所与变迁的6种关系

定义2 输入矩阵:一个输入矩阵M是基于矩阵元素扩展生成的,元素Mij定义了库所si与变迁tj的关系。最后一位数字代表两个元素之间的流弧关系,其中0-5分别表示NULL、arc(s,t)、arc(t,s)、arc(s,t) 和arc(t,s)、inhibit(s,t)、inhibit(s,t) 和arc(t,s), 元素Mij剔除最后一位数字即为当前关系库所si中token的数量,一行元素token之和即当前系统si中token的数量,输入矩阵及元素拓展如图2所示。

图2 输入矩阵及元素扩展

如果λ(t)≠τ,t∈T, 那么t是可观测的,反之t是静默变迁。标签的执行语义是根据状态和状态转换定义的。标签网的状态由标识的概念俘获。

标签网N=(P,T,F,λ) 的标识M一般表示Token到库所的分配。如M(p) 分配Token在库所p,p∈P。

PSLG含丰富的日志导出功能,支持定义7系统记录、事件日志以及XES格式日志文件的导出,分别用作系统执行过程的展示、多重集日志的展示以及Prom等工具的直接可用日志。

定义7 系统记录、事件日志:迹是一个有限的标签序列。系统记录为迹的可重复记录集,一个事件日志是一组迹上的多重集。假定迹上的每个标签都代表一个事件,即一个活动的发生。此外假定标签在迹中出现的顺序表出了事件发生的顺序,即j>i, 那么位于迹i处的标签表示的事件发生在位于迹j处的标签表示的事件之前。

系统记录形如:R1=[,,,];

事件日志形如:L1=[10,7,5]。

为统一软件的日志输入格式,文献[6]提出了XES格式日志文件,是XML语言的一种扩展。主要由分层组件(Hierarchicalcomponents)、属性组件(Attributecomponent)、全局属性(Globalattributes)、分类器(Classifiers)和扩展(Extensions)共5个部分构成。

2 日志生成方法及实现

现有的日志生成方法大多是随机生成的模型日志,大量的冗余数据导致事件结构之间约束不可控;或者生成日志的方式较为繁琐,需要学习新的编程语言。以上方法在日志生成时难以生成实验需要的特定的满足模型结构的日志,并凭此去检验算法在某些行为模式上的识别能力。

在此提出对系统直接仿真生成指定条数的执行迹,后期处理生成多重集事件日志及XES标准日志的方法。主要过程为:①系统建模;②推导输入矩阵;③初始化输入模型;④手动或随机执行模型过程;⑤统计执行记录生成事件日志;⑥XES标准日志的转换。其中系统建模部分即利用増广Petri网对现有系统进行模拟,在此不做赘述。

对于大规模负载程序的开发,程序的处理流程并非单一的一条主线,而是错综负载的网状结构。面向对象编程比起面向过程编程更能够应对复杂类型的程序开发;面向对象编程拥有更加丰富的特性(封装、继承、抽象和多态),利用这些特性可以使得代码更加易扩展,易维护,易复用。下面给出具体Java应用实现日志生成方法的过程。

2.1 输入矩阵

为了便捷化输入Petri网模型,Java应用采用定义2形式的输入矩阵进行模型输入。如图3所示利用split(“ ”)分割矩阵得m条字符串(即网包含m个库所s1,s2,…sm), 每条字符串split(“,”) 可获得n个元素(即网包含n个变迁t1,t2,…,tn), 第i条字符串第j个元素为库所si与变迁tj的关系描述,结合for循环利用定义1计算模型中弧的个数,初始化变迁、库所及弧的数组,并依据矩阵元素关联库所和变迁,得到初始化Petri网模型。抑制弧、库所流向变迁及变迁流向库所的关联代码如Code_1所示。

aArray[z][total]=pnlist[z].inhibitor("arc"+total,pArray[i],tArray[l]);//添加库所到变迁的抑制弧

aArray[z][total]=pnlist[z].arc("arc"+total,pArray[i],tArray[l]);//添加库所到变迁的流弧

aArray[z][total]=pnlist[z].arc("arc"+total,tArray[l],pArray[i]);//添加变迁到库所的流弧

图3 利用输入矩阵初始化Petri网的原理

2.2 网的运行

为保证流程执行的随机性,定义AutoRun()方法,使用ArrayList记录下Petri网当前状态所有具备触发条件的变迁,Math.random()在数组大小范围内生成随机数k, 触发数组中下标为k的元素包含的变迁后进入下一个可达状态,并对触发的变迁进行记录,如此循环直到当前状态中无可触发变迁。具体实现的部分代码如Code_2所示:

(1)for (intj=1;j

(2) intfireState=1;

(3) intlogLength=0;

(4) while (fireState>0) {

(5) ArrayListwaitRun=new

ArrayList();

(6)fireState=0;

(7) for (inti=0;i

size();i++) {

(8) if (pnlist[j].getTransitions().get(i).canFire()) {

(9)waitRun.add(pnlist[j].getTransitions().get(i));

(10)fireState++;

(11) }

(12) }

(13) if (waitRun.size()>0) {

(14) intmax=waitRun.size();

(15) intranNum=(int) (Math.random() *max);

(16)waitRun.get(ranNum).fire();

(17)logArea.append(waitRun.get(ranNum).get Name() + ",");

(18)logLength++;

(19) }

(20) }

(21)}

fireState为标识可触发变迁的个数,logLength为统计每条执行记录的长度。定义canFirestate=1,进入while循环,初始化可触发变迁缓存数组waitRun,标记当前可触发变迁个数为0。Code_2(7-12)对网中变迁进行遍历,方法canFire()判断变迁能否触发,如果可以数组waitRun记录下可触发变迁且fireState=fireState+1,Code_2(13-19)如果waitRun含有可触发变迁,利用Math.random()*max在数组大小范围内生成随机数,触数组中对应下标的元素所含变迁,到达下一可达状态,循环至终态即遍历网中变迁无一可触发,fireState=0结束循环。

2.3 多重集日志

为统计网运行记录库中每条记录出现频次,增加了普通的事件记录转为多重集日志的功能。编写工具类String-SameCount,利用HashMap 对事件记录进行统计,利用 判断是否包含此条记录,如果有则计数增加,如果没有增加此条记录(如图4所示)。具体实现代码如Code_3所示。

(1)public class StringSameCount {

(2) private HashMapmap;

(3) private intcounter;

(4) public StringSameCount() {

(5)map= new HashMap();

(6) }

(7) public void hashInsert(Stringstring) {

(8) if (map.containsKey(string)) {

(9)counter= (Integer)map.get(string);

(10)map.put(string, ++counter);

(11) } else {

(12)map.put(string, 1);

(13) }

(14) }

(15) public HashMap getHashMap() {

(16) returnmap;

(17) }

(18)}

Code_3定义了一个日志迹计数的功能,通过统计网运行记录,map记录每条执行迹的执行次数,生成一个迹上的多重集事件日志。Code_3(8-13)判断当前map中是否含有当前字符串ri(执行记录),如果有则对此key=ri对应的value值进行加1(即增加一次执行次数),如果没有则新增key=ri,value=1(即新增一种执行迹,并记执行次数为1)。

2.4 XES标准日志

Prom是一个过程挖掘插件平台,XES为该平台日志支持标准。为减少日志后期处理,增加导出日志的可用性,增加了XES标准日志导出功能。主要是遍历系统执行记录,将每条执行记录记为一个Trace,记录中的事件记为一个Event,并对key=”concept:name”、key=”time:timestamp” 进行赋值,再与文件的头文件进行拼接,生成XES格式日志。具体实现代码如Code_4所示:

(1)public static String pLog(StringtxtLog, StringlogName) {

(2) Stringfile=headerOfFile;// XES格式日志头文件

(3) String[]Ilist=txtLog.split(" ");

(4) for (inti=0;i

(5)file=file+" ";

(6)caseID++;

(7) String[]splitLog=Ilist[i].split(",");

(8) for (intj=0;j

(9) SimpleDateFormatPdf=new SimpleDateFormat("yyyy-MM-dd");// 设置日期格式

(10) SimpleDateFormatLdf=new SimpleDateFormat("HH:mm:ss");// 设置日期格式

(11) intx=1+(int) (Math.random() * 1000);

(12)file=file+" "

+"

+Pdf.format(new Date())+"T"

+ " "

+ "

+"=”complete”/> "

+ " ";

(13) }

(14)file=file+" ";

(15) }

(16)file=file+"";// XES格式日志结尾

(17) returnfile;

(18)}

Code_4中,txtLog为系统运行记录,logName为日志导出时文件的名称,headOfFile为XES标准日志拼装时的头部文件(可自定义)。Code_4(3)按行分割系统运行记录,获得记录列表;Code_4(4-15)为日志中层信息的拼装,其中Code_4(12)完成中层信息内部event的拼装,通过遍历运行记录中的活动,完成事件名称及执行时间的赋值,Code_4(14)补全 标签; Code_4(16)补全 标签。

为调节网中部分变迁的发生频率、屏蔽部分运行路径、增加日志噪音等,通过编辑定义7形式多重集日志的方式进行实现。对于记录 (t0,t1,t3,t2,t5,t6,t8,t9,t11,t13,t14;47;),t0,t1,t3,t2,t5,t6,t8,t9,t11,t13,t14; 用作XES日志event组装源数据,数字47代表此条迹的执行次数即在日志中的条数。依据输入矩阵创建日志界面如图5(a)所示,多重集日志转XES日志界面如图5(b)所示。

图5 方法实现的界面截图

3 实验评估

PSLG实现日志生成方法,主要是对系统进行建模,直接仿真模型运行,记录网的运行情况,并通过工具类OperationOfLog.java、StringSameCount.java对之进行处理生成多重集事件日志及XES标准日志,并支持多重集日志直接转换为XES标准日志。相较于PIPE、CPNTools和Tina等工具,PSLG更注重于模型信息及执行结果的展示,表1给出了输入方式、模型数据、记录生成和结果导出共4个方面对比结果。

表1 工具的多方面对比

为检验方法的效率及有效性,基于BPIC2020数据中的Domestic Declarations.xes和Request For Payment.xes两个日志文件,使用Prom平台中的Mine with Inductive visual Miner S.J.J.Leemans插件挖掘得到如图6所示Petri模型,转换为输入矩阵如下所示。

图6 Domestic Declarations流程模型(左)与Request For Payment流程模型(右)

inputmatrixofDomesticDeclarations11,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 02,02,01,01,01,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,02,02,02,02,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,02,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,02,00,00,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,02,02,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,02,02,01,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,02,01,01,01,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,02,01,00,00,00,00,00,00,00,00 00,00,00,00,00,00,02,00,00,00,00,00,00,00,00,00,02,01,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,01,01,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,01,01,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,02,01,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,01,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,01 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02

inputmatrixofRequestForPayment11,01,00,00,00,01,00,00,01,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 02,00,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,02,02,02,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,02,02,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,02,02,02,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,02,02,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,02,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,02,02,01,01,00,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,01,00,00,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,01,00,00,00,01,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,01,00,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,01,00,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,00,01,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,01,00,00,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,01,00,00,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,01,01,00,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,01,00,00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,01,01,01 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,02,02,02

利用PSLG工具为这两个模型各生成执行记录10 000条;同时构造一个变迁个数为60的直链网模型(保证每条执行迹长度相等),并为其生成执行记录1000条。利用以上数据对工具的效率进行分析,并对其稳定性、可移植性以及日志的有效性等进行实验分析。所有的测试均在配有I5-7300HQ 2.5 Ghz四核处理器和16 GB内存的机器上进行,使用Java SE 1.7开发包。

3.1 耗时分析

为检验工具运行稳定性,在执行直链模型时,记录下变迁触发时间,对大小为60×1000的时间数据绘制如图7所示。其中变迁触发时间大多在100 ns~1000 ns之间,保持较高的变迁触发稳定性。

图7 变迁触发时间展示(60×1000)

图8 不同迹的触发时间

图9 不同日志大小的生成时间

3.2 日志有效性

为验证日志有效性,首先利用日志挖掘出Petri网模型与原模型对比,对于BPIC模型生成的事件日志,再次使用Prom中Mine with Inductive visual Miner S.J.J.Leemans插件,以消除不同算法对挖掘结果的影响。将BPIC的两个生成日志导入Prom挖掘结果与原模型保持一致。

图10 随日志大小变化的精度和适应度

鉴于日志大小在100时precision已达到1,仅对前100条迹组成的日志进行时间分析如图11所示,前100条迹长度各不相同,生成时间在一定范围内对应变化(图11(a)),日志生成耗时与日志大小成正比(图11(b))。

图11 前100条迹组成日志的时间分析

3.3 编辑有效性

PSLG是对现有模型进行日志生成,但日志中迹的执行次数、不同事件发生频次具有一定随机性,对于模型生成日志的修改有以下3种方案:

(1)可通过修改输入矩阵即可修改(直接修改了用于日志生成的模型,执行次数、频次仍不可控);

(2)对于已生成的XES日志可通过直接修改XES文件(文件结构复杂,且体积一般较大);

(3)对于已生成的多重集日志可通过改变序列及执行次数,再利用图5(b)所示插件转为XES日志(不同执行序列是有限的,变迁增删便捷,序列发生次数易修改)。

对于Domestic Declarations模型的运行记录(100条发生序列),分别删除变迁t6,t10,t15,t20, 导入Prom利用Alpha插件挖掘结果如图12所示,利用方法(3)调节日志是可行的。

4 结束语

本文提出一种对现有系统生成受控日志的方法,使用増广Petri对现有系统进行建模,便于尽可能满足真实系统运行条件。PSLG利用矩阵输入的方式输入Petri网模型,在主界面展示了网的一些属性值用以确认模型输入的正确性;通过随机触发可发生变迁达到下一可达状态并记录触发过程,重复模拟n次网的完整运行以生成大小为n条的系统运行记录;利用Hash Map对系统运行记录进行分类统计生成多重集日志;遍历系统运行记录,通过嵌套循环拼装的方式生成XES标准日志,并以此为模板增加了多重集日志转为XES标准日志的方法;最后的实验验证了实现插件PSLG的可行性、稳定性、日志的有效性及可编辑性。

图12 修改后日志的Alpha挖掘结果

通过PSLG生成日志,为过程挖掘、模型修复等诸多依赖于日志的算法验证及评估提供了有效助力。未来工作包括使用更多建模语言作为输入,丰富日志中的属性,增加日志导出格式,高频行为的可控触发以及基于受控日志的过程挖掘、一致性检验等算法的研究。

猜你喜欢

库所日志变迁
一名老党员的工作日志
小渔村的变迁
基于Delphi-模糊Petri 网的航空发动机故障诊断
基于Petri网的单元控制系统及编程研究
扶贫日志
运动想象脑机接口系统的Petri网建模方法
回乡之旅:讲述世界各地唐人街的变迁
雅皮的心情日志
雅皮的心情日志
一纸婚书见变迁