天天看點

【java規則引擎】模拟rete算法的網絡節點以及比對過程

本文隻用于了解rete算法,通過一個規則的編譯成的網絡結構,以及比對過程去了解rete算法的核心思想。具體實作,截止寫本文之時,還不了解。隻是提供一個rete算法的實作思路。再次重申,隻用于了解rete算法。如有不正确,請交流指正,一定會非常感謝。

(1)規則内容

IF:

年級是三年級以上,

性别是男的,

年齡小于10歲,

身體健壯,

身高170cm以上,

THEN:

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

(2)規則編譯網絡和比對過程

【java規則引擎】模拟rete算法的網絡節點以及比對過程

比對過程:

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