1.1.2 rete 算法相關概念node
Rete 算法規則相關的概念有以下幾個:算法
Fact:已經存在的事實,它是指對象之間及對象屬性之間的多元關係,爲簡單起見,事實用一個三元組來表示:(標識符 ^ 屬性 值)[1],例如以下事實:數據庫
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)
Rule:規則,包含條件和行爲兩部分,條件部分又叫左手元(LHS),行爲部分又叫右手元(RHS)。條件部分能夠有多條條件,而且能夠用 and 或 or 鏈接 [1]。其通常形式以下:數組
(name-of-this-production LHS /*one or more conditions*/ --> RHS /*one or more actions*/ ) 例如,下面的例子: (find-stack-of-two-blocks-to-the-left-of-a-red-block (^on) (^left-of) (^color red) --> ...RHS... ) Patten:模式,也就是規則的條件部分,是已知事實的泛化形式,是未實例化的多元關係 [1]。好比,前面的那條規則的條件部分: (^on) (^left-of) (^color red) Rete 網絡的概念 [1][9][10]以下:
RootNode:Rete 網絡的根節點,全部對象經過 Root 節點進入網絡。緩存
ObjectTypeNode:對象類型節點,保證所傳入的對象只會進入本身類型所在的網絡,提升了工做效率。安全
AlphaNode:Alpha 節點是規則的條件部分的一個模式,一個對象只有和本節點匹配成功後,才能繼續向下傳播。網絡
JoinNode:用做鏈接(jion)操做的節點,至關於 and,至關於數據庫的錶鏈接操做,屬於 betaNode 類型的節點。BetaNode 節點用於比較兩個對象和它們的字段。兩個對象多是相同或不一樣的類型。咱們將這兩個輸入稱爲左和右。BetaNode 的左輸入一般是一組對象的數組。BetaNode 具備記憶功能。左邊的輸入被稱爲 Beta Memory,會記住全部到達過的語義。右邊的輸入成爲 Alpha Memory,會記住全部到達過的對象。性能
NotNode:根據右邊輸入對左邊輸入的對象數組進行過濾,兩個 NotNode 能夠完成‘ exists ’檢查。優化
LeftInputAdapterNodes:將單個對象轉化成對象數組。this
Terminal Nodes 被用來代表一條規則已經匹配了它的全部條件(conditions)。
圖 1 展現的是一個簡單的 rete 網絡:
1.1.3 建立 rete 網絡
Rete 算法的編譯結果是建立了規則集對應的 Rete 網絡 , 它是一個事實能夠在其中流動的圖。建立 rete 網絡的過程 [1]以下: 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 網絡以下圖 2 (a 圖爲含有 3 個規則的 rete 網絡,b 圖爲含有一個規則的 rete 網絡 ):
圖 2. beta-network and alpha-network
上圖(a 圖和 b 圖),他們的左邊的部分都是 beta-network, 右邊都是 alpha-network, 圓圈是 join-node。右邊的 alpha-network 是根據事實庫和規則條件構建的,其中除 alpha-network 節點的節點都是根據每一條規則條件的模式 , 從事實庫中 match 過來的,即在編譯構建網絡的過程當中靜態創建的。只要事實庫是穩定的,RETE 算法的執行效率應該是很是高的,其緣由就是已經經過靜態的編譯,構建了 alpha-network。左邊的 beta-network 表現出了 rules 的內容,其中 p1,p2,p3 共享了許多 BetaMemory 和 join-node, 這樣能加快匹配速度。
1.1.4 Rete 算法的匹配過程
匹配過程以下: 1) 對於每一個事實,經過 select 操做進行過濾,使事實沿着 rete 網達到合適的 alpha 節點。2) 對於收到的每個事實的 alpha 節點,用 Project( 投影操做 ) 將那些適當的變量綁定分離出來。使各個新的變量綁定集沿 rete 網到達適當的 bete 節點。3) 對於收到新的變量綁定的 beta 節點,使用 Project 操做產生新的綁定集,使這些新的變量綁定沿 rete 網絡至下一個 beta 節點以致最後的 Project。4) 對於每條規則,用 project 操做將結論實例化所需的綁定分離出來。
若是把 rete 算法類比到關係型數據庫操做,則事實集合就是一個關係,每條規則就是一個查詢,再將每一個事實綁定到每一個模式上的操做看做一個 Select 操做,記一條規則爲 P,規則中的模式爲 c1,c2,…,ci, Select 操做的結果記爲 r(ci), 則規則 P 的匹配即爲 r(c1)◇r(c2)◇…◇(rci)。其中◇表示關係的鏈接(Join)操做。
Rete 網絡的鏈接(Join)和投影 (Project) 和對數據庫的操做形象對好比圖 3 所示:
圖 3. join and project
1.1.5 Rete 算法的特色、不足和建議 Rete 算法有以下特色:
a. Rete 算法是一種啓發式算法,不一樣規則之間每每含有相同的模式,所以在 beta-network 中能夠共享 BetaMemory 和 betanode。若是某個 betanode 被 N 條規則共享,則算法在此節點上效率會提升 N 倍。
b. Rete 算法因爲採用 AlphaMemory 和 BetaMemory 來存儲事實,當事實集合變化不大時,保存在 alpha 和 beta 節點中的狀態不須要太多變化,避免了大量的重複計算,提升了匹配效率。
c. 從 Rete 網絡能夠看出,Rete 匹配速度與規則數目無關,這是由於事實只有知足本節點纔會繼續向下沿網絡傳遞。
Rete 算法的不足:
a. 事實的刪除與事實的添加順序相同, 除了要執行與事實添加相同的計算外, 還須要執行查找, 開銷很高 [3]。
b. RETE 算法使用了β存儲區存儲已計算的中間結果, 以犧牲空間換取時間, 從而加快系統的速度。然而β存儲區根據規則的條件與事實的數目而成指數級增加, 因此當規則與事實不少時, 會耗盡系統資源 [3]。
針對 Rete 算法的特色和不足,在應用或者開發基於 Rete 算法的規則引擎時,提出以下建議:
a. 容易變化的規則儘可能置後匹配,能夠減小規則的變化帶來規則庫的變化。
b. 約束性較爲通用或較強的模式儘可能置前匹配,能夠避免沒必要要的匹配。
c. 針對 Rete 算法內存開銷大和事實增長刪除影響效率的問題,技術上應該在 alpha 內存和 beata 內存中,只存儲指向內存的指針,並對指針建裏索引(可用 hash 表或者非平衡二叉樹)。
d. Rete 算法 JoinNode 能夠擴展爲 AndJoinNode 和 OrJoinNode,兩種節點能夠再進行組合 [5]。
優化:
1. 模式儘可能完整和獨立,便於規則之間的模式重複利用;
2. 因爲規則之間的模式匹配結果會緩存和重複利用,爲了儘可能保持規則庫穩定不變,規則生效時間放在規則外面,同時,在Action裏,禁止修改Facts屬性;
3. 在規則裏面,約束性較爲通用或較強的模式儘可能置前匹配,能夠避免沒必要要的匹配;
4. 規則包加載後加入緩存,運行期禁止動態加載規則,爲了性能和安全;
5. 將數據準備和規則執行拆分,也是爲了保持Facts的穩定,利於規則之間的模式複用