一種專家資料庫的開發與實現 (轉)

worldblog發表於2007-12-04
一種專家資料庫的開發與實現 (轉)[@more@]

一種專家的開發與實現


齊玉東 李逸波 傳統資料庫缺乏知識,只能處理靜態資料;而專家系統的狹窄應用領域及不能訪問現存資料庫,又防礙了專家系統的有效應用。資料庫和人工智慧這兩個領域單獨發展的侷限性,促使了兩者取長補短, 共同發展。這就是專家資料庫EDS(Expert Database Syst em)產生和發展的原因。通常,我們把既具有資料庫管理功能及演繹能力、又提供專家系統中若干良好的資料庫系統,稱為專家資料庫。EDS的基本思想是把以知識表達和知識處理為主的專家系統ES(Expert System )技術引進傳統資料庫,使二者有機結合,以開發出能共享資訊的面向知識處理的問題求解系統。目前,EDS主要採用系統耦合--"緊耦合" 及"松耦合"來實現。緊耦合指將規則管理系統整合到MS之中,使DBM S既管理資料庫又管理規則庫。這種方法實現難度較大。而松耦合是指將一個現成的專家系統外殼和一個現成的DBMS作為兩個獨立的子系統結合在一起,它們分別管理規則庫和資料庫。採取松耦合實現策略可以充分發揮原有兩個系統的全部功能,而不需對原系統進行任何改動。它只需設計一個連線ES/DBMS的高效、靈活的介面模組,以協調二者的工作,所以實現起來時間短、見效快。 一、故障診斷專家系統的系統結構 在故障診斷系統HF-2000的研製中,我們採取松耦合策略建立了一個故障診斷專家資料庫系統。該系統是一個產生式系統,採用深度優先策略作為其控制策略。系統根植於W indows平臺,採用了面向 的設計技術及先進的資料庫技術;在資料庫端,我們採用了基於Se rver/Client機制的MS 的資料庫技術。在推理控制端,利用Visual C++進行,實現了一個推理機。推理機與資料庫之間的介面則透過ODBC 直接來實現對資料庫的訪問。本系統的構造模型是以資料庫為載體的構模形式,系統機構圖如1所示。圖1 圖1中知識獲取結構負責建立、修改與擴充各個資料庫;解釋機構用於對求解過程作 出說明,指出求解成功或失敗的原因,並回答提出的問題。事實庫用來存放輸入的原始事實及中間結果;字典庫用來存放規則中事實的基本定義和說明;規則庫用來存放規則;垃圾桶用來存放推理中失敗的推理路徑。 二、規則與資料庫的設計 1. 產生式規則的模型 規則的一般形式是: if〈前提〉then〈結論〉 它表示當〈前提〉成立時,得出〈結論〉的可信度為。其中〈前提〉是事實或斷言的合取形式。本系統中的規則模型請參考圖2。 2. 事實庫 結構:FACT_DB(Fact_ID,Rank,No) 用途:存放輸入的原始事實,中間結果及最後結果。 其中:Fact_ID是事實Fact的編碼;Rank用來表示系統特定部分,比如說"放大級"、"槽路"等;No表示特定部分中的部件的編號;如"1"表示"槽路"部分1號管、"2"表示"槽路"部分2號管等。 3. 字典庫 結構:DICT_DB(Fac_ID,Component,Appear,Why,Known) 用途:存放規則庫中的前提條件和結論及其編碼。 其中:Fact_ID為事實編碼;Component為部件名稱;Appear是對Fac t_ID的自然語言解釋;Known用來表示該事實已知或未知,以防止該斷言的重複求證。 4. 規則庫 規則庫中包括四個表(TABLE),它們是規則前件庫(PRE_TABLE)、已啟用的規則前件庫(ACTIVE_PRE TABLE)、規則後件庫(ACT_TABLE) 和已啟用的規則後件庫(ACTIVE_ACT_TAB LE)。圖2 (1)規則前件庫 結構:PRE_TABLE (Rule_Name, Fact_ID) 用途:存放各條規則對應的前提條件。 其中:Rule_Name為規則名;Fact_ID為Rule_Name規則的一個與條件;一條規則的n個與條件在該庫中就有n條對應該規則的記錄。 (2)已啟用的規則前件庫 結構:ACTIVE_PRE_TABLE(Fact_ID,Rank,No) 用途:存放已啟用的前提條件,以避免規則各前提條件的重複匹配。 其中:Fact_ID為Rule_Name規則的一個與條件;Rank用來表示系統特定部分;No表示特定部分中的部件的編號。 (3)規則後件庫 結構:ACT_TABLE (Rule_Name, Fact_ID, Num, Num2) 用途:存放規則對應的結果。 其中:Rule_Name為規則名;Fact_ID為Rule_Name規則的結果;Num 表示該規則前提條件的個數;Num2為Num欄位的輔助值。 (4)已啟用的規則後件庫 結構:ACTIVE_ACT_TABLE(Rule_Name, Rank,No) 用途:存放已啟用的後件,以避免規則各結論的重複匹配。 其中:Rule_Name為規則名;Rank用來表示系統特定部分;No表示特定部分中的部件的編號。 5. 垃圾桶 結構:GARBAGE_BIN_DB(Fact_ID, Rule_Name, Pre_Num) 用途:記錄剪去枯死枝葉的原因。 其中:Fact_ID為事實編碼;Rule_Name為應用於該結點的規則名,P re_Num為實際匹配的前提條件數。 三、控制機構的設計 我們用C++語言實現了一個採用深度優先策略的反向推理機。整個推理過程。就是一棵搜尋樹邊長枝邊修枝的過程推理機的源程式如下: int CCause::Reason(RTree*rTree) { RULE prule,rule; int ruleFlag; while(1){ while(true){ if(rTree- choose rule(&prule)==1 { //對當前葉節點選擇適用的規則 rTree- SctAct(prule); //把當前應用規則放入啟用的規則表ar ruleFlag=1; break; } else{ ruleFlag=0;//若無規則可用,設定失敗標誌 if(depth return 0; else{ rTree- ClipBranch(depth--;path++);//剪去枯枝 if(depth!=0) return 0; //若不是樹根,返回失敗標誌;否則繼續推理 }}} rTree- SetLeaf(&prule); //設定第一個前提為當前葉節點 depth++; while(1){ int iSucc=0; iSucc=rTree- SuccessDirect (); //事實是否立即成立 if(iSucc==0) { //若事實庫中沒有對應事實且該節點不是元件,則搜尋規則 while(1){ if(rTree- choose rule(&rule)==1) { //搜尋對應於當前葉節點的規則 ruleFlag=1; if(BackReason(rTree)==1) { //若事實成立,則對下一前提進行求證; 否則選用下一條規則推理 rTree UnderSuccess(); //事實成立,重新設定當前前提為當前葉節點 break;}} else{ ruleFlag=0;//若無規則可選,設定失敗標誌 break;}}} if(iSucc==1){//若事實立即不成立,則設定失敗標誌 ruleFlag=0; break;} if(ruleFlag==0) //當前應用規則失敗,選擇下一條規則推理 break; else{ if(prule.num==prule.num2) //上一個前提求證成功,判斷是否還有未求證的前提 break://若沒有則退出迴圈 else rTree- SetLeaf(&prule); //若有則設定此前提為當前葉節點 }} if(ruleFlag==1){ rTree- ProduceNewFact(); //若事實求證成功則往事實庫中新增此事實 return 1; //返回成功標誌 }}} (作者地址:山東煙臺海軍航空工程學院研究生隊,264001)




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987988/,如需轉載,請註明出處,否則將追究法律責任。

相關文章