這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
RETE演算法介紹
一、 rete概述
Rete演算法是一種前向規則快速匹配演算法,其匹配速度與規則數目無關。Rete是拉丁文,對應英文是net,也就是網路。Rete演算法通過形成一個rete網路進行模式比對,利用基於規則的系統的兩個特徵,即時間冗餘性(Temporalredundancy)和結構相似性(structuralsimilarity),提高系統模式比對效率。
二、 相關概念
2.1 事實(fact):
事實:對象之間及對象屬性之間的多元關係。為簡單起見,事實用一個三元組來表示:(identifier ^attribute value),例如如下事實:
w1:(B1 ^ onB2) w6:(B2 ^color blue)
w2:(B1 ^ onB3) w7:(B3 ^left-of B4)
w3:(B1 ^ colorred) w8:(B3 ^on table)
w4:(B2 ^ontable) w9:(B3 ^color red)
w5:(B2 ^left-of B3)
2.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...
)
2.3 模式(patten):
模式:規則的IF部分,已知事實的泛化形式,未執行個體化的多元關係。
(^on)
(^left-of)
(^color red)
三、 模式比對的一般演算法
規則主要由兩部分組成:條件和結論,條件部分也稱為左端(記為LHS,left-hand side),結論部分也稱為右端(記為RHS, right-handside)。為分析方便,假設系統中有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網路。
4.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)操作。
4.2 使用rete網路進行匹配
使用一個rete的過程:
1) 對於每個事實,通過select操作進行過濾,使事實沿著rete網達到合適的alpha節點。
2) 對於收到的每一個事實的alpha節點,用Project(投影操作)將那些適當的變數綁定分離出來。使各個新的變數綁定集沿rete網到達適當的bete節點。
3) 對於收到新的變數綁定的beta節點,使用Project操作產生新的綁定集,使這些新的變數綁定沿rete網路至下一個beta節點以至最後的Project。
4) 對於每條規則,用project操作將結論執行個體化所需的綁定分離出來。
下面為的圖示顯示了串連(Join)操作和投影(Project)的執行過程。
4.3 Rete演算法的特點
Rete演算法有兩個特點使其優於傳統的模式比對演算法。
1、狀態儲存
事實集合中的每次變化,其匹配後的狀態都被儲存再alpha和beta節點中。在下一次事實集合發生變化時,絕大多數的結果都不需要變化,rete演算法通過儲存操作過程中的狀態,避免了大量的重複計算。Rete演算法主要是為那些事實集合變化不大的系統設計的,當每次事實集合的變化非常劇烈時,rete的狀態儲存演算法效果並不理想。
2、節點共用
另一個特點就是不同規則之間含有相同的模式,從而可以共用同一個節點。Rete網路的各個部分包含各種不同的節點共用。