




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上學(xué)生實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)課名稱:人工智能 實(shí)驗(yàn)項(xiàng)目名稱:產(chǎn)生式系統(tǒng)實(shí)驗(yàn) 專業(yè)名稱:計(jì)算機(jī)科學(xué)與技術(shù) 班級(jí): 學(xué)號(hào):6 學(xué)生姓名:程文迪 教師姓名:陳亮亮 2015 年 10 月 25 日實(shí)驗(yàn)日期: 2015 年 10 月 23 日 實(shí)驗(yàn)室名稱: 明遠(yuǎn)2203 1 實(shí)驗(yàn)名稱:產(chǎn)生式系統(tǒng)實(shí)驗(yàn)二實(shí)驗(yàn)?zāi)康呐c要求:1、確定推理方法(正向還是反向),并根據(jù)問(wèn)題設(shè)計(jì)并實(shí)現(xiàn)一個(gè)簡(jiǎn)單的推理機(jī)(要求涉及:匹配、沖突消解)2、規(guī)則庫(kù)要求至少包含15條規(guī)則(知識(shí)規(guī)則如何存儲(chǔ)?)3、推理機(jī)和知識(shí)庫(kù)必須分離4、初始事實(shí)可以任意給定,輸入初始事實(shí)后能夠得到推理結(jié)果5、設(shè)計(jì)合理的人機(jī)界面,解釋模塊提供查詢規(guī)
2、則的功能6、可以不考慮知識(shí)庫(kù)管理模塊7、提交實(shí)驗(yàn)報(bào)告8、報(bào)告中要有推理樹三實(shí)驗(yàn)內(nèi)容:本實(shí)驗(yàn)我設(shè)計(jì)了一個(gè)動(dòng)物識(shí)別的小型專家系統(tǒng),主要是根據(jù)一些觀察到的事實(shí),依據(jù)系統(tǒng)給出的一系列規(guī)則來(lái)進(jìn)行正向推理,將逐漸的推導(dǎo)出結(jié)果。本次實(shí)驗(yàn)設(shè)計(jì)了一個(gè)簡(jiǎn)單的推理機(jī),推理機(jī)給出的推理結(jié)果有“它是_動(dòng)物”、“條件不足,不能推出它是什么動(dòng)物”、“條件有沖突,沒有這樣的動(dòng)物”或“條件不完全,但它有_的部分特征”。部分推理樹如下:專心-專注-專業(yè)四、算法描述:1.表示事實(shí)和特征的知識(shí)。 在本程序中,我將動(dòng)物的特征寫入data.txt,將規(guī)則記入rules.txt,將動(dòng)物種類記為goal.txt。通過(guò)函數(shù)void readF
3、iles()readGoal();readCod();readRule();/reaFiles讀入所有數(shù)據(jù)分別存放于goal,rule,cod自定義數(shù)組中。2. 綜合數(shù)據(jù)庫(kù)和規(guī)則庫(kù)實(shí)現(xiàn)綜合數(shù)據(jù)庫(kù)(包括特征和目標(biāo)) typedef structint xuh;/存放編號(hào) char valu50;/存放具體內(nèi)容Node;Node goal20;Node cod50;void readCod()FILE *fp;int i;if(fp=fopen("data.txt","r")=NULL)printf("cannot open datan"
4、);exit(0);i=0;while(fscanf(fp,"%d %s",&codi.xuh,&codi+.valu)!=EOF);fclose(fp);/readCodvoid readGoal()FILE *fp;int i;if(fp=fopen("goal.txt","r")=NULL)printf("cannot open goaln");exit(0);i=0;while(fscanf(fp,"%d %s",&goali.xuh,&goali+.va
5、lu)!=EOF);fclose(fp);/readGoal規(guī)則庫(kù)typedef structint rslt;int codNum;/記載前提的個(gè)數(shù)int cod10;/記載前提的序號(hào)int used;/記載是否已匹配成功Nrule;Nrule rule50;void readRule()FILE *fp;int i;int tempxuh,tempcodn;char ch;if(fp=fopen("rules.txt","r")=NULL)printf("cannot open rulesn");exit(0);i=0;rulei
6、.codNum=0;while(ch=fgetc(fp)!=EOF)if(i=15)i=i;tempcodn=0;while(ch!='n'&&ch!=EOF)/每一條規(guī)則tempxuh=0;while(ch<='9'&&ch>='0')tempxuh=tempxuh*10+ch-'0'/ch=fgetc(fp);rulei.codtempcodn+=tempxuh;tempxuh=0;if(ch='=')/下一個(gè)是結(jié)論ch=fgetc(fp);while(ch<=
7、'9'&&ch>='0')tempxuh=tempxuh*10+ch-'0'ch=fgetc(fp);rulei.rslt=tempxuh;/ifelse if(ch='*')ch=fgetc(fp);rulei.codNum+;i+;ch=fgetc(fp);rulenum=i;fclose(fp);3. 規(guī)則庫(kù)的匹配算法是什么?如何選用可用規(guī)則集中的規(guī)則?分別使用哪些函數(shù)實(shí)現(xiàn)的? 程序中的正向搜索是在void main()中調(diào)用forwardFinger實(shí)現(xiàn)的。正向搜索是從下向上的推理。由于建立規(guī)則庫(kù)時(shí)的
8、內(nèi)在要求,即子規(guī)則必在父規(guī)則前,故進(jìn)行正向推理的時(shí)候只要將規(guī)則庫(kù)從前到后掃一遍看是否能由規(guī)則推出相應(yīng)結(jié)果即可。如果能匹配推出結(jié)果則看該結(jié)果是否為動(dòng)物,如果已經(jīng)推出動(dòng)物則推理成功。否則更新事實(shí)庫(kù),匹配下一個(gè)規(guī)則。代碼如下:void forwardFinger()int flag;/1:工作已完成 0:還未完成int flagFit;int flagCNew;/記錄本次循環(huán)有沒有推出新事實(shí)int fitPart;/1:有部分符合條件int i,j,k;flag=0;flagCNew=1;while(!flag&&flagCNew=1)flagCNew=0;for(j=0;j<
9、rulenum&&rulej.used!=1&&flag=0;j+)/一條規(guī)則if(rulej.codNum<=inpCod.curnum)/事實(shí)數(shù)不小于當(dāng)前規(guī)則所要求的條件數(shù)flagFit=1;for(i=0;i<rulej.codNum&&flagFit=1;i+)fitPart=0;for(k=0;k<inpCod.curnum;k+)if(rulej.codi=inpCod.codk.xuh)fitPart=1;flagFit=fitPart;if(flagFit=1)flagCNew=1;fitOneRule(j,&a
10、mp;flag);/有事實(shí)匹配時(shí),就處理把結(jié)論加入事實(shí)庫(kù)等事情flagFit=0;/whileif(flagCNew=0)printf("條件不足,不能推出它是什么動(dòng)物");3.推理過(guò)程 本次實(shí)驗(yàn)采用的是正向推理的方法,是從已知事實(shí)出發(fā),通過(guò)規(guī)則庫(kù)求得結(jié)論,也稱為自底向上,或稱為數(shù)據(jù)驅(qū)動(dòng)方式。這種推理方式是正向使用原則,即問(wèn)題的初始狀態(tài)作為初始數(shù)據(jù)庫(kù),在僅當(dāng)數(shù)據(jù)庫(kù)中的事實(shí)滿足某條規(guī)則的前提時(shí),這條規(guī)則才能夠被使用。程序中采用的是基于用戶按照規(guī)則點(diǎn)擊,逐步得出結(jié)果的。正向推理的步驟:步驟1 將初始事實(shí)置入動(dòng)態(tài)數(shù)據(jù)庫(kù);步驟2 用動(dòng)態(tài)數(shù)據(jù)庫(kù)中的事實(shí),匹配目標(biāo)條件,若目標(biāo)條件滿足,
11、則推理成功,結(jié)束。 步驟3 用規(guī)則庫(kù)中各規(guī)則的前件匹配動(dòng)態(tài)數(shù)據(jù)庫(kù)中的事實(shí),將匹配成功的規(guī)則組成沖突集;步驟4 若沖突集為空,則運(yùn)行失敗,退出。步驟5 對(duì)沖突集做處理,對(duì)選擇執(zhí)行的各規(guī)則,將其結(jié)論加入動(dòng)態(tài)數(shù)據(jù)庫(kù),或執(zhí)行其動(dòng)作,轉(zhuǎn)步驟2。推理的流程圖5 源程序:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream.h>#include<math.h>#define MAXNUM 50typedef structint xuh;char valu50;N
12、ode;typedef structint stat;/0:還未訪問(wèn) 1:至少用過(guò)一次 2:沒用過(guò)但不沖突int xuh;NFact;typedef structint snum;/開始時(shí)的事實(shí)數(shù)int curnum;/目前的事實(shí)數(shù)int notEnoughFlag;/當(dāng)最后若所有未用過(guò)的條件支持一個(gè)結(jié)論,但條件不足時(shí),置1NFact codMAXNUM;Fact;typedef structint rslt;int codNum;/記載前提的個(gè)數(shù)int cod10;/記載前提的序號(hào)int used;/記載是否已匹配成功Nrule;int codnum=28;int goalnum=15;in
13、t rulenum=0;Node goal20;Node cod50;Nrule rule50;Fact inpCod;void readGoal()FILE *fp;int i;if(fp=fopen("goal.txt","r")=NULL)printf("cannot open goaln");exit(0);i=0;while(fscanf(fp,"%d %s",&goali.xuh,&goali+.valu)!=EOF);fclose(fp);/readGoalvoid readRule(
14、)FILE *fp;int i;int tempxuh,tempcodn;char ch;if(fp=fopen("rules.txt","r")=NULL)printf("cannot open rulesn");exit(0);i=0;rulei.codNum=0;while(ch=fgetc(fp)!=EOF)if(i=15)i=i;tempcodn=0;while(ch!='n'&&ch!=EOF)/每一條規(guī)則tempxuh=0;while(ch<='9'&&
15、;ch>='0')tempxuh=tempxuh*10+ch-'0'/ch=fgetc(fp);rulei.codtempcodn+=tempxuh;tempxuh=0;if(ch='=')/下一個(gè)是結(jié)論ch=fgetc(fp);while(ch<='9'&&ch>='0')tempxuh=tempxuh*10+ch-'0'ch=fgetc(fp);rulei.rslt=tempxuh;/ifelse if(ch='*')ch=fgetc(fp);r
16、ulei.codNum+;i+;ch=fgetc(fp);rulenum=i;fclose(fp);void readCod()FILE *fp;int i;if(fp=fopen("data.txt","r")=NULL)printf("cannot open datan");exit(0);i=0;while(fscanf(fp,"%d %s",&codi.xuh,&codi+.valu)!=EOF);fclose(fp);/readCodvoid readFiles()readGoal();r
17、eadCod();readRule();/reaFilesint inputCod()int retflag=1;int temp;int i;i=0;doscanf("%d",&temp);inpCod.codi+.xuh=temp;if(temp>=codnum)printf("特征序號(hào)不能大于%d,請(qǐng)重新輸入:n",codnum-1);fflush(stdin);/清空輸入緩沖區(qū)retflag=0;while(temp!=-1&&temp<codnum);inpCod.snum=i-1;inpCod.curnum
18、=inpCod.snum;return retflag;/inputCod()int onlyExtra(int inpCodXuh,int rslt)int i,j;int fa50;int head;int tail;int retflag;int tempstate50;/若放入隊(duì)列中,則記錄為1fa0=rslt;tempstaterslt=1;head=0;tail=1;retflag=0;while(head!=tail&&retflag!=1)for(j=0;j<rulenum;j+)if(rulej.rslt=fahead)for(i=0;i<rule
19、j.codNum;i+)if(inpCod.codinpCodXuh.xuh=rulej.codi)retflag=1;elseif(tempstaterulej.codi!=1)fatail+=rulej.codi;tempstaterulej.codi=1;head+;return retflag;/onlyExtraint isContradict(int rslt)int i;int flag;flag=0;for(i=0;i<inpCod.curnum&&flag=0;i+)if(inpCod.codi.stat=0&&inpCod.codi.x
20、uh!=rslt)if(onlyExtra(i,rslt)inpCod.codi.stat=2;flag=0;elseflag=1;return flag;/isContradict()void isAim(int rslt,int *doneflag)if(rslt>=codnum)/已推理出一個(gè)動(dòng)物*doneflag=1;if(isContradict(rslt)printf("條件有沖突,沒有這樣的動(dòng)物。n");elseprintf("它是%s。n",goalrslt-codnum.valu);/isAim()void addFact(int
21、 ruleXuh,int *doneflag)int i;int flagHave;flagHave=0;/標(biāo)志此次推出的結(jié)論是否已在inpCod.cod中for(i=0;i<inpCod.curnum;i+)if(inpCod.codi.xuh=ruleruleXuh.rslt)flagHave=1;if(flagHave=0)inpCod.codinpCod.curnum.xuh=ruleruleXuh.rslt;inpCod.curnum+;isAim(ruleruleXuh.rslt,doneflag);/addFact()void fitOneRule(int ruleXuh,
22、int *doneflag)int i,k;for(i=0;i<ruleruleXuh.codNum;i+)/作inpCod的訪問(wèn)標(biāo)記for(k=0;k<inpCod.curnum;k+)if(ruleruleXuh.codi=inpCod.codk.xuh)inpCod.codk.stat=1;/forruleruleXuh.used=1;addFact(ruleXuh,doneflag);/fitOneRule()void countNoUseF(int *recNoUseF,int *recNoUseFNum)int i;int tempstate50;/若已經(jīng)在recNoU
23、seF中記錄過(guò),就記為1for(i=0;i<inpCod.curnum;i+)if(inpCod.codi.stat=0&&tempstateinpCod.codi.xuh!=1)recNoUseF*recNoUseFNum=inpCod.codi.xuh;+(*recNoUseFNum);tempstateinpCod.codi.xuh=1;/countNoUseF()void printLikeClouse(int tempflag,int ruleXuh,int *printRec)Node *result;int resultXuh;result=cod;resu
24、ltXuh=ruleruleXuh.rslt;printRecruleruleXuh.rslt=1;if(resultXuh>27)result=goal;resultXuh-=28;if(tempflag=0)printf("條件不完全,但它有%s",resultresultXuh.valu);/elseprintf("和%s",resultresultXuh.valu);/printLikeClouse()void maybeAnimal()int i,j,k;int countLikeCurRule;int recNoUseF50,recNo
25、UseFNum;int printRec50;/若前面已推出這個(gè)"可能結(jié)論",就置為1int tempflag;recNoUseFNum=0;countNoUseF(recNoUseF,&recNoUseFNum);tempflag=0;for(i=0;i<rulenum;i+)countLikeCurRule=0;for(j=0;j<rulei.codNum;j+)for(k=0;k<recNoUseFNum;k+)if(recNoUseFk=rulei.codj)+countLikeCurRule;if(countLikeCurRule*2&g
26、t;=rulei.codNum&&printRecrulei.rslt!=1)printLikeClouse(tempflag,i,printRec);tempflag=1;if(tempflag=0)printf("條件不足,不能推出它是什么動(dòng)物");elseprintf("的部分特征");printf("。n");/maybeAnimal()void forwardFinger()int flag;/1:工作已完成 0:還未完成int flagFit;int flagCNew;/記錄本次循環(huán)有沒有推出新事實(shí)int
27、fitPart;/1:有部分符合條件int i,j,k;flag=0;flagCNew=1;while(!flag&&flagCNew=1)flagCNew=0;for(j=0;j<rulenum&&rulej.used!=1&&flag=0;j+)/一條規(guī)則if(rulej.codNum<=inpCod.curnum)/事實(shí)數(shù)不小于當(dāng)前規(guī)則所要求的條件數(shù)flagFit=1;for(i=0;i<rulej.codNum&&flagFit=1;i+)fitPart=0;for(k=0;k<inpCod.curnum;k+)if(rulej.codi=inpCod.codk.xuh)fitPart=1;flagFit=fitPart;if(flagFit=1)flagCNew=1;fitOneRule(j,&flag);/有事實(shí)匹配時(shí),就處理把結(jié)論加入事實(shí)庫(kù)等事情flagFit=0;/whileif(flagCNew=0)maybeAnimal();/當(dāng)沒有推出任何動(dòng)物時(shí),看是否極有可能得出一些結(jié)論/finger()void printChoice()/打印選項(xiàng)int i,j;j=0;for(i=0;i<codnum;i+)printf(&quo
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 健身俱樂部入股協(xié)議書
- 食堂費(fèi)用補(bǔ)貼協(xié)議書
- 高壓配電施工協(xié)議書
- 集體資金使用協(xié)議書
- 長(zhǎng)春專利保護(hù)協(xié)議書
- 面試審查就業(yè)協(xié)議書
- 資金撥付告知協(xié)議書
- 集中斗毆和解協(xié)議書
- 跟兄弟分錢寫協(xié)議書
- 餐廳消防責(zé)任協(xié)議書
- 超聲引導(dǎo)下的星狀神經(jīng)節(jié)阻滯
- MOOC 學(xué)術(shù)英語(yǔ)寫作-東南大學(xué) 中國(guó)大學(xué)慕課答案
- 高等數(shù)學(xué)(下)無(wú)窮級(jí)數(shù)PPT通用PPT課件
- 大傾角皮帶輸送機(jī)設(shè)計(jì)(全套圖紙)
- 《老北京四合院》
- 常用化學(xué)中英文名詞對(duì)照表
- 第三章磁功能玻璃
- 國(guó)家開放大學(xué)《機(jī)械制造基礎(chǔ)》章節(jié)測(cè)試題參考答案
- 大學(xué)生對(duì)美團(tuán)滿意調(diào)查問(wèn)卷
- 火針治療同意書
- 軸承的計(jì)算公式
評(píng)論
0/150
提交評(píng)論