規則引擎研究(一)——Rete算法(3)

4.6  連接節點(Join node)


當一個連接節點的alpha內存中加入一個事實時,將引發此連接節點的right activation,當一個連接結點的beta內存中加入一個token時,將引發此連接節點的left activation。
連接節點的數據結構包括:指向其alpha內存和beta內存的指針,變量連接檢測的說明,指向子節點的指針。
當一個連接節點的alpha內存中加入某個事實時,引發right activation。此處,因爲right activation 的順序不同,有可能產生冗餘tokens(即在同一個beta內存裏存儲有兩個或以上的相同的token)。結果這個問題的方法有:每次在beta內存中加入一個新的token時,都檢測是否已存在相同的token。這個方法的缺點就是使系統的處理速度變慢。另外一個較好的方法是把right activation的順序確定下來。

4.7  去除事實(Removals of facts)


當某個事實從工作內存總刪除時,需要更新含有此事實的alpha內存和beta內存,有以下幾種方法。
在原始的rete算法中,刪除操作和添加操作採用同一種方式。稱此方式爲rematch-based removal。主要思想是給每個添加或刪除操作一個tag,用來表明此操作是添加事實或刪除事實。刪除操作的具體執行過程同上面討論的添加一個事實的過程類似。此方法與其他方法相比,速度較慢。因爲刪除操作與添加操作的工作量幾乎相同。在添加事實過程中所獲得的信息並沒有在執行刪除操作時加以利用。下面有三種改進的算法。
在scan-based removal中,當一個連接節點的alpha內存中的某個事實w被去除時,把w傳給此連接節點的輸出內存,在此內存中尋找最後一個元素爲w的tokens,將這些tokens刪除,並且把這些tokens傳給此連接節點的子節點。在在子節點中做類似刪除操作。(Scales,1986)通過使用此方法代替原有方法,獲得28%的加速。(Barachini,1991)獲得了10%的加速。
在list-base removal和tree-based removal中使用了這樣一個原理,即給事實集合以及tokens的數據結構上增添額外的指針,當某個事實被刪除時,可以沿着這些指針刪除需要刪除的元素。
在list-based removal(Scales ,1986)中,把每個事實w上添加一個包含此事實的tokens的鏈表。當w被刪除時,只要沿着此鏈表刪除這些tokens。缺點就是需要大量的空間來存儲鏈表,同時在創建一個新token時也可能花費大量的額外時間。
在tree-base removal中,在每個事實w上添加一個鏈表,這些鏈表指向把w作爲最後一個元素的tokens。同時,在每個tokens上,添加一個指向此tokens的子節點的鏈表。當w被刪除時,遍歷以tokens爲根的子樹,刪除子樹上的所有元素。當然,這些額外指針將佔用更多內存,同時,建立這些指針也耗費時間。經驗表明,採用此方法比原始方法要節省時間。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章