【java規則引擎】模擬rete演算法的網路節點以及匹配過程

Love Lenka發表於2017-01-22

轉載請註明:http://www.cnblogs.com/shangxiaofei/p/6340655.html

本文只用於理解rete演算法,通過一個規則的編譯成的網路結構,以及匹配過程去理解rete演算法的核心思想。具體實現,截止寫本文之時,還不瞭解。只是提供一個rete演算法的實現思路。再次重申,只用於理解rete演算法。如有不正確,請交流指正,一定會非常感謝。

 

 

(1)規則內容

IF:

年級是三年級以上,

性別是男的,

年齡小於10歲,

身體健壯,

身高170cm以上,

 

THEN:

這個男孩是一個籃球苗子,需要培養

 

(2)規則編譯網路和匹配過程

匹配過程:

(1)匹配過程中事實在網路節點中的流轉順序為A-->B-->C-->D-->E-->F-->G-->H-->I--->規則匹配通過

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

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

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

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

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

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

F節點:拿StudentFact的身體數值進行身體條件匹配,如果身體條件符合,則把該StudentFact的引用記錄到D節點的alpha的記憶體區中,然後找到F節點的左引用的Beta節點,也就是G節點。

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

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

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

 

相關文章