邵叱風(fēng),方賢文,王吳松
(1.安徽理工大學(xué) 數(shù)學(xué)與大數(shù)據(jù)學(xué)院,安徽 淮南 232001; 2.安徽科技學(xué)院 信息與網(wǎng)絡(luò)工程學(xué)院,安徽 蚌埠 233030)
Petri Net[1]是常用系統(tǒng)建模語言之一,廣泛應(yīng)用于過程挖掘[1]、模型修復(fù)[3]、建模優(yōu)化[4]及算術(shù)計算[5]等諸多領(lǐng)域。Prom是一個過程挖掘相關(guān)插件平臺,可以利用XES[6]標準日志及挖掘算法生成結(jié)果,并利用Petri網(wǎng)等建模語言對挖掘結(jié)果進行可視化處理[7]。為了更好地測試和評估過程挖掘算法,需要人工生成的日志。文獻[8]提出了一種日志生成方法,可用于隨機生成多角度流程模型并進行仿真,以合成多角度事件日志。文獻[9]可以根據(jù)用戶定義的控制流規(guī)范隨機自動地生成過程樹和事件日志。它采用了一種通用的兩步方法:生成一個流程樹,然后將該樹仿真為事件日志,在文獻[10]中進行了描述。但通常需要生成日志解決的問題如:通過模擬所選過程模型來生成事件日志,然后對此日志應(yīng)用了新穎的過程發(fā)現(xiàn)算法,最后將發(fā)現(xiàn)的模型與初始模型進行比較發(fā)現(xiàn)了特殊結(jié)構(gòu)。但是在現(xiàn)實事件日志中,經(jīng)常缺少這樣的“特殊結(jié)構(gòu)”。因此,能夠以受控方式生成模型和日志很重要。文獻[11]提出了一種基于BPMN模型生成日志的方法,但目前Petri網(wǎng)與BPMN之前的轉(zhuǎn)換仍有諸多不便。在少量日志挖掘模型時,為提升挖掘能力,文獻[12]提出一種基于增強日志的過程挖掘方法,加強了算法對多屬性日志的依賴并提升對并發(fā)結(jié)構(gòu)的識別能力,但在重構(gòu)日志時較為復(fù)雜。在日志生成后可能存在一些與預(yù)期或模型有差距需修改的內(nèi)容,文獻[13]提出了一種基于神經(jīng)網(wǎng)絡(luò)的日志修復(fù)方法,在識別大量不同活動標簽效率表現(xiàn)一般。
本文利用增廣Petri網(wǎng)直接模擬系統(tǒng)運行并實現(xiàn)一種用于生成XES標準事件日志的具體方法,且通過直接修改多重集日志來降低生成預(yù)期日志的難度。
本節(jié)介紹了部分定義用以輔助理解日志生成工具中關(guān)于網(wǎng)的輸入、運行以及日志的導(dǎo)出。限于篇幅原因Petri網(wǎng)相關(guān)定義見文獻[1]。在此選用増廣Petri網(wǎng)作為建模語言,可在建模過程中以更簡潔的結(jié)構(gòu)便捷模擬現(xiàn)實條件。
定義1[1]帶抑制弧Petri網(wǎng):一個帶抑制弧的Petri網(wǎng)是一個五元組∑=(S,T,F,I,M), 其中, (S,T,F) 是一個網(wǎng),M是網(wǎng)的一個標識,I?S×T稱為抑制弧集,I∩F=Φ。
對于t∈T, 如果
則t在標識M有發(fā)生權(quán),記為M[t>。
若M[t>, 則變遷t在M可以發(fā)生,t在M發(fā)生產(chǎn)生新的標識M′
為增加PSLG(Petri simulation log generation)的實用性,利用輸入矩陣對網(wǎng)模型進行輸入。對如圖1所示的6種關(guān)系和庫所中的token數(shù)量均在輸入矩陣中進行了定義。
圖1 輸入矩陣中庫所與變遷的6種關(guān)系
定義2 輸入矩陣:一個輸入矩陣M是基于矩陣元素擴展生成的,元素Mij定義了庫所si與變遷tj的關(guān)系。最后一位數(shù)字代表兩個元素之間的流弧關(guān)系,其中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剔除最后一位數(shù)字即為當前關(guān)系庫所si中token的數(shù)量,一行元素token之和即當前系統(tǒng)si中token的數(shù)量,輸入矩陣及元素拓展如圖2所示。
圖2 輸入矩陣及元素擴展
如果λ(t)≠τ,t∈T, 那么t是可觀測的,反之t是靜默變遷。標簽的執(zhí)行語義是根據(jù)狀態(tài)和狀態(tài)轉(zhuǎn)換定義的。標簽網(wǎng)的狀態(tài)由標識的概念俘獲。
標簽網(wǎng)N=(P,T,F,λ) 的標識M一般表示Token到庫所的分配。如M(p) 分配Token在庫所p,p∈P。
PSLG含豐富的日志導(dǎo)出功能,支持定義7系統(tǒng)記錄、事件日志以及XES格式日志文件的導(dǎo)出,分別用作系統(tǒng)執(zhí)行過程的展示、多重集日志的展示以及Prom等工具的直接可用日志。
定義7 系統(tǒng)記錄、事件日志:跡是一個有限的標簽序列。系統(tǒng)記錄為跡的可重復(fù)記錄集,一個事件日志是一組跡上的多重集。假定跡上的每個標簽都代表一個事件,即一個活動的發(fā)生。此外假定標簽在跡中出現(xiàn)的順序表出了事件發(fā)生的順序,即j>i, 那么位于跡i處的標簽表示的事件發(fā)生在位于跡j處的標簽表示的事件之前。
為統(tǒng)一軟件的日志輸入格式,文獻[6]提出了XES格式日志文件,是XML語言的一種擴展。主要由分層組件(Hierarchicalcomponents)、屬性組件(Attributecomponent)、全局屬性(Globalattributes)、分類器(Classifiers)和擴展(Extensions)共5個部分構(gòu)成。
現(xiàn)有的日志生成方法大多是隨機生成的模型日志,大量的冗余數(shù)據(jù)導(dǎo)致事件結(jié)構(gòu)之間約束不可控;或者生成日志的方式較為繁瑣,需要學(xué)習(xí)新的編程語言。以上方法在日志生成時難以生成實驗需要的特定的滿足模型結(jié)構(gòu)的日志,并憑此去檢驗算法在某些行為模式上的識別能力。
在此提出對系統(tǒng)直接仿真生成指定條數(shù)的執(zhí)行跡,后期處理生成多重集事件日志及XES標準日志的方法。主要過程為:①系統(tǒng)建模;②推導(dǎo)輸入矩陣;③初始化輸入模型;④手動或隨機執(zhí)行模型過程;⑤統(tǒng)計執(zhí)行記錄生成事件日志;⑥XES標準日志的轉(zhuǎn)換。其中系統(tǒng)建模部分即利用増廣Petri網(wǎng)對現(xiàn)有系統(tǒng)進行模擬,在此不做贅述。
對于大規(guī)模負載程序的開發(fā),程序的處理流程并非單一的一條主線,而是錯綜負載的網(wǎng)狀結(jié)構(gòu)。面向?qū)ο缶幊瘫绕鹈嫦蜻^程編程更能夠應(yīng)對復(fù)雜類型的程序開發(fā);面向?qū)ο缶幊虛碛懈迂S富的特性(封裝、繼承、抽象和多態(tài)),利用這些特性可以使得代碼更加易擴展,易維護,易復(fù)用。下面給出具體Java應(yīng)用實現(xiàn)日志生成方法的過程。
為了便捷化輸入Petri網(wǎng)模型,Java應(yīng)用采用定義2形式的輸入矩陣進行模型輸入。如圖3所示利用split(“ ”)分割矩陣得m條字符串(即網(wǎng)包含m個庫所s1,s2,…sm), 每條字符串split(“,”) 可獲得n個元素(即網(wǎng)包含n個變遷t1,t2,…,tn), 第i條字符串第j個元素為庫所si與變遷tj的關(guān)系描述,結(jié)合for循環(huán)利用定義1計算模型中弧的個數(shù),初始化變遷、庫所及弧的數(shù)組,并依據(jù)矩陣元素關(guān)聯(lián)庫所和變遷,得到初始化Petri網(wǎng)模型。抑制弧、庫所流向變遷及變遷流向庫所的關(guān)聯(lián)代碼如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網(wǎng)的原理
為保證流程執(zhí)行的隨機性,定義AutoRun()方法,使用ArrayList
(1)for (intj=1;j (2) intfireState=1; (3) intlogLength=0; (4) while (fireState>0) { (5) ArrayList 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為標識可觸發(fā)變遷的個數(shù),logLength為統(tǒng)計每條執(zhí)行記錄的長度。定義canFirestate=1,進入while循環(huán),初始化可觸發(fā)變遷緩存數(shù)組waitRun,標記當前可觸發(fā)變遷個數(shù)為0。Code_2(7-12)對網(wǎng)中變遷進行遍歷,方法canFire()判斷變遷能否觸發(fā),如果可以數(shù)組waitRun記錄下可觸發(fā)變遷且fireState=fireState+1,Code_2(13-19)如果waitRun含有可觸發(fā)變遷,利用Math.random()*max在數(shù)組大小范圍內(nèi)生成隨機數(shù),觸數(shù)組中對應(yīng)下標的元素所含變遷,到達下一可達狀態(tài),循環(huán)至終態(tài)即遍歷網(wǎng)中變遷無一可觸發(fā),fireState=0結(jié)束循環(huán)。 為統(tǒng)計網(wǎng)運行記錄庫中每條記錄出現(xiàn)頻次,增加了普通的事件記錄轉(zhuǎn)為多重集日志的功能。編寫工具類String-SameCount,利用HashMap (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定義了一個日志跡計數(shù)的功能,通過統(tǒng)計網(wǎng)運行記錄,map記錄每條執(zhí)行跡的執(zhí)行次數(shù),生成一個跡上的多重集事件日志。Code_3(8-13)判斷當前map中是否含有當前字符串ri(執(zhí)行記錄),如果有則對此key=ri對應(yīng)的value值進行加1(即增加一次執(zhí)行次數(shù)),如果沒有則新增key=ri,value=1(即新增一種執(zhí)行跡,并記執(zhí)行次數(shù)為1)。 Prom是一個過程挖掘插件平臺,XES為該平臺日志支持標準。為減少日志后期處理,增加導(dǎo)出日志的可用性,增加了XES標準日志導(dǎo)出功能。主要是遍歷系統(tǒng)執(zhí)行記錄,將每條執(zhí)行記錄記為一個Trace,記錄中的事件記為一個Event,并對key=”concept:name”、key=”time:timestamp” 進行賦值,再與文件的頭文件進行拼接,生成XES格式日志。具體實現(xiàn)代碼如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");// 設(shè)置日期格式 (10) SimpleDateFormatLdf=new SimpleDateFormat("HH:mm:ss");// 設(shè)置日期格式 (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格式日志結(jié)尾 (17) returnfile; (18)} Code_4中,txtLog為系統(tǒng)運行記錄,logName為日志導(dǎo)出時文件的名稱,headOfFile為XES標準日志拼裝時的頭部文件(可自定義)。Code_4(3)按行分割系統(tǒng)運行記錄,獲得記錄列表;Code_4(4-15)為日志中層信息的拼裝,其中Code_4(12)完成中層信息內(nèi)部event的拼裝,通過遍歷運行記錄中的活動,完成事件名稱及執(zhí)行時間的賦值,Code_4(14)補全 標簽; Code_4(16)補全 標簽。 為調(diào)節(jié)網(wǎng)中部分變遷的發(fā)生頻率、屏蔽部分運行路徑、增加日志噪音等,通過編輯定義7形式多重集日志的方式進行實現(xiàn)。對于記錄 (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組裝源數(shù)據(jù),數(shù)字47代表此條跡的執(zhí)行次數(shù)即在日志中的條數(shù)。依據(jù)輸入矩陣創(chuàng)建日志界面如圖5(a)所示,多重集日志轉(zhuǎn)XES日志界面如圖5(b)所示。 圖5 方法實現(xiàn)的界面截圖 PSLG實現(xiàn)日志生成方法,主要是對系統(tǒng)進行建模,直接仿真模型運行,記錄網(wǎng)的運行情況,并通過工具類OperationOfLog.java、StringSameCount.java對之進行處理生成多重集事件日志及XES標準日志,并支持多重集日志直接轉(zhuǎn)換為XES標準日志。相較于PIPE、CPNTools和Tina等工具,PSLG更注重于模型信息及執(zhí)行結(jié)果的展示,表1給出了輸入方式、模型數(shù)據(jù)、記錄生成和結(jié)果導(dǎo)出共4個方面對比結(jié)果。 表1 工具的多方面對比 為檢驗方法的效率及有效性,基于BPIC2020數(shù)據(jù)中的Domestic Declarations.xes和Request For Payment.xes兩個日志文件,使用Prom平臺中的Mine with Inductive visual Miner S.J.J.Leemans插件挖掘得到如圖6所示Petri模型,轉(zhuǎn)換為輸入矩陣如下所示。 圖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工具為這兩個模型各生成執(zhí)行記錄10 000條;同時構(gòu)造一個變遷個數(shù)為60的直鏈網(wǎng)模型(保證每條執(zhí)行跡長度相等),并為其生成執(zhí)行記錄1000條。利用以上數(shù)據(jù)對工具的效率進行分析,并對其穩(wěn)定性、可移植性以及日志的有效性等進行實驗分析。所有的測試均在配有I5-7300HQ 2.5 Ghz四核處理器和16 GB內(nèi)存的機器上進行,使用Java SE 1.7開發(fā)包。 為檢驗工具運行穩(wěn)定性,在執(zhí)行直鏈模型時,記錄下變遷觸發(fā)時間,對大小為60×1000的時間數(shù)據(jù)繪制如圖7所示。其中變遷觸發(fā)時間大多在100 ns~1000 ns之間,保持較高的變遷觸發(fā)穩(wěn)定性。 圖7 變遷觸發(fā)時間展示(60×1000) 圖8 不同跡的觸發(fā)時間 圖9 不同日志大小的生成時間 為驗證日志有效性,首先利用日志挖掘出Petri網(wǎng)模型與原模型對比,對于BPIC模型生成的事件日志,再次使用Prom中Mine with Inductive visual Miner S.J.J.Leemans插件,以消除不同算法對挖掘結(jié)果的影響。將BPIC的兩個生成日志導(dǎo)入Prom挖掘結(jié)果與原模型保持一致。 圖10 隨日志大小變化的精度和適應(yīng)度 鑒于日志大小在100時precision已達到1,僅對前100條跡組成的日志進行時間分析如圖11所示,前100條跡長度各不相同,生成時間在一定范圍內(nèi)對應(yīng)變化(圖11(a)),日志生成耗時與日志大小成正比(圖11(b))。 圖11 前100條跡組成日志的時間分析 PSLG是對現(xiàn)有模型進行日志生成,但日志中跡的執(zhí)行次數(shù)、不同事件發(fā)生頻次具有一定隨機性,對于模型生成日志的修改有以下3種方案: (1)可通過修改輸入矩陣即可修改(直接修改了用于日志生成的模型,執(zhí)行次數(shù)、頻次仍不可控); (2)對于已生成的XES日志可通過直接修改XES文件(文件結(jié)構(gòu)復(fù)雜,且體積一般較大); (3)對于已生成的多重集日志可通過改變序列及執(zhí)行次數(shù),再利用圖5(b)所示插件轉(zhuǎn)為XES日志(不同執(zhí)行序列是有限的,變遷增刪便捷,序列發(fā)生次數(shù)易修改)。 對于Domestic Declarations模型的運行記錄(100條發(fā)生序列),分別刪除變遷t6,t10,t15,t20, 導(dǎo)入Prom利用Alpha插件挖掘結(jié)果如圖12所示,利用方法(3)調(diào)節(jié)日志是可行的。 本文提出一種對現(xiàn)有系統(tǒng)生成受控日志的方法,使用増廣Petri對現(xiàn)有系統(tǒng)進行建模,便于盡可能滿足真實系統(tǒng)運行條件。PSLG利用矩陣輸入的方式輸入Petri網(wǎng)模型,在主界面展示了網(wǎng)的一些屬性值用以確認模型輸入的正確性;通過隨機觸發(fā)可發(fā)生變遷達到下一可達狀態(tài)并記錄觸發(fā)過程,重復(fù)模擬n次網(wǎng)的完整運行以生成大小為n條的系統(tǒng)運行記錄;利用Hash Map對系統(tǒng)運行記錄進行分類統(tǒng)計生成多重集日志;遍歷系統(tǒng)運行記錄,通過嵌套循環(huán)拼裝的方式生成XES標準日志,并以此為模板增加了多重集日志轉(zhuǎn)為XES標準日志的方法;最后的實驗驗證了實現(xiàn)插件PSLG的可行性、穩(wěn)定性、日志的有效性及可編輯性。 圖12 修改后日志的Alpha挖掘結(jié)果 通過PSLG生成日志,為過程挖掘、模型修復(fù)等諸多依賴于日志的算法驗證及評估提供了有效助力。未來工作包括使用更多建模語言作為輸入,豐富日志中的屬性,增加日志導(dǎo)出格式,高頻行為的可控觸發(fā)以及基于受控日志的過程挖掘、一致性檢驗等算法的研究。2.3 多重集日志
2.4 XES標準日志
3 實驗評估
3.1 耗時分析
3.2 日志有效性
3.3 編輯有效性
4 結(jié)束語