楊 飛 朱會(huì)兵 馬 和
(1.湖北省交通運(yùn)輸廳漢十高速公路管理處 武漢 430051;2.武漢理工大學(xué)信息工程學(xué)院 武漢 430070)
隨著交通量的增長(zhǎng),通車(chē)時(shí)間越久,高速公路的破損情況就會(huì)越嚴(yán)重。早期修建的高速公路大多已接近使用年限,需要大修和改建;近年修建的高速公路也出現(xiàn)了不同程度的損壞。因此,及時(shí)準(zhǔn)確地掌握高速公路的狀態(tài)信息并采取相應(yīng)的養(yǎng)護(hù)措施,對(duì)于維持高速公路良好的使用狀態(tài)和保護(hù)人民群眾生命財(cái)產(chǎn)安全都具有重大意義。對(duì)于業(yè)務(wù)邏輯的實(shí)現(xiàn),多數(shù)路面管理系統(tǒng)采取固化在程序代碼中的方式來(lái)實(shí)現(xiàn),當(dāng)業(yè)務(wù)邏輯很復(fù)雜并且發(fā)生變化時(shí),系統(tǒng)的修改和擴(kuò)展需要花費(fèi)很大的代價(jià)。顯然,這種高度耦合的方式給系統(tǒng)帶來(lái)了很大風(fēng)險(xiǎn)。規(guī)則引擎可以很好地解決以上問(wèn)題。本系統(tǒng)是以交通運(yùn)輸部2012年度推廣應(yīng)用項(xiàng)目——“瀝青路面智能化養(yǎng)護(hù)關(guān)鍵技術(shù)”成果為基礎(chǔ),在構(gòu)建了瀝青路面養(yǎng)護(hù)對(duì)策庫(kù)的基礎(chǔ)上,研發(fā)了一種采用基于規(guī)則引擎的路面智能養(yǎng)護(hù)系統(tǒng)。該系統(tǒng)采用Drools作為系統(tǒng)的規(guī)則引擎,主要解決了以下問(wèn)題:公路養(yǎng)護(hù)規(guī)則引擎的設(shè)計(jì)和規(guī)則的實(shí)現(xiàn);規(guī)則的維護(hù)和管理;規(guī)則沖突的解決;系統(tǒng)的兼容性;整合前臺(tái)顯示規(guī)則與后臺(tái)規(guī)則文件。
規(guī)則引擎是一種嵌入在應(yīng)用程序中的組件,實(shí)現(xiàn)了將業(yè)務(wù)邏輯從應(yīng)用程序中分離出來(lái),并使用預(yù)定義的語(yǔ)義模塊編寫(xiě)業(yè)務(wù)邏輯。規(guī)則引擎的主要工作是將輸入的數(shù)據(jù)對(duì)象與加載的規(guī)則進(jìn)行匹配,并由符合條件的規(guī)則生成規(guī)則執(zhí)行實(shí)例。目前主流的規(guī)則引擎包括Ilog JRules,Drools,Jess,等等[1]。其中Ilog JRules和Jess都是相當(dāng)成熟的商業(yè)BRMS,提供了一套完整的規(guī)則建模、規(guī)則編寫(xiě)、規(guī)則測(cè)試、規(guī)則部署和維護(hù)的工具,但是價(jià)格非常昂貴。Drools規(guī)則引擎是由JBoss開(kāi)發(fā)的優(yōu)秀的開(kāi)源規(guī)則引擎[2],是開(kāi)源規(guī)則引擎中使用最廣的產(chǎn)品之一。除具有一般規(guī)則引擎的優(yōu)點(diǎn)外,還具有高效的算法、豐富的規(guī)則語(yǔ)言、強(qiáng)大的API和工具集成等特點(diǎn)[3]。故選擇Drools作為系統(tǒng)的規(guī)則引擎。
(1)基本信息模塊。主要包括路線編碼、區(qū)間編碼、路段編碼、公路等級(jí)、路面類(lèi)型、車(chē)道類(lèi)型、面層類(lèi)型和基層類(lèi)型等基本信息的管理。
(2)養(yǎng)護(hù)評(píng)價(jià)模塊。主要功能是對(duì)路面使用性能 (PQI)、路 面 破 損 (PCI)、路 面 平 整 度(RQI)、路面車(chē)轍(RDI)、路面抗滑性能(SRI)和路面結(jié)構(gòu)強(qiáng)度(PSSI)6個(gè)路況參數(shù)做出評(píng)價(jià)。
(3)養(yǎng)護(hù)決策模塊。主要功能是根據(jù)路況數(shù)據(jù)得出養(yǎng)護(hù)方案和養(yǎng)護(hù)造價(jià)。
(4)規(guī)則管理模塊。主要包括規(guī)則文件的編輯、沖突解決策略。
(5)系統(tǒng)管理模塊。主要包括用戶管理、權(quán)限管理和系統(tǒng)日志。
系統(tǒng)邏輯結(jié)構(gòu)分為表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)持久層3個(gè)層次,見(jiàn)圖1。
圖1 系統(tǒng)邏輯架構(gòu)圖
在表示層中,從JSP頁(yè)面發(fā)送來(lái)的請(qǐng)求被轉(zhuǎn)發(fā)到相應(yīng)的Action控制器。Action控制器首先獲取用戶請(qǐng)求參數(shù),然后調(diào)用業(yè)務(wù)邏輯層中相應(yīng)的Service組件,Service組件再調(diào)用數(shù)據(jù)持久層中相應(yīng)的Dao組件,執(zhí)行相應(yīng)的數(shù)據(jù)庫(kù)操作,返回的處理結(jié)果將通過(guò)Action輸出到JSP頁(yè)面。當(dāng)用戶進(jìn)行養(yǎng)護(hù)決策時(shí),養(yǎng)護(hù)決策Action控制器調(diào)用業(yè)務(wù)邏輯層中的養(yǎng)護(hù)決策Service組件取得相應(yīng)路況信息,調(diào)用規(guī)則管理Service組件從規(guī)則庫(kù)中取得規(guī)則文件。使用規(guī)則引擎進(jìn)行模式匹配,匹配成功的規(guī)則被送入議程等待執(zhí)行,執(zhí)行完畢后,輸出養(yǎng)護(hù)方案。
依據(jù)“瀝青路面智能化養(yǎng)護(hù)關(guān)鍵技術(shù)”的研究成果,本系統(tǒng)根據(jù)養(yǎng)護(hù)對(duì)策生成各項(xiàng)的判別規(guī)則并存儲(chǔ)到數(shù)據(jù)庫(kù)中。例如:當(dāng)PCI>70,RQI>43.8,RDI>70,SRI>80.5,PSSI>80.2,并且病害類(lèi)型為裂縫、局部坑槽、擁包、沉陷、松散和翻漿其中之一時(shí),養(yǎng)護(hù)方案為F11。
(1)如果用戶輸入的路況數(shù)據(jù)只包含PCI,RQI等5個(gè)參數(shù),不含病害數(shù)據(jù)和輔助參數(shù),則要先按使用相同判別參數(shù)的規(guī)則進(jìn)行規(guī)則的合并,生成FILE類(lèi)型的規(guī)則文件。
(2)如果用戶輸入的路況數(shù)據(jù)包含PCI,RQI等5個(gè)參數(shù)且包含病害數(shù)據(jù),但不包含輔助參數(shù),則合并后生成對(duì)應(yīng)于FILEX類(lèi)型的規(guī)則文件。
(3)如果用戶輸入的路況數(shù)據(jù)包含PCI,RQI等5個(gè)參數(shù)且包含輔助參數(shù),但不包含病害數(shù)據(jù),則合并后生成對(duì)應(yīng)于FILEY類(lèi)型的規(guī)則文件。
(4)如果用戶輸入的路況數(shù)據(jù)包含PCI,RQI等5個(gè)參數(shù)且包含病害數(shù)據(jù),也包含輔助參數(shù),則上述規(guī)則對(duì)應(yīng)于FILEZ類(lèi)型的規(guī)則文件。
一個(gè)標(biāo)準(zhǔn)的規(guī)則文件就是一個(gè)擴(kuò)展名為.drl的文本文件。根據(jù)規(guī)則文件的結(jié)構(gòu),可以將規(guī)則分為3部分:屬性聲明部分(attribute)、條件部分(LHS)和結(jié)果部分(RHS)。規(guī)則格式如下:
為了方便用戶輸入,這里采用可視化界面進(jìn)行規(guī)則的生成和管理;并且設(shè)計(jì)了一個(gè)專(zhuān)門(mén)用于“翻譯”的JavaBean,實(shí)現(xiàn)前臺(tái)顯示與后臺(tái)規(guī)則文件的統(tǒng)一,見(jiàn)圖2。
圖2 規(guī)則文件添加界面
養(yǎng)護(hù)決策模塊的處理流程包括數(shù)據(jù)準(zhǔn)備、規(guī)則編譯、規(guī)則執(zhí)行和養(yǎng)護(hù)方案生成4部分。啟動(dòng)養(yǎng)護(hù)決策之后,首先判斷數(shù)據(jù)庫(kù)中是否存在指定的路況數(shù)據(jù),如果存在,則讀取路況數(shù)據(jù)和規(guī)則文件。然后編譯規(guī)則文件,編譯通過(guò)之后設(shè)置全局變量,并插入路況數(shù)據(jù),執(zhí)行規(guī)則文件,如果已經(jīng)生成養(yǎng)護(hù)方案,則計(jì)算造價(jià)并存入數(shù)據(jù)庫(kù),見(jiàn)圖3。
圖3 養(yǎng)護(hù)決策流程圖
一個(gè)事實(shí)對(duì)象在模式匹配的過(guò)程中,規(guī)則庫(kù)中有多條規(guī)則與之匹配,從而可能產(chǎn)生多種結(jié)果,但不能確定具體得到哪個(gè)結(jié)果,即稱(chēng)產(chǎn)生了規(guī)則沖突[4]。規(guī)則沖突的根源來(lái)自于規(guī)則庫(kù)的邏輯不完備或者不一致。因?yàn)橐?guī)則庫(kù)本身是一個(gè)邏輯系統(tǒng),當(dāng)規(guī)則庫(kù)的添加或者修改導(dǎo)致規(guī)則庫(kù)的邏輯不一致或者不完備時(shí),就會(huì)發(fā)生規(guī)則沖突。Drools提供的沖突解決策略包括設(shè)置優(yōu)先級(jí)和LIFO(后進(jìn)先出)[5]。通過(guò)給規(guī)則設(shè)置優(yōu)先級(jí),可以確保不同優(yōu)先級(jí)的規(guī)則不發(fā)生沖突,但是相同優(yōu)先級(jí)的規(guī)則仍然可能沖突。后進(jìn)先出策略只是簡(jiǎn)單地讓后進(jìn)入議程(Agenda)的規(guī)則先被激活,但是對(duì)可能存在的沖突沒(méi)有做任何處理。
如何發(fā)現(xiàn)這種邏輯上的包含關(guān)系是問(wèn)題的關(guān)鍵。一種方法是直接寫(xiě)if判斷語(yǔ)句,如果用戶輸入的規(guī)則條件里有“不要求”語(yǔ)句,并且條件的其他部分與規(guī)則庫(kù)里的某一條規(guī)則相同,那么就判定用戶輸入的規(guī)則不合法。如此需要考慮的情況將非常復(fù)雜,因?yàn)橛脩糨斎氲囊?guī)則里可能只有一個(gè)“不要求”語(yǔ)句,也可能有多個(gè),而且具體是哪一個(gè)參數(shù)“不要求”也是不確定的,還有可能用戶輸入的規(guī)則里沒(méi)有“不要求”語(yǔ)句,而規(guī)則庫(kù)里的規(guī)則有“不要求”語(yǔ)句,這樣也會(huì)形成邏輯沖突。
受集合論的啟發(fā),再考慮到Java優(yōu)秀的字符串處理能力,筆者采用如下方法來(lái)檢測(cè)邏輯沖突:為規(guī)則條件的每個(gè)部分加一個(gè)標(biāo)記值,用于表示該項(xiàng)條件所代表的集合,約定“大于”記A,“小于”記B,則“不要求”記AB。例如,用戶輸入2條規(guī)則,記為 Rule A 和 Rule B,Rule A 的內(nèi)容為:當(dāng)PCI>70,RQI>43.8,RDI>70,SRI>80.5,PSSI>80.2時(shí),養(yǎng)護(hù)方案為F11;Rule B的內(nèi)容為:當(dāng)PCI>70,RQI>43.8,RDI不要求,SRI>80.5,PSSI>80.2時(shí),養(yǎng)護(hù)方案為F12。則Rule A的標(biāo)記值表示為(A,A,A,A,A),Rule B的標(biāo)記值可以表示為(A,A,AB,A,A)。這樣要檢測(cè)這種邏輯上的包含關(guān)系,只需用java.lang.String的contains()方法就可以實(shí)現(xiàn)。首先對(duì)用戶輸入規(guī)則文件的條件部分所對(duì)應(yīng)的標(biāo)記值進(jìn)行賦值,然后將其與規(guī)則庫(kù)里的規(guī)則文件逐個(gè)進(jìn)行比較,這里又分2種情況,一種是用戶輸入規(guī)則在邏輯上被包含,另一種是用戶輸入規(guī)則在邏輯上包含規(guī)則庫(kù)里的規(guī)則,這兩種情況都屬于邏輯沖突,記錄下沖突規(guī)則的ID后,就可以設(shè)置警告信息。
針對(duì)現(xiàn)代路面信息管理系統(tǒng)面臨的問(wèn)題,本文介紹了基于Drools規(guī)則引擎的路面信息管理和決策系統(tǒng)的解決方案,討論了系統(tǒng)的總體架構(gòu)、業(yè)務(wù)規(guī)則的生成和管理、養(yǎng)護(hù)決策的處理流程和沖突的解決策略。文中利用Java語(yǔ)言的字符串處理能力,通過(guò)比較用戶輸入的規(guī)則與規(guī)則庫(kù)原有規(guī)則,實(shí)現(xiàn)規(guī)則的沖突檢測(cè)功能,防止規(guī)則的重復(fù)與沖突,保證了系統(tǒng)的穩(wěn)定性。針對(duì)用戶輸入的路況數(shù)據(jù)可能不全面,存在參數(shù)缺失的情況,合理設(shè)計(jì)規(guī)則結(jié)構(gòu),使規(guī)則庫(kù)可以處理多種類(lèi)型數(shù)據(jù),提高了系統(tǒng)的兼容性。設(shè)計(jì)了一個(gè)專(zhuān)門(mén)用于“翻譯”的JavaBean,實(shí)現(xiàn)前臺(tái)顯示規(guī)則與后臺(tái)規(guī)則文件的統(tǒng)一。
[1]張 淵,夏清國(guó).基于Rete算法的Java規(guī)則引擎[J].科學(xué)技術(shù)與工程,2006,6(11):1548-1550.
[2]王重英.基于規(guī)則引擎的工作流系統(tǒng)設(shè)計(jì)[J].現(xiàn)代電子技術(shù),2009(12):42-44.
[3]馬秀麗,王紅霞,張凌云.Drools在網(wǎng)絡(luò)故障管理系統(tǒng)中的應(yīng)用[J].計(jì)算機(jī)工程與設(shè)計(jì),2009,30(8):1859-1862.
[4]ROSENBERG F,DUSTDAR S.Business rules integration in BPEL-a service-oriented approach[C]//7th International IEEE Conference on E-Commerce Technology(CEC’2005).Washington DC:IEEE Computer Society Press,2005:476-479.
[5]GRAHAM I.Business rules management and service oriented architecture[M].[S.l.]:Wiley,2007.