java規則引擎 之Drools之Rete演算法

2021-09-22 17:09:22 字數 3527 閱讀 5695

一:規則引擎

--->規則引擎的核心是pattern matcher(模式匹配器)。不管是正向推理還是反向推理,首先要解決乙個模式匹配的問題。

--->對於規則的模式匹配,可以定義為: 乙個規則是一組模式的集合。如果事實/假設的狀態符合該規則的所有模式,則稱為該規則是可滿足的。 模式匹配的任務就是將事實/假設的狀態與規則庫中的規則一一匹配,找到所有可滿足的規則。

二:什麼是模式匹配

對於模式匹配我們都應該不陌生,我們經常使用的正規表示式就是一種模式匹配。

正規表示式是一種「模式(pattern)」,

程式語言提供的「正規表示式引擎」就是pattern matcher。比如python中的re模組。

首先輸入「知識」:re.compile(r'string'),

然後就可以讓其匹配(match)事實(字串)。

最後通過正規表示式引擎可以得到匹配後的結果。

對於規則匹配,通常定義如下:

條件部分,也稱為lhs(left-hand side)

事實部分,也稱為rhs(right-hand side)

假設系統中有n條規則,平均每個規則的條件部分有p個模式,在某個時點有m個事實需要處理。則規則匹配要做的事情就是: 對每乙個規則r,判斷當前的事實o是否滿足lhs(r)=true,如果滿足,則將規則r的例項r(o),即規則+滿足該規則的事實,加到衝突集中等待處 理。 通常採取如下過程:

從n條規則中取出一條r;

從m個事實中取出p個事實的乙個組合c;

用c測試lhs(r),如果lhs(r(c))=true,將rhs(r(c))加入佇列中;

如果m個事實還存在其他的組合c,goto 3;

取出下一條規則r,goto 2;

實際的問題可能更複雜,在規則的執行過程中可能會改變rhs的資料,從而使得已經匹配的規則例項失效或者產生新的滿足規則的匹配,形成一種「動態」的匹配鏈。

三:模式匹配演算法

上面的處理由於涉及到組合,過程很複雜。有必要通過特定的演算法優化匹配的效率。目前常見的模式匹配演算法包括rete、treat、leaps,hal,matchbox等。

四:rete演算法

rete演算法是目前使用最廣泛的規則匹配演算法,由charles l. forgy博士在2023年發明。rete演算法是一種快速的forward-chaining推理演算法,其匹配速度與規則的數量無關。 rete的高效率主要來自兩個重要的假設:

時間冗餘性。 facts在推理過程中的變化是緩慢的, 即在每個執行週期中,只有少數的facts發生變化,因此影響到的規則也只佔很小的比例。所以可以只考慮每個執行週期中已經匹配的facts.

結構相似性。許多規則常常包含類似的模式和模式組。

rete演算法的基本思想是儲存過去匹配過程中留下的全部資訊,以空間代價來換取執行效率 。對每乙個模式 ,附加乙個匹配元素表來記錄workingmemory中所有能與之匹配的元素。當乙個新元素加入到workingmemory時, 找出所有能與之匹配的模式, 並將該元素加入到匹配元素表中; 當乙個無素從workingmemory中刪除時,同樣找出所有與該元素匹配的模式,並將元素從匹配元素表中刪除。 rete演算法接受對工作儲存器的修改操作描述 ,產生乙個修改衝突集的動作 。

rete演算法的步驟如下:

將初始資料(fact)輸入working memory。

使用pattern matcher比較規則(rule)和資料(fact)。

如果執行規則存在衝突(conflict),即同時啟用了多個規則,將衝突的規則放入衝突集合。

解決衝突,將啟用的規則按順序放入agenda。

使用規則引擎執行agenda中的規則。重複步驟2至5,直到執行完畢所有agenda中的規則。

五:tread演算法

在 rete演算法中 ,同一規則連線結點上的暫存器保留了大量的冗餘結果。實際上, 暫存器中大部分資訊已經體現在衝突集的規則例項中。因此 ,如果在部分匹配過程中直接使用衝突集來限制模式之間的變數約束,不僅可以減少暫存器的數量 ,而且能夠加快匹配處理效率 。這一思想稱為 衝突集支撐策略 。

考慮增刪事實對匹配過程的影響,當向工作儲存器增加乙個事實時 ,衝突集中已有的規則例項仍然保留,只是將與該事實匹配的規則例項加入到衝突集中; 當從工作儲存器刪去乙個事實時,不可能有新的規則例項產生, 只是將 包含該事實的規則例項從衝突集中刪去。

基於衝突集支撐策略和上述觀察, treat演算法放棄了rete演算法中利用暫存器儲存模式之間變數約束中間結果的思想,對於每乙個模式 ,除保留原有 a暫存器的外 ,增加兩個新鏈來記錄與該模式匹配的增刪事實,乙個叫做增鏈 (addlist),另乙個叫做刪鏈 (deletelist)。當修改描述的操作符為 「+」時,臨時執行部分連線任務;當修改描述的操作符為 「一」時,直接刪去衝突集中包含該事實的規則例項。

treat演算法的步驟如下:

行動 :根據點火規則的 rhs,生成修改描述表 changes;

模式匹配:置每一模式的刪鏈和增鏈為空,對 changes的每乙個修改描述 ,執行模式匹配。對於與修改描述中的事實匹配成功的模式,若修改描述的操作符為 「+」, 將該事實加入這一模式的增鏈;若修改描述的操作符為 「一」,將該事實加入這一模式的 刪鏈。

刪去事實的處理:對於任一模式鏈中的每乙個事實,找到衝突集中所有包含該事實 的規則例項,並將這一規則例項從衝突集中刪去。相應地修改該模式的 a暫存器 。

新增事實的處理:對 於 每 一 模 式 ,若 其 增 鏈 非 空 ,則 將 增 鏈 中 的 所 有 事 實 加 入 該 模 式的a暫存器 ,並對與新增事實相關的每一條規則臨時執行部分匹配,尋找該規則新的實 例。具體做法為:首先將第乙個模式增鏈中的事實集合與後一模式的 a暫存器進行連線 , 再將部分連線結果與第三個模式的a暫存器進行連線 ,一直到所有模式均連線完成為止。 其中 ,a暫存器 的內容包括新增 事實。若連線結果非空 ,則將找到 的規則 例項插入到衝突 集中。

六:leaps 演算法

前向推理引擎,包括leaps,都包括了匹配-選擇-執行(match-select-action)迴圈。即,確定可以匹配的規則,選擇某個匹配 的元 組,此元組相應的規則動作被執行。重複這一過程,直到某一狀態(如沒有更多的規則動作)。rete和treat匹配演算法速度慢的原因是,它們把滿足規則條 件的元組都例項化。leaps演算法的最大的改進就是使用一種"lazy"的方法來評估條件(conditions),即僅當必要時才進行元組的例項化。這 一改進極大的減少了前向推理引擎的時空複雜度,極大提高了規則執行速度。

leaps演算法將所有的 asserted 的 facts ,按照其被 asserted 在 working memory 中的順序( fifo ),放在主堆疊中。它乙個個的檢查 facts ,通過迭代匹配 data type 的 facts 集合來找出每乙個相關規則的匹配。當乙個匹配的資料被發現時,系統記住此時的迭代位置以備待會的繼續迭代,並且激發規則結果( consequence )。當結果( consequence )執行完成以後,系統就會繼續處理處於主堆疊頂部的 fact 。如此反覆。

leaps演算法的效率可以比rete演算法和tread演算法高幾個數量級。

七:其他演算法

對於hal演算法和matchbox演算法,使用的範圍不是很廣,這裡不做過多的介紹。

Drools規則引擎介紹

規則引擎起源於基於規則的專家系統,而基於規則的專家系統又是專家系統的其中乙個分支。專家系統屬於人工智慧的範疇,它模仿人類的推理方式,使用試探性的方法進行推理,並使用人類能理解的術語解釋和證明它的推理結論 規則引擎一般由3部分組成 規則庫 knowledge base working memory f...

Drools 規則引擎 入門

參考網上前輩的例子,自己把drools整合在了springboot中能正常執行。特此記錄一下 pom檔案引入jar包 org.drools drools core 7.0.0.final org.drools drools compiler 7.0.0.final org.drools drools...

10042 Drools規則引擎

原文 通過學習rete演算法之後,這篇部落格來介紹一下乙個 rete 演算法實現的規則引擎的框架 drools。drools是 jboss 公司旗下一款開源的規則引擎,有如下特點 完整的實現了rete 演算法 提供了強大的eclipse plugin 開發支援 通過使用其中的dsl domain s...