項目中需要設計開發一個規則引擎服務,於是調研了業界常用的規則引擎。
常見的規則引擎如下:
Ilog JRules 是最有名的商用BRMS;
Drools 是最活躍的開源規則引擎;
Jess 是Clips的java實現,就如JRuby之於Ruby,是AI系的代表;
Visual Rules(旗正規則引擎)國內商業規則引擎品牌,可以認為是ILOG的本土版本。
Mandarax是一個規則引擎的純Java實現。基於反向推理(歸納法)。
對比如下:
1、四者都主要使用foreward-chaining的Rete引擎,按優先級匹配條件語句,實施規則語句。規則實施后會激發事實的變化,引擎又會重新進行條件匹配,直到不能再匹配為止,Rete的算法保證了服從的最高。
(1). Rete 算法的特點:
a. Rete 算法是一種啟發式算法,不同規則之間往往含有相同的模式,因此在 beta-network 中可以共享 BetaMemory 和 betanode。如果某個 betanode 被 N 條規則共享,則算法在此節點上效率會提高 N 倍。
b. Rete 算法由於采用 AlphaMemory 和 BetaMemory 來存儲事實,當事實集合變化不大時,保存在 alpha 和 beta 節點中的狀態不需要太多變化,避免了大量的重復計算,提高了匹配效率。
c. 從 Rete 網絡可以看出,Rete 匹配速度與規則數目無關,這是因為事實只有滿足本節點才會繼續向下沿網絡傳遞。
(2). Rete 算法的不足:
a. 事實的刪除與事實的添加順序相同, 除了要執行與事實添加相同的計算外, 還需要執行查找, 開銷很高 。
b. RETE 算法使用了β存儲區存儲已計算的中間結果, 以犧牲空間換取時間, 從而加快系統的速度。然而β存儲區根據規則的條件與事實的數目而成指數級增長, 所以當規則與事實很多時, 會耗盡系統資源。
(3)針對 Rete 算法的特點和不足,在應用或者開發基於 Rete 算法的規則引擎時,改進方向:
a. 容易變化的規則盡量置后匹配,可以減少規則的變化帶來規則庫的變化。
b. 約束性較為通用或較強的模式盡量置前匹配,可以避免不必要的匹配。
c. 針對 Rete 算法內存開銷大和事實增加刪除影響效率的問題,技術上應該在 alpha 內存和 beata 內存中,只存儲指向內存的指針,並對指針建里索引(可用 hash 表或者非平衡二叉樹)。
d. Rete 算法 JoinNode 可以擴展為 AndJoinNode 和 OrJoinNode,兩種節點可以再進行組合 。
2、Ilog JRules 和 Visual Rules 是商業版
3、Drools vs ILog vs Jess vs Mandarax