[轉]規則匹配——Rete 算法原理及實現

最近在學習 Drools 規則引擎框架,其中涉及到 Rete 算法。並對 Rete 算法做了一些研究,要不然在你找新工作面試時,問你會 Drools 規則引擎框架嗎?你說會!然後面試官接着問你,你瞭解 Rete 算法嗎?你說聽說過。然後面試官再問你,你知道 Rete 算法的原理嗎?你能實現 Rete 算法嗎?

追問了這麼多,你可能就回答不上來了。面試官最喜歡做的就是追着一直問,直到你回答不出來爲止。從追問的過程中,瞭解你的技術能力以及學習能力。阿里的面試官就是這種類型的,追問到底。

爲了找一份好工作,或者比你的同事拿更高的薪水,就要不僅會用,還有會它的原理以及實現。正是基於此,本文將詳細介紹 Rete 算法。

RETE 算法簡介

Rete算法是一種前向規則快速匹配算法,其匹配速度與規則數目無關。Rete是拉丁文,對應英文是net,也就是網絡。Rete算法通過形成一個rete網絡進行模式匹配,利用基於規則的系統的兩個特徵,即時間冗餘性(Temporal redundancy)和結構相似性(structural similarity),提高系統模式匹配效率。

單詞‘Rete’來自拉丁文的網一詞,發音爲 ri tiorree-tee。

RETE算法是一個用於產生式系統的高效模式匹配算法。在一個產生式系統中,被處理的數據叫做working memory,用於判定的規則分爲兩個部分LHS(left-hand-side)和RHS(right hand side),分別表示前提和結論。

RETE 算法主要流程

RETE 算法主要流程可以分爲以下步驟:

  1. Match:找出符合LHS部分的working memory集合
  2. Confilict resolution:選出一個條件被滿足的規則
  3. Act:執行RHS的內容
  4. 返回第一步

RETE算法主要改進Match的處理過程,通過構建一個網絡進行匹配。

RETE 算法詳細描述

RETE網絡主要分爲兩個部分,alpha網絡和beta網絡。如下圖所示(圖片引用其他網站)。

 

  • alpha網絡:過濾working memory,找出符合規則中每一個模式的集合,生成alpha memory(滿足該模式的集合)。有兩種類型的節點,過濾type的節點和其他條件過濾的節點。
  • Beta網絡:有兩種類型的節點Beta Memory和Join Node。前者主要存儲Join完成後的集合。後者包含兩個輸入口,分別輸入需要匹配的兩個集合,由Join節點做合併工作傳輸給下一個節點。

匹配過程描述

  • 導入需要處理的事實到facts集合中。
  • 如果facts不爲空,選擇一個fact進行處理。否則停止匹配過程。
  • 選擇alpha網的第一個節點運行(建立網絡的時候設定的),通過該節點則進入alpha網的下一個節點,直到進入alpha memory。否則跳轉到下一條判斷路徑
  • 將alpha memory的結果加入到beta memory中,如果不爲Terminal節點,則檢測另一個輸入集合中是否存在滿足條件的事實,滿足則執行join,進入到下一個beta memory重複執行3。若另一個輸入集合無滿足條件的事實,返回到2。如果該節點爲Terminal節點,執行ACT並添加到facts中。

下面再看一個匹配例子。

規則內容如下:
IF:
年級是三年級以上,
性別是男的,
年齡小於10歲,
身體健壯,
身高170cm以上,
THEN: 這個男孩是一個籃球苗子,需要培養

規則編譯網絡和匹配過程

匹配過程:

  1. (1)、匹配過程中事實在網絡節點中的流轉順序爲A–>B–>C–>D–>E–>F–>G–>H–>I—>規則匹配通過

  2. (2)、從working-Memory中拿出一個待匹配的StudentFact對象,進入根節點然後進行匹配,以下是fact在各個節點中的活動圖

  3. A節點:拿StudentFact的年級數值進行年級匹配,如果年級符合條件,則把該StudentFact的引用記錄到A節點的alpha內存區中,退出年級匹配。

  4. B節點:拿StudentFact的性別內容進行性別匹配,如果性別符合條件,則把該StudentFact的引用記錄到B節點的alpha內存區中,然後找到B節點左引用的Beta節點,也就是C節點。

  5. C節點:C節點找到自己的左引用也就是A節點,看看A節點的alpha內存區中是否存放了StudentFact的引用,如果存放,說明年級和性別兩個條件都符合,則在C節點的Beta內存區中存放StudentFact的引用,退出性別匹配。

  6. D節點:拿StudentFact的年齡數值進行年齡條件匹配,如果年齡符合條件,則把該StudentFact的引用記錄到D節點的alpha的內存區中,然後找到D節點的左引用的Beta節點,也就是E節點。

  7. E節點:E節點找到自己的左引用也就是C節點,看看C節點的Beta內存區中是否存放了StudentFact的引用,如果存放,說明年級,性別,年齡三個條件符合,則在E節點的Beta內存區中存放StudentFact的引用,退出年齡匹配。

  8. F節點:拿StudentFact的身體數值進行身體條件匹配,如果身體條件符合,則把該StudentFact的引用記錄到D(是否有問題應爲F?)節點的alpha的內存區中,然後找到F節點的左引用的Beta節點,也就是G節點。

  9. G節點:G節點找到自己的左引用也就是E節點,看看E節點的Beta內存區中是否存放了StudentFact的引用,如果存放,說明年級,性別,年齡,身體四個條件符合,則在G節點的Beta內存區中存放StudentFact的引用,退出身體匹配

  10. H節點:拿StudentFact的身高數值進行身高條件匹配,如果身高條件符合,則把該StudentFact的引用記錄到H節點的alpha的內存區中,然後找到H節點的左引用的Beta節點,也就是I節點。

  11. I節點:I節點找到自己的左引用也就是G節點,看看G節點的Beta內存區中是否存放了StudentFact的引用,如果存放了,說明年級,性別,年齡,身體,身高五個條件都符合,則在I節點的Beta內存區中存放StudentFact引用。同時說明該StudentFact對象匹配了該規則,形成一個議程,加入到衝突區,執行該條件的結果部分:該學生是一個籃球苗子。

 相關概念
1  事實(fact):
事實:對象之間及對象屬性之間的多元關係。爲簡單起見,事實用一個三元組來表示:(identifier ^attribute  value),例如如下事實:
w1:(B1  ^ on B2)     w6:(B2  ^color blue)
w2:(B1  ^ on B3)     w7:(B3  ^left-of B4)
w3:(B1  ^ color red)   w8:(B3  ^on table)
w4:(B2  ^on table)    w9:(B3  ^color red)
w5:(B2  ^left-of B3)
2  規則(rule):
由條件和結論構成的推理語句,當存在事實滿足條件時,相應結論被激活。一條規則的一般形式如下:
(name-of-this-production
LHS /*one or more conditions*/
–>
RHS /*one or more actions*/
)
其中LHS爲條件部分,RHS爲結論部分。
下面爲一條規則的例子:
(find-stack-of-two-blocks-to-the-left-of-a-red-block
(^on)
(^left-of)
(^color red)
–>
…RHS…
)
3  模式(patten):
模式:規則的IF部分,已知事實的泛化形式,未實例化的多元關係。
(^on)
(^left-of)
(^color red)
 模式匹配的一般算法
規則主要由兩部分組成:條件和結論,條件部分也稱爲左端(記爲LHS, left-hand side),結論部分也稱爲右端(記爲RHS, right-hand side)。爲分析方便,假設系統中有N條規則,每個規則的條件部分平均有P個模式,工作內存中有M個事實,事實可以理解爲需要處理的數據對象。
規則匹配,就是對每一個規則r, 判斷當前的事實o是否使LHS(r)=True,如果是,就把規則r的實例r(o)加到衝突集當中。所謂規則r的實例就是用數據對象o的值代替規則r的相應參數,即綁定了數據對象o的規則r。
規則匹配的一般算法:
1) 從N條規則中取出一條r;
2) 從M個事實中取出P個事實的一個組合c;
3) 用c測試LHS(r),如果LHS(r(c))=True,將RHS(r(c))加入衝突集中;
4) 取出下一個組合c,goto 3;
5) 取出下一條規則r,goto 2;
RETE算法
Rete算法的編譯結果是規則集對應的Rete網絡,如下圖。Rete網絡是一個事實可以在其中流動的圖。Rete網絡的節點可以分爲四類:根節點(root)、類型節點(typenode)、alpha節點、beta節點。其中,根結點是一個虛擬節點,是構建rete網絡的入口。類型節點中存儲事實的各種類型,各個事實從對應的類型節點進入rete網絡。

1  建立rete網絡
Rete網絡的編譯算法如下:
1) 創建根;
2) 加入規則1(Alpha節點從1開始,Beta節點從2開始);
a. 取出模式1,檢查模式中的參數類型,如果是新類型,則加入一個類型節點;
b. 檢查模式1對應的Alpha節點是否已存在,如果存在則記錄下節點位置,如果沒有則將模式1作爲一個Alpha節點加入到網絡中,同時根據Alpha節點的模式建立Alpha內存表;
c. 重複b直到所有的模式處理完畢;
d. 組合Beta節點,按照如下方式:
   Beta(2)左輸入節點爲Alpha(1),右輸入節點爲Alpha(2)
   Beta(i)左輸入節點爲Beta(i-1),右輸入節點爲Alpha(i)  i>2
  並將兩個父節點的內存表內聯成爲自己的內存表;
e. 重複d直到所有的Beta節點處理完畢;
f. 將動作(Then部分)封裝成葉節點(Action節點)作爲Beta(n)的輸出節點;
3) 重複2)直到所有規則處理完畢;
可以把rete算法類比到關係型數據庫操作。
把事實集合看作一個關係,每條規則看作一個查詢,將每個事實綁定到每個模式上的操作看作一個Select操作,記一條規則爲P,規則中的模式爲c1,c2,…,ci, Select操作的結果記爲r(ci),則規則P的匹配即爲r(c1)◇r(c2)◇…◇(rci)。其中◇表示關係的連接(Join)操作。

規則引擎研究(一)——Rete算法(1)

2 使用rete網絡進行匹配
使用一個rete的過程:
1) 對於每個事實,通過select 操作進行過濾,使事實沿着rete網達到合適的alpha節點。
2) 對於收到的每一個事實的alpha節點,用Project(投影操作)將那些適當的變量綁定分離出來。使各個新的變量綁定集沿rete網到達適當的bete節點。
3) 對於收到新的變量綁定的beta節點,使用Project操作產生新的綁定集,使這些新的變量綁定沿rete網絡至下一個beta節點以至最後的Project。
4) 對於每條規則,用project操作將結論實例化所需的綁定分離出來。

下面爲的圖示顯示了連接(Join)操作和投影(Project)的執行過程。

規則引擎研究(一)——Rete算法(1)

3  Rete算法的特點
Rete算法有兩個特點使其優於傳統的模式匹配算法。
1、狀態保存
事實集合中的每次變化,其匹配後的狀態都被保存再alpha和beta節點中。在下一次事實集合發生變化時,絕大多數的結果都不需要變化,rete算法通過保存操作過程中的狀態,避免了大量的重複計算。Rete算法主要是爲那些事實集合變化不大的系統設計的,當每次事實集合的變化非常劇烈時,rete的狀態保存算法效果並不理想。
2、節點共享
另一個特點就是不同規則之間含有相同的模式,從而可以共享同一個節點。Rete網絡的各個部分包含各種不同的節點共享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章