規則引擎研究(一)——Rete算法(5)——一種產生式的優化算法

(注:本文參考自
Toru Ishida. An Optimization Algorithm for Production Systems. IEEE TRANSACTIONS ON KNOWLEDGE AND DATA ENGINEERING, VOL. 6, NO. 4. AUGUST  1994.)
 
產生式系統的優化算法


一、 簡介


產生式系統的系統隨着事實數目的增多,性能也跟着下降。因爲在大多數的系統中,匹配過程中的連接(join)操作花費的時間與事實數目的平方成正比。另外,不當的條件排列順序可以產生大量的中間數據,從而導致大量的join操作。
爲了解決這個問題,ART、YES/OPS以及其他的一些系統允許用戶自己設定join結構。在沒有一個專門的優化器來確定join的最佳機構時,專家系統的設計者一般都是採用手動的方式來設定join結構。本文提出了一種優化算法可以減小產生式系統中的join操作的開銷。此算法並不是直接將啓發式算法用在規則上,而是列舉可能的join結構,從而選出最佳結構。主要的思想是採用一些有效約束條件來減少可能結構數目。引入一個代價模型(cost model)來估計在不同join結構中的進行join操作的代價。測試結果顯示,採用本算法,可以產生和手動設置一樣有效的程序。


二、 Join拓撲結構(topological transformation)


規則的條件可以有多種拓撲結構,如下圖所示,條件(a, b, c, d)可以有以下四種結構,如果條件的順序可變,則join的結構可以達到4*4!=96種。因此,可能的join結構的數目與條件的個數的指數在一個數量級上。
 
三、 Rete算法特點


Rete算法中的啓發式(heuristic)特點有:
3.1  約束性條件優先(place restrictive conditions first)
中間數據(即tokens)所進行的操作佔據了總的join操作的絕大部分。減少中間數據的方法之一就是把約束性條件先進行join操作。如下圖所示,含有事實越少的alpha內存越優先。
 
3.2  將易變的規則置後(place volatile conditions last)
假設有N條規則,如果添加(或刪除)第一條規則對應的事實,則其餘N-1個規則的節點的Join操作到要重複進行。但是,如果此事實對應的規則是第N條,那麼只要進行一次join操作。爲了減少join操作的次數,把易變的事實對應的規則放在放在後面。如下圖所示。
 
3.3  在規則間共享Join塊(share join clusters among rules)
如果某個Join塊(join cluser)被N條規則共享,則相當於此join操作的代價降低到原來的1/n。爲了獲得更大的共享塊,一般改變規則的Join結構。如下圖所示。
以上啓發式算法是rete算法的重要特點。但是,因爲不同的啓發式算法之間存在衝突,因此專家系統設計者在如何設計一個更好的Join結構時往往要走很多彎路。本文提出的優化算法可以實現join結構的各種拓撲轉換,同時自動估計各種結構的性能。
 
四、 代價模型(cost model)
本文引入的代價模型如下圖所示:
在代價模型中,每個節點n都有五個參數:Token(n), Memory(n), Test(n), Cost(n)和Ratio(n)。Token(n)指從節點n傳遞到其後繼節點的所有tokens的數目。Memory(n)指n節點內存中平均存儲的tokens數目。Test(n)指n節點總共進行的join測試數目。Cost(n)指在n節點進行的join操作所花費的代價,用一個代價函數來確定。Ration(n)是n節點上join測試成功的比例。
在系統優化時,創建不同的Join結構並且評價其性能。
在開始優化前,產生式系統先運行一邊,記錄下每個節點的Test(n), Token(n), Memory(n)。

 

五、 優化算法


正如第三部分所述,啓發式算法不能單獨應用,因爲它們之間可能會有衝突。同時,join結構的可能數目與節點數的指數級是一個數量級的,

因此,產生——測試(generate-and-test)的方法不能解決這個問題。本文中採用不同的約束限制條件來產生可能的Join結構,極大減少了需

要檢測的join結構的數目。


5.1  具體算法步驟是:
1、 根據程序的運行確定各個規則的代價大小,按降序排列。從代價最高的規則開始優化。這樣保證代價較高的規則有較大的自由度來選

擇Join結構。
2、 在優化各個規則前,先把每個alpha節點和beta節點加入到join-list中去。
3、 在優化每個節點時,從Join-list上選擇兩個節點,創建它們的join節點。如果在join-list沒有與新創建的Join結構相同的節點,則

把此節點加入到Join-list中去。
4、 創建每個可能的Join結構後,從中選出最低代價的結構。


5.2  約束條件
上面的算法用到了下面的約束條件來減少可能的join結構數目。
 最少代價約束(minimal-cost constraint)
最少代價約束是指,如果某個將要創建的節點比目前Join-list中已存在的節點的代價高,則不創建此節點。形式化定義爲,如果滿足下麪條件

,則不創建s節點:
 
其中,conditions(s)指s節點的Join結構中的條件集合。
 連接約束(connectivity constraint)
連接約束是指,當兩個節點之間沒有共同變量時,不創建這兩個節點的join節點。例如,p, q是規則中的alpha節點。如果滿足如下條件,則不

創建l, r的連接節點s:
 
其中,variables(l)指l的join結構中的變量結合。
在下圖所示的例子中,節點b和d不能執行join操作,因爲它們之間沒有共享變量(滿足條件1),同時存在一個c節點,使它們滿足條件2。但a,

b可以執行join操作,因爲,雖然滿足條件1但不滿足條件2。
 
 優先級約束
根據統計數據可以確定各個alpha的節點的優先級。優先級約束是指,當進行join操作時,先把優先級高的節點進行Join。更爲形式化的定義

:p, q都是alpha節點,且p>q(即p的優先級高於q)。那麼不創建l, r的join節點,如果滿足如下條件:
 
上面p>q的定義是當且僅當token(p)>token(q)且memory(p)>memory(q)。引入條件二是爲了防止這樣一種情況,即,當l和r因爲優先級約束不能

Join時,l和p因爲連接約束也不能進行join。連接約束和優先級約束可以顯著的減少搜索可能範圍,但是有可能漏掉在最優結構。


六、 試驗結果


把本文所述的優化器用於類似與ops5的系統中。系統配置如下圖所示:
 
實驗結果顯示,採用優化後,join節點減少到原來的1/3,CPU運行時間減少到原來的1/2,比採用手動優化的效率還高。
不採用優先級約束得到的join結構數目是原來的3.7倍,而同時不使用優先級和連接約束,得到的是原來的6.3倍。根據優化時間與Join結構數

目的平方成正比的規律,優化時間相應的是原來的14到40倍。
本文引入的算法在一個專家系統上測試表明,使用此優化算法同手動優化一樣有效。文中提出的代價模型在優化算法中非常重要,但一個完全

精確的模型很難達到。

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