劉健++房志奇++康衛(wèi)
摘 要:規(guī)則引擎是業(yè)務(wù)規(guī)則管理系統(tǒng)的核心環(huán)節(jié),它通過模式匹配器實(shí)現(xiàn)事實(shí)庫與規(guī)則庫的快速匹配,因此,一個(gè)準(zhǔn)確高效的模式匹配器決定了這個(gè)規(guī)則引擎的整體性能。將規(guī)則引擎應(yīng)用在工業(yè)防危系統(tǒng)中,同時(shí)利用位圖矩陣算法對(duì)規(guī)則引擎的模式匹配器進(jìn)行優(yōu)化,從而使得規(guī)則引擎準(zhǔn)確高效的工作。實(shí)驗(yàn)結(jié)果表明在相同條件下,位圖矩陣算法相對(duì)于直接匹配的方法效率平均提高了88.04%。
關(guān)鍵詞:工業(yè)防危系統(tǒng);規(guī)則引擎;模式匹配器;位圖矩陣
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):2095-1302(2015)05-00-03
0 引 言
隨著工業(yè)化水平的不斷提高,控制技術(shù)難度逐漸增加,工業(yè)生產(chǎn)系統(tǒng)變得越來越復(fù)雜,一旦發(fā)生工業(yè)生產(chǎn)安全事故,將會(huì)造成極其嚴(yán)重的后果。因此,近年來工業(yè)生產(chǎn)過程中的安全問題受到了廣泛關(guān)注。為了降低企業(yè)生產(chǎn)過程中的安全隱患,減少企業(yè)安全事故的發(fā)生,防危系統(tǒng)被應(yīng)用在電力、水利、核工業(yè)、石化、冶煉等領(lǐng)域。
目前大多數(shù)學(xué)術(shù)和工業(yè)都是針對(duì)如何提高規(guī)則引擎的匹配效率進(jìn)行研究。Rete算法是一種用于產(chǎn)生式系統(tǒng)的高效模式匹配算法,通過在內(nèi)存中建立一個(gè)Rete網(wǎng)絡(luò),以空間換取時(shí)間,充分共享匹配結(jié)果,從而實(shí)現(xiàn)高效匹配[1]。Drools是采用JAVA實(shí)現(xiàn)的一種基于Rete算法的面向?qū)ο蟮囊?guī)則引擎,同時(shí)利用XML的Conditons→Consequence節(jié)點(diǎn)表達(dá)If-Then句式[2]。在本文的研究中也是采用XML文件來存儲(chǔ)If-Then形式的專家規(guī)則。龐偉正等人[3]在Rete算法、Rete-OO算法的基礎(chǔ)上提出了一種改進(jìn)的 Rete網(wǎng)絡(luò)結(jié)構(gòu), 并對(duì)運(yùn)用此 Rete 網(wǎng)絡(luò)來執(zhí)行推理任務(wù)的過程進(jìn)行了優(yōu)化,明顯提高了匹配效率。
本文將規(guī)則引擎應(yīng)用在工業(yè)防危系統(tǒng)(例如,石灰石鍛燒系統(tǒng))中,它的工作效率對(duì)這個(gè)系統(tǒng)的整體性能起到了至關(guān)重要的作用。因此,我們的工作重點(diǎn)是優(yōu)化匹配算法,在保證匹配準(zhǔn)確率的前提下,最大限度的提高規(guī)則引擎的匹配效率。
1 規(guī)則引擎介紹
規(guī)則引擎的主要功能是實(shí)現(xiàn)事實(shí)庫與規(guī)則集的匹配,然后執(zhí)行那些由當(dāng)前數(shù)據(jù)對(duì)象激活的專家規(guī)則。規(guī)則引擎的結(jié)構(gòu)圖如圖1所示。它主要包括規(guī)則集容器、工作存儲(chǔ)器、模式匹配器和執(zhí)行器[4]。數(shù)據(jù)采集模塊能夠得到對(duì)象的數(shù)據(jù)值,根據(jù)數(shù)據(jù)值通過條件庫模塊獲得對(duì)象所對(duì)應(yīng)的狀態(tài),將“對(duì)象→狀態(tài)”加載到工作存儲(chǔ)器。
圖1 規(guī)則引擎結(jié)構(gòu)圖
2 規(guī)則引擎功能模塊
由于匹配器的性能決定著規(guī)則引擎的整體性能,我們的研究主要是針對(duì)匹配器性能的優(yōu)化,因此需要詳細(xì)介紹匹配器的設(shè)計(jì)原理、工作模式等。
2.1 工作存儲(chǔ)器
工作存儲(chǔ)器存儲(chǔ)當(dāng)前系統(tǒng)中的事實(shí)庫,每條事實(shí)由對(duì)象名和狀態(tài)構(gòu)成,每條事實(shí)能夠?yàn)槟J狡ヅ淦魈峁┢ヅ錀l件。同時(shí),工作存儲(chǔ)由條件庫模塊以及數(shù)據(jù)采集模塊支撐。如圖2所示,為了簡單處理,在我們仿真系統(tǒng)中共設(shè)置a-f 6個(gè)對(duì)象,它們分為開關(guān)量和模擬量:如果是開關(guān)量,那么采集的數(shù)值只有0(關(guān)閉)和1(開啟);如果是模擬量,它們的值分布在0~800之間,如果超過這個(gè)范圍系統(tǒng)會(huì)給出警告。然后把對(duì)象名和數(shù)據(jù)傳給條件庫模塊進(jìn)行匹配,系統(tǒng)中條件庫模塊總共分為9個(gè)區(qū)域,分別對(duì)應(yīng)低危險(xiǎn)、低臨界、低警告、正常、高警告、高臨界、高危險(xiǎn)、關(guān)閉和開啟,并且每個(gè)區(qū)域都有自己對(duì)應(yīng)的取值區(qū)間。
2.2 規(guī)則集容器
在程序運(yùn)行的開始首先需要解析XML文件,將解析出來的規(guī)則加載到內(nèi)存中的規(guī)則集容器中。另外,在專家規(guī)則制定時(shí),需要處理冗余、沖突等錯(cuò)誤,然后將化簡后的最終結(jié)果存儲(chǔ)到XML文件中。因此,在規(guī)則引擎匹配得到要執(zhí)行的規(guī)則結(jié)論時(shí),一般規(guī)則引擎需要處理可能存在的沖突問題,而在系統(tǒng)中是將這些處理放在了專家規(guī)則庫的制定過程中,所以得到的規(guī)則結(jié)論都是最簡的且不存在沖突等問題的,當(dāng)然要考慮規(guī)則結(jié)論執(zhí)行的優(yōu)先級(jí)問題。
圖2 工作存儲(chǔ)器結(jié)構(gòu)
2.3 模式匹配器
模式匹配器是規(guī)則引擎中的核心組件,它聯(lián)系著工作存儲(chǔ)器和規(guī)則集容器,完成事實(shí)條件在規(guī)則集容器中的匹配工作,同時(shí)將匹配成功的規(guī)則結(jié)論傳送給執(zhí)行器,供其完成相應(yīng)的操作。
在我們的規(guī)則引擎系統(tǒng)中實(shí)現(xiàn)了三種匹配算法,位圖矩陣匹配,二階矩陣匹配,直接匹配。
如表1所示,給出了規(guī)則集示例,各個(gè)條件之間都是并且的關(guān)系,用&&表示,那么就會(huì)有If(a低危險(xiǎn) && b開啟 && c高臨界 && f高危險(xiǎn)),Then 結(jié)論A。
表1 規(guī)則集示例
結(jié)論 條件
a b c d e f
A 低危險(xiǎn) 開啟 高臨界 無關(guān) 無關(guān) 高危險(xiǎn)
B 無關(guān) 關(guān)閉 低警告 無關(guān) 正常 無關(guān)
C 低警告 無關(guān) 低臨界 高臨界 無關(guān) 正常
2.3.1 直接匹配
在規(guī)則庫的制定過程中,會(huì)用&&對(duì)規(guī)則條件部分進(jìn)行切分,例如規(guī)則1可以切分成“a低危險(xiǎn)”,“b開啟”,“c高臨界”,“無關(guān)”“無關(guān)”,“f高危險(xiǎn)”,然后存儲(chǔ)到XML文件中。在直接匹配過程中,規(guī)則引擎首先會(huì)將XML文件之前保存的這些切分元素加載到二維數(shù)組中,然后從工作存儲(chǔ)器中得到采集點(diǎn)a,b,c,d,e,f 所對(duì)應(yīng)的狀態(tài),將這些采集點(diǎn)對(duì)應(yīng)的狀態(tài)與這個(gè)二維數(shù)組依次比對(duì),并將匹配成功的規(guī)則結(jié)論返回給執(zhí)行器。在直接匹配算法中采用的是字符串間的直接比較,由于某些規(guī)則與采集點(diǎn)無關(guān),所以在比較每個(gè)采集點(diǎn)時(shí),首先判斷規(guī)則與這個(gè)采集點(diǎn)是不是無關(guān),然后再判斷兩者之間的關(guān)系。因此,如果規(guī)則集中有規(guī)則N條,那么總共的比較次數(shù)是12*N次。
如表2所示,為了形成規(guī)則集矩陣,需要對(duì)規(guī)則條件做一下轉(zhuǎn)換。表的第一行對(duì)應(yīng)的是狀態(tài),第二行是各個(gè)狀態(tài)所對(duì)應(yīng)的數(shù)值。那么表1中的規(guī)則集就可以轉(zhuǎn)換成表3所示的二階矩陣。在規(guī)則庫制定過程中,將這個(gè)二階矩陣存儲(chǔ)到XML文件中。
表2 規(guī)則條件轉(zhuǎn)換
狀
態(tài) 關(guān)
閉 開
啟 低
危
險(xiǎn) 低
臨
界 低
警
告 正
常 高
警
告 高
臨
界 高
危
險(xiǎn) 無
關(guān)
轉(zhuǎn)換 0 1 2 3 4 5 6 7 8 9
表3 規(guī)則集矩陣
結(jié)論 條件
a b c d e f
A 2 1 7 9 9 8
B 9 0 4 9 5 9
C 4 9 3 7 9 5
2.3.2 二階矩陣匹配
規(guī)則引擎首先從XML文件中將這個(gè)二階矩陣加載到一個(gè)二維數(shù)組中,然后從事實(shí)庫中調(diào)出采集點(diǎn)a,b,c,d,e,f所對(duì)應(yīng)的狀態(tài),并根據(jù)表2將各個(gè)狀態(tài)轉(zhuǎn)換成對(duì)應(yīng)數(shù)值,與二階矩陣數(shù)組進(jìn)行比較。直接比較采用的是字符串間的比較,每次要比較的字節(jié)數(shù)較多,而二階矩陣是字符間的比較,每次只比較一個(gè)字節(jié),比較的字節(jié)數(shù)要少很多。同樣,如果規(guī)則集中有規(guī)則N條,那么二階矩陣總的比較次數(shù)也是12*N。
將表3轉(zhuǎn)換成位圖矩陣,如表4所示。表4的左欄對(duì)應(yīng)0~8九個(gè)狀態(tài),然后分別用這些狀態(tài)與表3中的值進(jìn)行比對(duì),遇到相同值或者9那么對(duì)應(yīng)的結(jié)果都為1,否則為0。例如,狀態(tài)0與表3中的a所對(duì)應(yīng)的值(2,9,4)進(jìn)行比對(duì),那么結(jié)果就應(yīng)該是(0,1,0);與b所對(duì)應(yīng)的值(1,0,9)進(jìn)行比對(duì),那么結(jié)果就是(1,1,0)。同樣,在規(guī)則庫的制定過程中,就將這些值依次存儲(chǔ)到XML文件對(duì)應(yīng)的節(jié)點(diǎn)上。
表4 位圖矩陣
狀態(tài) 條件
a b c d e f
0 010 110 000 011 101 010
1 010 101 000 011 101 010
2 011 100 000 011 101 010
3 010 100 100 011 101 010
4 110 100 010 011 101 010
5 010 100 000 011 111 110
6 010 100 000 011 101 010
7 010 100 001 111 101 010
8 010 100 000 011 101 011
在位圖矩陣匹配過程中,首先將這個(gè)位圖矩陣加載到一個(gè)字符型三維數(shù)組中,再從事實(shí)庫中獲取各個(gè)采集點(diǎn)所對(duì)應(yīng)的狀態(tài)數(shù)值,然后進(jìn)行與運(yùn)算。值得注意的是,三維數(shù)組中只要有一個(gè)是0,那么就不需要再往下比對(duì)了,運(yùn)算的最后結(jié)果確定是0。例如,事實(shí)庫中a,b,c,d,e,f所對(duì)應(yīng)的狀態(tài)向量為(0,0,4,3,5,2),對(duì)應(yīng)的位圖矩陣中的數(shù)值是V0:[0][1][0],V1: [1][1][0],V2:[0][1][0],V3:[0][1][1],V4:[1][1][1],V5:[0][1][0]。我們按照字節(jié)從低到高依次比較,由于V0的第一個(gè)字節(jié)為0,那么就不需要再往下比對(duì)了,結(jié)果的低位肯定是0,因此節(jié)省了比對(duì)時(shí)間。同理,第二字節(jié)結(jié)果為1,由于V0的第三個(gè)高字節(jié)也為0,則結(jié)果就是0。因此最后的比對(duì)結(jié)果是[0][1][0],第一個(gè)字節(jié)位對(duì)應(yīng)結(jié)論A,第二個(gè)字節(jié)位對(duì)應(yīng)結(jié)論B,第三個(gè)字節(jié)位對(duì)應(yīng)結(jié)論C,只有結(jié)果不為0才能激活對(duì)應(yīng)結(jié)論。因此,根據(jù)與運(yùn)算結(jié)果,只能夠激活B結(jié)論,并將其返回。
2.4 執(zhí)行器
執(zhí)行器能夠執(zhí)行匹配器返回的匹配成功的規(guī)則結(jié)論,并將執(zhí)行結(jié)果返回給主程序,以便其采取相應(yīng)操作。
3 實(shí) 驗(yàn)
3.1 實(shí)驗(yàn)環(huán)境介紹
這個(gè)規(guī)則引擎是在Ubuntu 12.04系統(tǒng)下用Qt語言編寫的,規(guī)則庫采用XML文件進(jìn)行存儲(chǔ)。在聯(lián)想電腦上完成測(cè)試,電腦的CPU是 Intel? Core? 雙核,主頻是2.00 GHz,內(nèi)存RAM是2 GB。
3.2 實(shí)驗(yàn)結(jié)果分析
從圖3中可以看出,隨著規(guī)則條數(shù)的增加,加載時(shí)間基本呈線性增長,位圖矩陣加載時(shí)間最長,二階矩陣加載時(shí)間相對(duì)最短。但是,規(guī)則加載只是在程序最開始一次完成,在正常的后續(xù)運(yùn)行過程中就不需要再加載。
圖3 各個(gè)算法的加載時(shí)間
圖4顯示出在不同規(guī)則集大小的情況下,三種算法完成匹配所需的時(shí)間。在每個(gè)規(guī)則集下,三種算法都測(cè)試10次,然后取平均值,這樣能夠降低系統(tǒng)誤差。從圖4可以看出,隨著規(guī)則集的增大,匹配時(shí)間呈線性增加,但是相對(duì)于另外兩種算法,位圖矩陣算法的匹配時(shí)間增長非常緩慢,直接匹配的方法增加最快。
圖4 各個(gè)算法的匹配時(shí)間
綜上所述,我們可以得出以下結(jié)論:
(1)規(guī)則加載時(shí)間隨著規(guī)則條數(shù)呈線性增長,但是位圖矩陣匹配時(shí)間增加相對(duì)緩慢;
(2)根據(jù)圖4計(jì)算得出位圖矩陣相對(duì)于直接匹配算法,匹配時(shí)間平均提高了88.03%。
4 結(jié) 語
本文針對(duì)工業(yè)防危系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)了一套規(guī)則引擎系統(tǒng),同時(shí)有針對(duì)性的對(duì)規(guī)則引擎關(guān)鍵環(huán)節(jié)——模式匹配器進(jìn)行了優(yōu)化,使得系統(tǒng)整體性能得到有效提高。
參考文獻(xiàn)
[1] Charles L. Forgy. Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem[J]. Artificial Intelligence ,1982.
[2] PET ER L. Drools Usage Manual [ EB/ OL ]. http: / / drools.org / drools- manual- 2. 0 - beta - 13. pdf, 2004- 01-05.
[3]龐偉正, 金瑞琪, 王成武.一種規(guī)則引擎的實(shí)現(xiàn)方法[J].哈爾濱工程大學(xué)學(xué)報(bào),2005,26(3):385-389.
[4]彭磊.規(guī)則引擎原理分析[J].福建電腦,2006(9):42-43.