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


轉載請注明: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對象匹配了該規則,形成一個議程,加入到沖突區,執行該條件的結果部分:該學生是一個籃球苗子。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM