




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、動物分類專家系統(tǒng)設(shè)計與實現(xiàn) 班級:計算機0352姓名:劉一飛學號:200320010220一、 專家系統(tǒng)簡介: 專家系統(tǒng)是一個智能計算機程序系統(tǒng),其內(nèi)部含有大量的某個領(lǐng)域?qū)<宜降闹R與經(jīng)驗,能夠利用人類專家的知識和解決問題的方法來處理該領(lǐng)域問題。也就是說,專家系統(tǒng)是一個具有大量的專門知識與經(jīng)驗的程序系統(tǒng),它應用人工智能技術(shù)和計算機技術(shù),根據(jù)某領(lǐng)域一個或多個專家提供的知識和經(jīng)驗,進行推理和判斷,模擬人類專家的決策過程,以便解決那些需要人類專家處理的復雜問題,簡而言之,專家系統(tǒng)是一種模擬人類專家解決領(lǐng)域問題的計算機程序系統(tǒng)。 1.專家系統(tǒng)的特點專家系統(tǒng)具有下列3個特點:(1) 啟發(fā)性專家系統(tǒng)能運
2、用專家的知識與經(jīng)驗進行推理、判斷和決策。世界上的大部分工作和知識都是非數(shù)學性的,只有一小部分人類活動是以數(shù)學公式為核心的(約占8%)。即使是化學和物理學科,大部分也是靠推理進行思考的;對于生物學、大部分醫(yī)學和全部法律,情況也是這樣。企業(yè)管理的思考幾乎全靠符號推理,而不是數(shù)值計算。 (2) 透明性 專家系統(tǒng)能夠解釋本身的推理過程和回答用戶提出的問題,以便讓用戶能夠了解推理過程,提高對專家系統(tǒng)的信賴感。例如,一個醫(yī)療診斷專家系統(tǒng)診斷某病人患有肺炎,而且必需用某種抗生素治療,那么,這一專家系統(tǒng)將會向病人解釋為什么他患有肺炎,而且必須用某種抗生素治療,就像一位醫(yī)療專家對病人詳細解釋病情一樣。 (3)
3、靈活性專家系統(tǒng)能不斷地增長知識,修改原有知識,不斷更新。由于這一特點,使得專家系統(tǒng)具有十分廣泛的應用領(lǐng)域。 2.專家系統(tǒng)的優(yōu)點近十多年來,專家系統(tǒng)獲得迅速發(fā)展,應用領(lǐng)域越來越廣,解決實際問題的能力越來越大,這是專家系統(tǒng)的優(yōu)良性能以及對國民經(jīng)濟的重大作用決定的。具體地說,包括下列幾個方面: (1) 專家系統(tǒng)能夠高效率、準確、周到、迅速和不知疲倦地進行工作。 (2) 專家系統(tǒng)解決實際問題時不受周圍環(huán)境的影響,也不可能遺漏忘記。(3) 可以使專家的專長不受時間和空間的限制,以便推廣珍貴和稀缺的專家知識與經(jīng)驗。(4) 專家系統(tǒng)能促進各領(lǐng)域的發(fā)展,它使各領(lǐng)域?qū)<业膶I(yè)知識和經(jīng)驗得到總結(jié)和精煉,能夠廣泛有
4、力地傳播專家的知識、經(jīng)驗和能力。(5) 專家系統(tǒng)能匯集多領(lǐng)域?qū)<业闹R和經(jīng)驗以及他們協(xié)作解決重大問題的能力,它擁有更淵博的知識、更豐富的經(jīng)驗和更強的工作能力。(6) 軍事專家系統(tǒng)的水平是一個國家國防現(xiàn)代化的重要標志之一。(7) 專家系統(tǒng)的研制和應用,具有巨大的經(jīng)濟效益和社會效益。(8) 研究專家系統(tǒng)能夠促進整個科學技術(shù)的發(fā)展。專家系統(tǒng)對人工智能的各個領(lǐng)域的發(fā)展起了很大的促進作用,并將對科技、經(jīng)濟、國防、教育、社會和人民生活產(chǎn)生極其深遠的影響。二、算法設(shè)計本程序采用正向推理作為算法主體。正向推理就是從初始事實數(shù)據(jù)出發(fā),正向使用規(guī)則進行推理(即用規(guī)則前提與動態(tài)數(shù)據(jù)庫中的事實匹配,或用動態(tài)數(shù)據(jù)庫中的
5、數(shù)據(jù)測試規(guī)則的前提條件,然后產(chǎn)生結(jié)論或執(zhí)行動作),朝目標前進,其算法思想為:1、 將初始事實/數(shù)據(jù)置入動態(tài)數(shù)據(jù)庫。2、 將動態(tài)數(shù)據(jù)庫中的事實/數(shù)據(jù),匹配/測試目標條件,若目標條件滿足,則推理成功,結(jié)束。3、 用規(guī)則庫中各規(guī)則的前提匹配動態(tài)數(shù)據(jù)庫中的事實/數(shù)據(jù),將匹配成功的規(guī)則組成待用規(guī)則集。4、 若待用規(guī)則集為空,則運行失敗,退出。5、 將待用規(guī)則集中各規(guī)則的結(jié)論加入動態(tài)數(shù)據(jù)庫,或者執(zhí)行其動作,轉(zhuǎn)2.三、 源程序:#define ANIMAL_H#define True 1#define False 0#define DontKnow -1#include<stdio.h>#inc
6、lude<math.h>#include<string.h>/事實集(概念集)char *str="", "chew_cud" /* 1 */, "hooves" /* 2 */, "mammal" /* 3 */, "forward_eyes"/* 4 */, "claws" /* 5 */, "pointed_teeth" /* 6 */,"eat_meat" /* 7 */, "lay_eggs&
7、quot; /* 8 */, "fly" /* 9 */,"feathers" /* 10 */, "ungulate" /* 11 */, "carnivore" /* 12 */,"bird" /* 13 */, "give_milk" /* 14 */, "has_hair" /* 15 */,"fly_well" /* 16 */, "black&while_color"/* 17 */, "
8、;can_swim" /* 18 */,"long_legs" /* 19 */, "long_neck" /* 20 */, "black_stripes" /* 21 */,"dark_spots" /* 22 */, "tawny_color" /* 23 */, "albatross" /* 24 */,"penguin" /* 25 */, "ostrich" /* 26 */, "zebra"
9、/* 27 */,"giraffe" /* 28 */, "tiger" /* 29 */, "cheetah" /* 30 */,"0"/規(guī)則之前件(條件)集,注意與下面對應int rulep6=22,23,12,3,0,0, 21,23,12,3,0,0, 22,19,20,11,0,0,21,11,0,0,0,0, 17,19,20,13,-9,0,17,18,13,-9,0,0,16,13,0,0,0,0, 15,0,0,0,0,0, 14,0,0,0,0,0,10,0,0,0,0,0, 8,7,0,0,0
10、,0, 7,0,0,0,0,0,4,5,6,0,0,0, 2,3,0,0,0,0, 1,3,0,0,0,0;/規(guī)則之后件(結(jié)論)集,注意與上面對應int rulec= 30, 29, 28, 27, 26, 25, 24, 3, 3, 13, 13, 12, 12, 11, 11; /前個是要識別的動物/事實類class factprivate:int Number;/事實IDchar Name21; /事實名int Active; /激活標志int Succ;/事實斷言:真、假、不知道三種情況值public:fact *Next;/事實鏈表后繼指針 /* <Function 事實類構(gòu)造
11、函數(shù),由它激活事實對象集/> <para> Num:事實ID </para> <para> L:事實名 </para>*/fact(int Num,char *L)strcpy(Name,L);Number=Num;Active=False;/初始不激活Succ=DontKnow;/初始斷言不確定Next=NULL;/初始后繼為空char *GetName()/獲取事實名char *L;L=new char21;strcpy(L,Name);return L;int GetNumber()return Number; /獲取事實IDint
12、GetAct()return Active; /獲取事實激活標志int GetSucc()return Succ; /獲取事實斷言值/設(shè)置事實激活標志和斷言值void PutAct(const int Act0,int Suc0) Active=Act0; Succ=Suc0; /end factfact *Fact; /事實鏈表class list /前提(前提來源與事實集)鏈表類private:int Number; /前提ID,即事實IDpublic:list *Next; /前提鏈表后繼指針/*<Function 前提鏈表類構(gòu)造函數(shù)/> <para> Num:事
13、實ID </para>*/list(int Num) Number=Num; Next=NULL;int GetNumber()return Number; /獲取前提ID(也就是事實ID); /end listclass rule /規(guī)則類char *Name; /規(guī)則名list *Pre; /規(guī)則前件(前提、條件)鏈表頭指針int Conc; /規(guī)則后件(結(jié)論)ID(也是事實ID)public:rule *Next; /規(guī)則鏈表后繼指針rule(char *N,int P,int C); /規(guī)則類構(gòu)造函數(shù)rule(); /析構(gòu)函數(shù)int Query(); /推理機函數(shù)void
14、GetName() printf("%s%",Name); /輸出規(guī)則名;/* <Function 規(guī)則類構(gòu)造函數(shù),激活規(guī)則對象集/> <para>N:規(guī)則名</para><para>P:規(guī)則前件數(shù)組</para><para>C:規(guī)則后件ID</para>*/rule:rule(char *N,int P,int C)int i;list *L;Pre=NULL; /前提鏈頭指針初始化Next=NULL; /規(guī)則鏈后繼指針初始化Name=new charstrlen(N)+1;strcpy(
15、Name,N);i=0;while(Pi!=0) /有前提情況下L=new list(Pi+); /加入前提鏈L->Next=Pre; /注意:前插入Pre=L;Conc=C; /填入規(guī)則后件(結(jié)論)/* <Function 釋放規(guī)則鏈表節(jié)點之前提鏈空間/> <Note 規(guī)則鏈本身空間為釋放/>*/rule:rule()list *L;while(Pre)L=Pre->Next;delete Pre;Pre=L;delete Name;/* <Function 主要實現(xiàn)推理機/> <Return 規(guī)則使用成功與否/>*/int rul
16、e:Query()/ int i; char c; /保存用戶輸入按鍵符號 list *L; /臨時前提鏈 fact *F; /臨時事實鏈 L=Pre; /L指向前提鏈 F=Fact; if(L=NULL) printf("nError!"); /如果推理時,本規(guī)則前提鏈為空,出錯,后面while循環(huán)也退出! while(L!=NULL) /前提鏈未處理完 F=Fact; /F指向事實鏈表 for(;) /以當前前提,在事實鏈表中查詢(根據(jù)ID) /因為前提為“-事實ID”,表示該事實不成立,所以取絕對值 if(abs(L->GetNumber()=F->Get
17、Number() break; /一旦查詢到,有這樣的前提(不管其是否成立)則中止查詢。我們的知識庫必須保證一定能查許到,否則dead loop F=F->Next; /查詢下一事實 /退出循環(huán)時,F(xiàn)指向查詢到的事實節(jié)點 if(L->GetNumber()>0) /如果前提為真 if(F->GetSucc()=True) /而且事實鏈表中的這個事實斷言也為真 L=L->Next; /則本規(guī)則的當前前提在推理中滿足 continue; /繼續(xù)下一前提的判斷 if(F->GetSucc()=False) /Sorry,該前提在事實鏈表中斷言不成立 return
18、False; /該規(guī)則推理使用結(jié)束,直接返回 else/如果前提為假,表現(xiàn)為ID if(F->GetSucc()=True)/Sorry,該前提在事實鏈表中斷言卻為真 return False; /該規(guī)則推理使用結(jié)束,直接返回 if(F->GetSucc()=False) /同上類似 L=L->Next; continue; /end ifelse printf("%s(Y/N)",F->GetName(); /向用戶提問,這里簡單以事實名為問題 c=getchar(); /接受用戶輸入 flushall(); /*注意:事實鏈表中節(jié)點的Succ域指
19、:該事實的用戶斷言或中間推出的斷言*/ if(c='Y')|(c='y') /回答“是” if(L->GetNumber()>0) F->PutAct(1,True); /且當前規(guī)則中的當前前提要求為“真”,置激活和“真”斷言 if(L->GetNumber()<0) /且若當前規(guī)則中的當前前提要求為“假” F->PutAct(1,True); /置激活和用戶的斷言 return False; /本規(guī)則推理結(jié)束,不成功;后面的前提不判斷了! else /分析同上 if(L->GetNumber()<0) F->
20、;PutAct(-1,False);if(L->GetNumber()>0) F->PutAct(-1,False); return False; L=L->Next; /用戶斷言和當前規(guī)則的當前前提符合,則取當前規(guī)則的下一前提進行判斷! /end while /只要上述while循環(huán)正常退出,表明當前規(guī)則的所有前件都滿足,下面要得出當前規(guī)則的推理結(jié)論了 F=Fact; for(;) if(Conc=F->GetNumber() break; /在事實表中查找與當前規(guī)則得后件相同得事實(結(jié)論性) F=F->Next; if(Conc<24) /如果規(guī)則
21、后件(結(jié)論)不是最終最終性得(即不是種要識別得動物) F->PutAct(1,True); /那就是中間事實性結(jié)論,設(shè)置其激活和中間推理確證了的斷言 return False; /然后返回,本規(guī)則并不能結(jié)束整個推理 /當前規(guī)則之后件是最終結(jié)論,得出要識別的動物,返回真! printf("nThis annimal is %s",F->GetName(); return True;#endif#include "animal.h"int main(int argc, char* argv)/list *List;fact *F,*T;rule *Rule,*R;char ch8;int i=1;Fact=NULL; /事實鏈表初始為空while(stri0!='0') /在事實鏈表中填入事實,注意:前插入F=new fact(i,stri+);F->Next=Fact;Fact=F;F=Fact;Fact=NULL;while(F) /倒轉(zhuǎn)上面前插入的事實鏈表。inverted the upp
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 手術(shù)室護理指南:手術(shù)隔離技術(shù)
- 勝任才是硬道理培訓教材
- 中班健康:身體上的寶貝
- 糖尿病合并高血壓個案護理
- 轉(zhuǎn)移性骨腫瘤的護理及管理
- 2025年品質(zhì)培訓資料
- 住宅小區(qū)停車庫租賃合同
- 辦公家具定制化設(shè)計與售后服務承諾書
- 城市綠化帶場地無償使用與生態(tài)維護協(xié)議
- 電力設(shè)備與廠房使用權(quán)轉(zhuǎn)讓合同
- 小學語文擴句、縮句專題
- 農(nóng)村公路安全生命防護工程施工方案
- (部編版)統(tǒng)編版小學語文教材目錄(一至六年級上冊下冊齊全)
- 抗滑樁專項的施工組織方案[專家評審]
- 常用彈簧鋼號對照表
- 應用回歸分析(第三版)何曉群_劉文卿_課后習題答案_完整版
- 小學二年級下冊勞動教案
- 食品安全及衛(wèi)生保證措施
- 60m3臥式液化石油氣儲罐設(shè)計
- 樹脂的污染及處理
- 食品企業(yè)蟲害控制培訓課件.pptx
評論
0/150
提交評論