版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
/人工智能課內(nèi)實(shí)驗(yàn)報告〔8次學(xué)院:自動化學(xué)院班級:智能1501姓名:劉少鵬〔34學(xué)號:06153034目錄課內(nèi)實(shí)驗(yàn)1:猴子摘香蕉問題的VC編程實(shí)現(xiàn)……1課內(nèi)實(shí)驗(yàn)2:編程實(shí)現(xiàn)簡單動物識別系統(tǒng)的知識表示………5課內(nèi)實(shí)驗(yàn)3:盲目搜索求解8數(shù)碼問題………18課內(nèi)實(shí)驗(yàn)4:回溯算法求解四皇后問題………33課內(nèi)實(shí)驗(yàn)5:編程實(shí)現(xiàn)一字棋游戲……………37課內(nèi)實(shí)驗(yàn)6:字句集消解實(shí)驗(yàn)…………………46課內(nèi)實(shí)驗(yàn)7:簡單動物識別系統(tǒng)的產(chǎn)生式推理………………66課內(nèi)實(shí)驗(yàn)8:編程實(shí)現(xiàn)D-S證據(jù)推理算法……78人工智能課內(nèi)實(shí)驗(yàn)報告實(shí)驗(yàn)1:猴子摘香蕉問題的VC編程實(shí)現(xiàn)學(xué)院:自動化學(xué)院班級:智能1501姓名:劉少鵬〔33學(xué)號:06153034日期:2017-3-810:15-12:00實(shí)驗(yàn)1:猴子摘香蕉問題的VC編程實(shí)現(xiàn)實(shí)驗(yàn)?zāi)康摹?熟悉謂詞邏輯表示法;〔2掌握人工智能謂詞邏輯中的經(jīng)典例子——猴子摘香蕉問題的編程實(shí)現(xiàn)。二、編程環(huán)境VC語言問題描述房子里有一只猴子〔即機(jī)器人.位于a處。在c處上方的天花板上有一串香蕉.猴子想吃.但摘不到。房間的b處還有一個箱子.如果猴子站到箱子上.就可以摸著天花板。如圖1所示.對于上述問題.可以通過謂詞邏輯表示法來描述知識。要求通過VC語言編程實(shí)現(xiàn)猴子摘香蕉問題的求解過程。圖1猴子摘香蕉問題源代碼#include<stdio.h>unsignedinti;voidMonkey_Go_Box<unsignedcharx,unsignedchary>{ printf<"Step%d:monkey從%c走到%c\n",++i,x,y>;//x表示猴子的位置.y為箱子的位置}voidMonkey_Move_Box<charx,chary>{ printf<"Step%d:monkey把箱子從%c運(yùn)到%c\n",++i,x,y>;//x表示箱子的位置.y為香蕉的位置}voidMonkey_On_Box<>{ printf<"Step%d:monkey爬上箱子\n",++i>;}voidMonkey_Get_Banana<>{ printf<"Step%d:monkey摘到香蕉\n",++i>;}voidmain<>{unsignedcharMonkey,Box,Banana; printf<"********智能1501班**********\n">; printf<"********06153034************\n">; printf<"********劉少鵬**************\n">; printf<"請用abc來表示猴子箱子香蕉的位置\n">; printf<"Monkey\tbox\tbanana\n">;scanf<"%c",&Monkey>; getchar<>; printf<"\t">;scanf<"%c",&Box>; getchar<>; printf<"\t\t">; scanf<"%c",&Banana>; getchar<>; printf<"\n操作步驟如下\n">;if<Monkey!=Box> { Monkey_Go_Box<Monkey,Box>; }if<Box!=Banana> { Monkey_Move_Box<Box,Banana>; } Monkey_On_Box<>; Monkey_Get_Banana<>; printf<"\n">; getchar<>;}實(shí)驗(yàn)結(jié)果相關(guān)截圖六、心得體會通過本次實(shí)驗(yàn).我初步了學(xué)會了使用VC的新建工程.并且進(jìn)行簡單的程序編寫。此外我還學(xué)會如何使用一些謂詞來解決生活中的一些簡單問題.并且用VC編程給出具體的操作步驟,感覺對VC編程有了新的認(rèn)識。在實(shí)驗(yàn)中我也遇到過許多問題.比如在我寫完代碼進(jìn)行編譯時總是會出現(xiàn)一個錯誤"fatalerrorC1010:在查找預(yù)編譯頭時遇到意外的文件結(jié)尾.是否忘記了向源中添加"#include‘stdafx.h’"關(guān)于這個錯誤我我問了幾個同學(xué)得不出答案后.我決定通過上網(wǎng)查找.最終找到了解決方法.需要在該項目的每一個cpp結(jié)尾的文件屬性中設(shè)置不使用預(yù)編譯頭即可。在這個過程中也鍛煉了自己解決問題的能力。人工智能課內(nèi)實(shí)驗(yàn)報告實(shí)驗(yàn)2:編程實(shí)現(xiàn)簡單動物識別系統(tǒng)的知識表示學(xué)院:自動化學(xué)院班級:智能1501姓名:劉少鵬〔33學(xué)號:06153034日期:2017-3-1310:15-12:00實(shí)驗(yàn)2:編程實(shí)現(xiàn)簡單動物識別系統(tǒng)的知識表示一、實(shí)驗(yàn)?zāi)康?、理解和掌握產(chǎn)生式知識表示方法;2、能夠通過VC編程語言實(shí)現(xiàn)產(chǎn)生式系統(tǒng)的規(guī)則庫。二、實(shí)驗(yàn)內(nèi)容1、以動物識別系統(tǒng)的產(chǎn)生式規(guī)則為例;2、用選定的編程語言建造規(guī)則庫和綜合數(shù)據(jù)庫.并能對它們進(jìn)行增加、刪除和修改操作。實(shí)驗(yàn)步驟確定需要識別的動物及其屬性本次實(shí)驗(yàn)的簡單動物識別系統(tǒng)總共能識別7種動物.即:老虎、金錢豹、斑馬、長頸鹿、企鵝、鴕鳥和信天翁。建立識別七種動物識別系統(tǒng)的規(guī)則選定編程語言并確定綜合數(shù)據(jù)庫和規(guī)則庫結(jié)構(gòu)選用C語言作為編程語言〔2綜合數(shù)據(jù)庫的建立〔3規(guī)則庫的建立四、程序源代碼#include<iostream>#include<string>usingnamespacestd;structRULES{intcount;charpre[255];charback[255];intmark;};voidcheck<>;RULESr[100]={ {1,"有毛發(fā)","哺乳動物",0}, //所有規(guī)則靜態(tài)數(shù)據(jù)庫 {1,"有奶","哺乳動物",0}, {1,"有羽毛","鳥",0}, {2,"會飛&下蛋&","鳥",0}, {1,"吃肉","食肉動物",0}, {3,"有鋒利的牙齒&有爪&眼睛盯著前方&","食肉動物",0}, {2,"哺乳動物&有蹄&","有蹄類哺乳動物",0}, {2,"哺乳動物&反芻&","有偶蹄類哺乳動物",0}, {4,"哺乳動物&食肉動物&黃褐色&有暗斑&","金錢豹",0}, {4,"哺乳動物&食肉動物&黃褐色&黑色條紋&","老虎",0}, {4,"有蹄類哺乳動物&有長脖子&有長腿&有暗斑&","長頸鹿",0}, {2,"有蹄類哺乳動物&黑條紋&","斑馬",0},{5,"鳥&不會飛&有長脖子&有長腿&黑白色&","鴕鳥",0}, {4,"鳥&不會飛&會游泳&黑白色&","企鵝",0},{2,"鳥&會飛&","信天翁",0}, {1,"反芻","哺乳動物",0}};intnumber;intm;intcat=15;inta;intlength; //輸入的事實(shí)長度stringf[255]; //輸入的事實(shí)數(shù)組voidinput<>{while<1> { cat++; cout<<"number"<<endl; cin>>r[cat].count; cout<<"輸入事實(shí).兩種以上的事實(shí)請在每個事實(shí)后加上‘&’符號"<<endl; cin>>r[cat].pre; cout<<"輸入結(jié)果"<<endl; cin>>r[cat].back; r[cat].mark=0;while<1> { cout<<"輸入"1"繼續(xù)添加規(guī)則,輸入"2"查看規(guī)則庫"<<endl;intp; cin>>p;if<p==1> { input<>; }else {if<p==2> { check<>; }else { cout<<"輸入錯誤.重新輸入"<<endl; } } } }}voiddelate<>{ cout<<"輸入要刪除的條數(shù)"<<endl;intbar; cin>>bar;for<intt=0;t<=cat;t++> { r[bar-1]=r[bar]; bar++; } cat--; check<>;}voidcheck<>{ cout<<endl<<"規(guī)則庫如下"<<endl;for<inti=0;i<=cat;i++> { cout<<i+1<<"."<<"由"<<r[i].pre<<"可得"<<r[i].back<<endl; } cout<<endl;while<1> { cout<<"輸入"1"繼續(xù)添加規(guī)則.輸入"3"刪除選定的規(guī)則"<<endl; cin>>m;if<m==1> { input<>; }else {if<m==3> delate<>; } }}intfind_rule<ints> //查找規(guī)則庫中是否還有可使用的規(guī)則{for<inti=0;i<=15;i++>s=s*r[i].mark;//cout<<"find_rule結(jié)果"<<s<<endl;returns;}intcompare1<RULESr>//當(dāng)前提條件為1時{intj=0,i=1;stringstr,str2; str=r.pre;while<i<=length> {if<f[i]==str> { str2=r.back; f[length+1]=str2; //加入事實(shí)庫 length++; //事實(shí)庫的長度加1r.mark=1; //標(biāo)記規(guī)則已使用過break; }else i++; }returnr.mark;}intcompare2<RULESr> //前提條件不為1{stringb[10];stringstr,str2;inti,j=1,num=0;inta=0; str=r.pre;for<i=0;i!=10;++i>//轉(zhuǎn)換數(shù)組 { b[i]=""; }for<i=0;i!=str.length<>;++i> {if<str.at<i>!='&'> { b[j]+=str.at<i>; }else { j++; } } i=1;while<i<=r.count> {for<j=1;j!=length+1;j++> {if<f[j]==b[i]> { a+=1; } } i++; }if<a==r.count> { str2=r.back; f[length+1]=str2; //加入事實(shí)庫 length++; //事實(shí)庫的長度加1r.mark=1; //標(biāo)記規(guī)則已使用過 }returnr.mark;}voidresult<>{inti=1,m=0;while<i!=length+1> {if<f[i]=="金錢豹"> { cout<<"該動物是金錢豹"<<endl; m=1;break; }elseif<f[i]=="老虎"> { cout<<"該動物是老虎"<<endl; m=1;break; }elseif<f[i]=="長頸鹿"> { cout<<"該動物是長頸鹿"<<endl; m=1;break; }elseif<f[i]=="斑馬"> { cout<<"該動物是斑馬"<<endl; m=1;break; }elseif<f[i]=="鴕鳥"> { cout<<"該動物是鴕鳥"<<endl; m=1;break; }elseif<f[i]=="企鵝"> { cout<<"該動物是企鵝"<<endl; m=1;break; }elseif<f[i]=="信天翁"> { cout<<"信天翁"<<endl; m=1;break; }else i++; }if<m==0> cout<<"沒有符合的動物.請確認(rèn)特征.重新輸入"<<endl;}voididetify<>{inti=0,u=0;if<find_rule<u>==0>//如果規(guī)則庫中還有未使用的規(guī)則 {//cout<<"還有未使用的規(guī)則"<<endl;intnum=length;while<i<16> //從第一條規(guī)則開始遍歷 {if<r[i].mark==0> //如果該條規(guī)則未使用 {if<r[i].count==1> //該條規(guī)則前提數(shù)為1 { u=compare1<r[i]>;if<u==1> r[i].mark=1;if<r[i].mark==1> { cout<<"使用規(guī)則"<<i+1; cout<<"且加入的新事實(shí)為"<<r[i].back<<endl; } }else { u=compare2<r[i]>;if<u==1> r[i].mark=1;if<r[i].mark==1> { cout<<"使用規(guī)則"<<i+1; cout<<"且加入的新事實(shí)為"<<r[i].back<<endl; } } }if<i==15> {if<num!=length> { i=0; num=length; }else i=16; }else { i++; } } }else { cout<<"所有的規(guī)則都已使用"<<endl; } result<>;}/*主函數(shù)*/voidmain<>{ cout<<"******智能1501班********"<<endl; cout<<"******06153034**********"<<endl;cout<<"******劉少鵬************"<<endl; cout<<"進(jìn)行動物識別請輸入7"<<endl; cout<<"進(jìn)行規(guī)則庫操作請輸入8"<<endl; cin>>a;while<a==8> {while<1> { cout<<"添加規(guī)則輸入‘1’,查看已有規(guī)則輸入‘2’"<<endl; cin>>m;if<m==1> { input<>; }else {if<m==2> { check<>; }else cout<<"輸入錯誤請重新輸入"<<endl; } } }if<a==7> {intu=0; cout<<"請輸入動物的特征數(shù)"<<endl; cin>>length; cout<<"請輸入動物的特征"<<endl;for<inti=1;i<=length;i++> cin>>f[i]; idetify<>;} system<"pause">;}實(shí)驗(yàn)結(jié)果相關(guān)截圖1、程序總體結(jié)構(gòu)規(guī)則庫操作→查看規(guī)則庫規(guī)則庫操作→添加規(guī)則→添加袋鼠規(guī)則規(guī)則庫操作→刪除規(guī)則→刪除袋鼠規(guī)則5、動物識別→識別長頸鹿六、心得體會通過本次實(shí)驗(yàn)我深刻的理解和掌握產(chǎn)生式知識表示方法.并且能夠通過VC編程語言實(shí)現(xiàn)產(chǎn)生式系統(tǒng)的規(guī)則庫。本次實(shí)驗(yàn)我同樣遇到許多問題.我通過自己查閱資料.與同學(xué)們討論.逐步的將自己的問題解決.在這個過程中提高了我的問題解決能力。最后因?yàn)楸敬螌?shí)驗(yàn)只有對數(shù)據(jù)庫有清楚的掌握.同時熟悉規(guī)則才能合理編程.因此我在平時的學(xué)習(xí)中應(yīng)當(dāng)加大數(shù)據(jù)庫與數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)力度.提高自己的編程能力。人工智能課內(nèi)實(shí)驗(yàn)報告實(shí)驗(yàn)3:盲目搜索求解八數(shù)碼問題學(xué)院:自動化學(xué)院班級:智能1501姓名:劉少鵬〔33學(xué)號:06153034日期:2017-03-3010:15-12:00人工智能課內(nèi)實(shí)驗(yàn)3:盲目搜索求解8數(shù)碼問題實(shí)驗(yàn)?zāi)康氖煜と斯ぶ悄芟到y(tǒng)中的問題求解過程;熟悉狀態(tài)空間中的盲目搜索策略;掌握盲目搜索算法.重點(diǎn)是寬度優(yōu)先搜索和深度優(yōu)先搜索算法。實(shí)驗(yàn)要求用VC語言編程.采用寬度優(yōu)先搜索和深度優(yōu)先搜索方法.求解8數(shù)碼問題實(shí)驗(yàn)內(nèi)容采用寬度優(yōu)先算法.運(yùn)行程序.要求輸入初始狀態(tài)假設(shè)給定如下初始狀態(tài)S0283164705和目標(biāo)狀態(tài)Sg216408753驗(yàn)證程序的輸出結(jié)果.寫出心得體會?!?對代碼進(jìn)行修改〔選作.實(shí)現(xiàn)深度優(yōu)先搜索求解該問題提示:每次選擴(kuò)展節(jié)點(diǎn)時.從數(shù)組的最后一個生成的節(jié)點(diǎn)開始找.找一個沒有被擴(kuò)展的節(jié)點(diǎn)。這樣也需要對節(jié)點(diǎn)添加一個是否被擴(kuò)展過的標(biāo)志。4源代碼及實(shí)驗(yàn)結(jié)果截圖實(shí)驗(yàn)源代碼#include<stdlib.h>#include<stdio.h>TypedefstructNode{intnum[9];//棋盤狀態(tài) intdeepth;//派生的深度g<n> intdiffnum;//不在位的數(shù)目h<n>intvalue;//耗散值f<n>=g<n>+h<n> structNode*pre; structNode*next; structNode*parent;}numNode;/*--endofstructnumNode--*/intorigin[9];//棋盤初始狀態(tài)inttarget[9];//棋盤目標(biāo)狀態(tài)intnumNode_num,total_step;numNode*open,*close;//Open表和Close表numNode*create_numNode<>{ return<numNode*>malloc<sizeof<numNode>>;}numNode*open_getfirst<numNode*head>;//返回第一項.并從Open表中刪除voidopen_insert<numNode*head,numNode*item>;//向Open表中按序插入新節(jié)點(diǎn)voidclose_append<numNode*head,numNode*item>;//向Close表中插入新節(jié)點(diǎn)intexpand<numNode*item>;//擴(kuò)展節(jié)點(diǎn)intprint_result<numNode*item>;//打印結(jié)果numNode*copy_numNode<numNode*orgin>;charisNewNode<numNode*open,numNode*close,intnum[9]>;//是否在Open表或Close表中voidprint_num<intnum[9]>;//打印棋盤狀態(tài)intdiff<intnum[9]>;//求不在位棋子的個數(shù)voidinit<>;//初始化.獲得棋盤初始狀態(tài)和目標(biāo)狀態(tài)voidswap<int*a,int*b>;intoperate<intnum[],intop>;voidfree_list<numNode*head>;//*Name:主函數(shù)//*Description:程序入口intmain<intargc,char*argv[]>{ //初始化Open表和Close表 printf<"*****智能1501****\n">; printf<"*****劉少鵬******\n">; printf<"*****06153034****\n">; open=create_numNode<>; close=create_numNode<>; open->pre=open->next=close->pre=close->next=NULL; init<>;//由用戶輸入初始和目標(biāo)狀態(tài) //初始化初始節(jié)點(diǎn) numNode*p1; p1=create_numNode<>; p1->parent=NULL; p1->deepth=0; inti=0; for<i=0;i<9;i++> { p1->num[i]=origin[i]; } open_insert<open,p1>; numNode_num=1; p1=open_getfirst<open>; while<p1!=NULL> { close_append<close,p1>; if<expand<p1>> returnEXIT_SUCCESS; p1=open_getfirst<open>; } printf<"Nosolution!\n">; returnEXIT_SUCCESS;}/*endoffunctionmain*/voidinit<>{ while<1> { printf<"Pleaseinputopriginalstatus:\nForexample:123456780standsfor\n" "123\n" "456\n" "780\n">; chartemp[10]; scanf<"%s",&temp>; inti=0; for<i=0;i<9&&temp[i]-'0'>=0&&temp[i]-'0'<=8;i++> { origin[i]=temp[i]-'0'; } printf<"Pleaseinputtargetstatus:\n">; scanf<"%s",&temp>; intj=0; for<j=0;j<9&&temp[j]-'0'>=0&&temp[j]-'0'<=8;j++> { target[j]=temp[j]-'0'; } system<"cls">; if<i==9&&j==9> { break; } }}/*endoffunctioninit*/voidopen_insert<numNode*head,numNode*item>{ numNode*p,*q; p=head->next; q=head; while<p!=NULL&&item->value>p->value> { q=p; p=p->next; } q->next=item; item->pre=q; item->next=p; if<p!=NULL> { p->pre=item; }}/*endoffunctionopen_insert*/numNode*open_getfirst<numNode*head>{ numNode*p; if<head->next==NULL> { returnNULL; } p=head->next; head->next=p->next; if<p->next!=NULL> { p->next->pre=head; } p->pre=NULL; p->next=NULL; returnp;}/*endoffunctionopen_getfirst*/voidclose_append<numNode*head,numNode*item>{ item->next=head->next; item->pre=head; head->next=item; if<item->next!=NULL> { item->next->pre=item; }}/*endoffunctionclose_append*/intexpand<numNode*p1>{ numNode*p2; intop=1; for<op=1;op<=4;op++> { p2=copy_numNode<p1>; operate<p2->num,op>; if<isNewNode<open,close,p2->num>=='N'> { p2->parent=p1; p2->deepth=p1->deepth+1; p2->diffnum=diff<p2->num>; p2->value=p2->deepth+p2->diffnum; if<p2->diffnum==0> { total_step=print_result<p2>; printf<"Totalstep:%d\n",total_step>; free_list<open>; free_list<close>; return1; } else{ numNode_num++; open_insert<open,p2>; } } else free<p2>; } return0;}/*endoffunctionexpand*/intoperate<intm[],intop>{ intblank; blank=0; while<m[blank]!=0&&blank<9> ++blank; if<blank==9> return1; switch<op>{ case1:/*up*/ if<blank>2> swap<m+blank,m+blank-3>; break; case2:/*down*/ if<blank<6> swap<m+blank,m+blank+3>; break; case3:/*left*/ if<blank!=0&&blank!=3&&blank!=6> swap<m+blank,m+blank-1>; break; case4:/*right*/ if<blank!=2&&blank!=5&&blank!=8> swap<m+blank,m+blank+1>; break; default:return1; } return0;}voidswap<int*a,int*b>{ intc; c=*a; *a=*b; *b=c;}numNode*copy_numNode<numNode*origin>{ numNode*p; p=create_numNode<>; p->deepth=origin->deepth; p->diffnum=origin->diffnum; p->value=origin->value; inti; for<i=0;i<9;i++> { <p->num>[i]=<origin->num>[i]; } returnp;}/*endoffunctioncopy_numNode*/intdiff<intnum[9]>{ inti,diffnum=0; for<i=0;i<9;i++> if<num[i]!=target[i]> diffnum++; returndiffnum;}/*endoffunctiondiff*/charisNewNode<numNode*open,numNode*close,intnum[9]>{ numNode*p; inti=0; p=open->next; while<p!=NULL> { for<i=0;i<9;i++> { if<p->num[i]!=num[i]> break; } if<i==9> return'O';//Open p=p->next; } p=close->next; while<p!=NULL> { for<i=0;i<9;i++> { if<p->num[i]!=num[i]> break; } if<i==9> return'C';//Close p=p->next; } return'N';}/*endoffunctionisNewNode*/voidfree_list<numNode*head>{ numNode*p,*q; p=head->next; while<p!=NULL> {q=p->next; free<p>; p=q; } free<head>;}/*endoffunctionfree_list*/voidprint_num<intnum[9]>{inti; for<i=0;i<9;i++> { printf<"%d\t",num[i]>; if<<i%3>==2> printf<"\n">; }}/*endoffunctionprint_num*/intprint_result<numNode*item>{ numNode*p; intstep; p=item; if<p!=NULL> { step=print_result<p->parent>; printf<"\nStep%d:\n",step+1>; print_num<p->num>; returnstep+1; } else { return-1; }}〔2實(shí)驗(yàn)截圖5心得體會本次實(shí)驗(yàn)對我最大的收獲就是我再解決問題的過程中提高了C語言編程能力.對用編程解決實(shí)際問題有了更加深刻的認(rèn)識。此次實(shí)驗(yàn)我采用了寬度優(yōu)先算法.成功的完成了本次實(shí)驗(yàn).我對寬度優(yōu)先算法有了更為深刻的理解.我相信我再經(jīng)過幾次寬度優(yōu)先算法的練習(xí).我就可以用它來解決一些生活中的實(shí)際問題。人工智能課內(nèi)實(shí)驗(yàn)報告實(shí)驗(yàn)4:回溯算法求解四皇后問題學(xué)院:自動化學(xué)院班級:智能1501姓名:劉少鵬〔33學(xué)號:06153034日期:2017-04-0510:15-12:00實(shí)驗(yàn)4回溯算法求解四皇后問題1實(shí)驗(yàn)?zāi)康?理解搜索的概念,掌握回溯搜索算法,用回溯算法求解四皇后問題.2實(shí)驗(yàn)要求:用VC編程實(shí)現(xiàn)求解四皇后問題的回溯過程,根據(jù)實(shí)驗(yàn)結(jié)果寫出回溯算法的總結(jié).3實(shí)驗(yàn)結(jié)果分析:回朔算法總結(jié):回朔算法是從一條路往前走.能進(jìn)則進(jìn).不能進(jìn)則退回來.換一條路再試。本次四皇后就是回溯算法.第一步按照順序放一個皇后.然后第二步符合要求放第2個皇后.如果沒有位置符合要求.那么就要改變第一個皇后的位置.重新放第2個皇后的位置.直到找到符合條件的位置就可以了?;厮匪惴ㄊ且粋€既帶有系統(tǒng)性又帶有跳躍性的的搜索算法。它在包含問題的所有解的解空間樹中.按照深度優(yōu)先的策略.從根結(jié)點(diǎn)出發(fā)搜索解空間樹。算法搜索至解空間樹的任一結(jié)點(diǎn)時.總是先判斷該結(jié)點(diǎn)是否肯定不包含問題的解。如果肯定不包含.則跳過對以該結(jié)點(diǎn)為根的子樹的系統(tǒng)搜索.逐層向其祖先結(jié)點(diǎn)回溯。否則.進(jìn)入該子樹.繼續(xù)按深度優(yōu)先的策略進(jìn)行搜索?;厮莘ㄔ谟脕砬髥栴}的所有解時.要回溯到根.且根結(jié)點(diǎn)的所有子樹都已被搜索遍才結(jié)束。而回朔算法在用來求問題的任一解時.只要搜索到問題的一個解就可以結(jié)束。這種以深度優(yōu)先的方式系統(tǒng)地搜索問題的解的算法稱為回溯法.它適用于解一些組合數(shù)較大的問題。4實(shí)驗(yàn)的心得體會:通過本次實(shí)驗(yàn)我理解了搜索的概念,掌握了回溯搜索算法,學(xué)會了用回溯算法求解四皇后問題。實(shí)驗(yàn)中我遇到了很多問題.但是通過自己的努力.和同學(xué)的幫助.我順利的完成了實(shí)驗(yàn).在此過程中我有了很大的收獲.我對回朔算法有了更深刻的理解.我在此次實(shí)驗(yàn)結(jié)束后.我想回朔算法可以求解四皇后問題.那么八皇后.十皇后.N皇后問題該怎么解決.我想通過自己的不斷學(xué)習(xí)這些問題都將一一解決。參考示例代碼:#include<stdio.h>#defineboolint#definefalse0#definetrue1intNum=1;//用來記錄有幾種實(shí)現(xiàn)方法intq[5];boolC[5];//C[1]~C[4],布爾型變量.當(dāng)前列是否安全boolL[9];//L[2]~L[8].布爾型變量.〔i-j對角線〔從左上角到右下角是否安全2<=<i-j>+5<=8;boolR[9];//R[2]~R[8],布爾型變量.〔i+j對角線〔從右上角到左下角是否安全2<=i+j<=8intqipan[4][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};voidTry<inti>//皇后放置函數(shù){intj,k,n,m; for<j=1;j<5;j++> { if<<C[j]==true>&&<L[i-j+5]==true>&&<R[i+j]==true>>//表示第i行第j列是安全的 {q[i]=j;//第一件事.既然i行.j列安全.就放置皇后在〔i.j處 C[j]=false;//i行.j列放置皇后后不再安全 L[i-j+5]=false;//<i,j>所在的從左上角到右下角的對角線將不再安全 R[i+j]=false;if<i<4>//第二件事.判斷是否放完4個皇后 { Try<i+1>;//未放完四個皇后.則接著放下一個 } else//四個皇后已經(jīng)放完 { Num++; printf<"方案:%d\n",Num>; for<k=1;k<5;k++> { qipan[k-1][q[k]-1]=1;//輸出棋盤.皇后用1表示,0表示該位置無皇后 } for<m=0;m<4;m++> { for<n=0;n<4;n++> printf<"%d\t",qipan[m][n]>; printf<"\n">; }for<m=0;m<4;m++>//棋盤再次初始化 for<n=0;n<4;n++> qipan[m][n]=0; } C[j]=true;//第三件事.修改安全的標(biāo)志.回溯 L[i-j+5]=true; R[i+j]=true; } }}intmain<void>{ inti; Num=0; printf<"****實(shí)驗(yàn)四回溯算法四皇后******\n">;printf<"****智能1501班****\n">; printf<"****06153034******\n">; printf<"****劉少鵬********\n">; printf<"1表示該位置有皇后,0表示該位置無皇后\n">; for<i=1;i<5;i++> { C[i]=true; } for<i=0;i<9;i++> { L[i]=R[i]=true; } Try<1>; return0;}人工智能課內(nèi)實(shí)驗(yàn)報告實(shí)驗(yàn)5:編程實(shí)現(xiàn)一字棋游戲?qū)W院:自動化學(xué)院班級:智能1501姓名:劉少鵬〔33學(xué)號:06153034日期:2017-04-1110:15-12:00實(shí)驗(yàn)5編程實(shí)現(xiàn)一字棋游戲1實(shí)驗(yàn)?zāi)康?〔1理解和掌握博弈樹的啟發(fā)式搜索過程;〔2熟悉博弈中兩種最基本的搜索方法——極大極小過程和過程;〔3能夠用VC編程語言設(shè)計簡單的博弈游戲。2實(shí)驗(yàn)要求:用VC編程實(shí)現(xiàn)一字棋,根據(jù)實(shí)驗(yàn)結(jié)果寫出總結(jié)。3實(shí)驗(yàn)結(jié)果分析:3.1實(shí)驗(yàn)代碼#include<iostream>#include<windows.h>#include<conio.h>#include<string>#include<ctime>usingnamespacestd;#defineMAX_NUM1000//計算機(jī)獲勝的標(biāo)志#defineNO_BLANK-1001//人獲勝的標(biāo)志#defineTREE_DEPTH3//遞歸深度#defineNIL1001//根節(jié)點(diǎn)的函數(shù)走步評估值classState//棋盤狀態(tài)節(jié)點(diǎn).一個State實(shí)例就是一個棋盤的狀態(tài)節(jié)點(diǎn).從而形成一顆樹狀結(jié)構(gòu){public:intQP[3][3];//當(dāng)前棋盤數(shù)組inte_fun;//評分結(jié)果intchild[9];//當(dāng)前棋盤狀態(tài)下的后一步的所有狀態(tài)節(jié)點(diǎn)intparent;//當(dāng)前棋盤狀態(tài)下的父母節(jié)點(diǎn)下標(biāo)intbestChild;//在child[9]里e_fun最優(yōu)的節(jié)點(diǎn)下標(biāo)};classTic{public:inttmpQP[3][3];//用于層遞歸的臨時棋盤staticints_count;//葉子節(jié)點(diǎn)的靜態(tài)總數(shù)StateStates[MAX_NUM];//棋盤狀態(tài)節(jié)點(diǎn)數(shù)組 Tic<> {}voidinit<>//初始化棋盤.將各個位置的棋盤都置為 { s_count=0;for<inti=0;i<3;i++>for<intj=0;j<3;j++> { States[0].QP[i][j]=0; } States[0].parent=NIL; }voidPrintQP<>//棋盤界面顯示 {for<inti=0;i<3;i++> {for<intj=0;j<3;j++> { cout<<States[0].QP[i][j]<<'\t'; } cout<<endl; } }intIsWin<States>//判斷當(dāng)前的棋盤狀態(tài)是否有令任何一方獲勝 {inti=0;for<i=0;i<3;i++> {if<s.QP[i][0]==1&&s.QP[i][1]==1&&s.QP[i][2]==1>return1;if<s.QP[i][0]==-1&&s.QP[i][1]==-1&&s.QP[i][2]==-1>return-1; }for<i=0;i<3;i++> {if<s.QP[0][i]==1&&s.QP[1][i]==1&&s.QP[2][i]==1>return1;if<s.QP[0][i]==-1&&s.QP[1][i]==-1&&s.QP[2][i]==-1>return-1; }if<<s.QP[0][0]==1&&s.QP[1][1]==1&&s.QP[2][2]==1>||<s.QP[2][0]==1&&s.QP[1][1]==1&&s.QP[0][2]==1>>return1;if<<s.QP[0][0]==-1&&s.QP[1][1]==-1&&s.QP[2][2]==-1>||<s.QP[2][0]==-1&&s.QP[1][1]==-1&&s.QP[0][2]==-1>>return-1;return0; }inte_fun<States>//機(jī)器智能判定評價函數(shù) {boolflag=true;inti=0;for<i=0;i<3;i++>for<intj=0;j<3;j++>if<s.QP[i][j]==0>flag=false;if<flag>returnNO_BLANK;if<IsWin<s>==-1>return-MAX_NUM;if<IsWin<s>==1>returnMAX_NUM;intcount=0;for<i=0;i<3;i++>for<intj=0;j<3;j++>if<s.QP[i][j]==0>tmpQP[i][j]=1;elsetmpQP[i][j]=s.QP[i][j];for<i=0;i<3;i++> count+=<tmpQP[i][0]+tmpQP[i][1]+tmpQP[i][2]>/3;for<i=0;i<3;i++> count+=<tmpQP[0][i]+tmpQP[1][i]+tmpQP[2][i]>/3; count+=<tmpQP[0][0]+tmpQP[1][1]+tmpQP[2][2]>/3; count+=<tmpQP[2][0]+tmpQP[1][1]+tmpQP[0][2]>/3;for<i=0;i<3;i++>for<intj=0;j<3;j++>if<s.QP[i][j]==0>tmpQP[i][j]=-1;elsetmpQP[i][j]=s.QP[i][j];for<i=0;i<3;i++> count+=<tmpQP[i][0]+tmpQP[i][1]+tmpQP[i][2]>/3;for<i=0;i<3;i++> count+=<tmpQP[0][i]+tmpQP[1][i]+tmpQP[2][i]>/3; count+=<tmpQP[0][0]+tmpQP[1][1]+tmpQP[2][2]>/3; count+=<tmpQP[2][0]+tmpQP[1][1]+tmpQP[0][2]>/3;returncount; }virtualboolAutoDone<> {returnfalse; }voidUserInput<>//獲取用戶的輸入 {intpos,x,y; L1:cout<<"請輸入棋子的坐標(biāo)xy:"; cin>>pos; x=pos/10,y=pos%10;if<x>0&&x<4&&y>0&&y<4&&States[0].QP[x-1][y-1]==0> States[0].QP[x-1][y-1]=-1;else { cout<<"非法輸入!";gotoL1; } }};intTic::s_count=0;//初始化棋盤狀態(tài)節(jié)點(diǎn)總數(shù).剛開始置為classdemo:publicTic{public: demo<> {}boolJudge<> {inti,j,a=0;for<i=0;i<3;i++>for<j=0;j<3;j++>if<States[0].QP[i][j]==0>a++;if<a==0>returntrue;returnfalse; }virtualboolAutoDone<> {inta,b,i,j,m,n,max,min,x,y;if<IsWin<States[0]>==-1> { cout<<"恭喜您獲勝!"<<endl;returntrue; } a=0,b=0; max=-10000;for<x=0;x<3;x++>for<y=0;y<3;y++> States[11].QP[x][y]=States[0].QP[x][y];for<i=0;i<3;i++>for<j=0;j<3;j++> {if<States[0].QP[i][j]==0> { a=1;for<x=0;x<3;x++>for<y=0;y<3;y++> States[a].QP[x][y]=States[0].QP[x][y]; States[a].QP[i][j]=1; min=10000;for<m=0;m<3;m++>for<n=0;n<3;n++> {if<States[a].QP[m][n]==0> { b=1;for<x=0;x<3;x++>for<y=0;y<3;y++> States[10].QP[x][y]=States[a].QP[x][y]; States[10].QP[m][n]=-1; States[10].e_fun=e_fun<States[10]>;if<States[10].e_fun<min>min=States[10].e_fun; } } States[a].e_fun=min;if<States[a].e_fun>max> { max=States[a].e_fun;for<x=0;x<3;x++>for<y=0;y<3;y++> States[11].QP[x][y]=States[a].QP[x][y]; } } }for<x=0;x<3;x++>for<y=0;y<3;y++>States[0].QP[x][y]=States[11].QP[x][y]; cout<<"計算機(jī)走棋"<<endl; PrintQP<>;if<IsWin<States[0]>==1> { cout<<"抱歉你輸了.計算機(jī)獲勝!"<<endl;returntrue; }elseif<IsWin<States[0]>==-1> { cout<<"恭喜您獲勝!"<<endl;returntrue;}returnfalse; }};voidmain<>{ cout<<"****項目名稱:一字棋游戲的實(shí)現(xiàn)****"<<endl; cout<<"****班級:智能1501****"<<endl; cout<<"****姓名:劉少鵬****"<<endl; cout<<"****學(xué)號:06153034****"<<endl;cout<<"****說明:-1代表人落子位置,1代表電腦落子位置,0代表該位置無棋子****"<<endl; system<"title#子棋智能小游戲">; system<"colorA2">;charIsFirst;boolIsFinish; cout<<"若您為先手.請輸入'Y'!反之.請輸入'N':"<<endl; cin>>IsFirst;demo*p=newdemo<>; p->init<>; cout<<"棋盤的初始狀態(tài):"<<endl; p->PrintQP<>;do{if<!p->Judge<>> {if<IsFirst=='Y'> { p->UserInput<>;p->PrintQP<>;if<!p->Judge<>> { IsFinish=p->AutoDone<>; } }elseif<IsFirst=='N'> { IsFinish=p->AutoDone<>;if<!p->Judge<>> {if<!IsFinish>{p->UserInput<>;p->PrintQP<>;} } } }if<p->Judge<>>IsFinish=true; }while<!IsFinish>;if<<p->IsWin<p->States[0]>==0>&&p->Judge<>> { cout<<"平局"<<endl; } system<"pause">;}3.2、實(shí)驗(yàn)運(yùn)行結(jié)果截圖4、實(shí)驗(yàn)心得本次實(shí)驗(yàn).我通過學(xué)習(xí)用VC編程語言設(shè)計簡單的博弈游戲.從而理解和掌握博弈樹的啟發(fā)式搜索過程.熟悉博弈中兩種最基本的搜索方法——極大極小過程和過程。并且將這種思想通過代碼表現(xiàn)出來。本次實(shí)驗(yàn)我最大的收獲不僅僅是學(xué)到了課本上的知識.更是學(xué)會了如何主動的求解問題的答案。實(shí)驗(yàn)中我遇到了許多困難.不僅僅是有關(guān)編程算法方面的.還有一些代碼邏輯流程的設(shè)計。這些困難我通過上網(wǎng)和去圖書館查找資料或者向同學(xué)請教等方式.逐一解決了困難.我收獲良多。人工智能課內(nèi)實(shí)驗(yàn)報告實(shí)驗(yàn)6:子句集消解實(shí)驗(yàn)學(xué)院:自動化學(xué)院班級:智能1501姓名:劉少鵬〔33學(xué)號:06153034日期:2017-05-810:15-12:00實(shí)驗(yàn)6子句集消解實(shí)驗(yàn)一、實(shí)驗(yàn)?zāi)康氖煜ぷ泳浼喌木艂€步驟;理解消解規(guī)則.能把任意謂詞公式轉(zhuǎn)換成子句集。二、編程環(huán)境VisualStudio2017三、實(shí)驗(yàn)原理在謂詞邏輯中.任何一個謂詞公式都可以通過應(yīng)用等價關(guān)系及推理規(guī)則化成相應(yīng)的子句集。其化簡步驟如下:<1>消去連接詞"→"和"?"反復(fù)使用如下等價公式:P→Q?﹁P∨QP?Q?<P∧Q>∨<﹁P∧﹁Q>即可消去謂詞公式中的連接詞"→"和"?"。<2>減少否定符號的轄域反復(fù)使用雙重否定率﹁<﹁P>?P摩根定律﹁<P∧Q>?﹁P∨﹁Q﹁<P∨Q>?﹁P∧﹁Q量詞轉(zhuǎn)換率﹁<?x>P<x>?<?x>﹁P<x>﹁<?x>P<x>?<?x>¬P<x>將每個否定符號"﹁"移到僅靠謂詞的位置.使得每個否定符號最多只作用于一個謂詞上。<3>對變元標(biāo)準(zhǔn)化在一個量詞的轄域內(nèi).把謂詞公式中受該量詞約束的變元全部用另外一個沒有出現(xiàn)過的任意變元代替.使不同量詞約束的變元有不同的名字。<4>化為前束范式化為前束范式的方法:把所有量詞都移到公式的左邊.并且在移動時不能改變其相對順序。消去存在量詞<6>化為Skolem標(biāo)準(zhǔn)形對上述前束范式的母式應(yīng)用以下等價關(guān)系P∨<Q∧R>?<P∨Q>∧<P∨R>消去全稱量詞<8>消去合取詞在母式中消去所有合取詞.把母式用子句集的形式表示出來。其中.子句集中的每一個元素都是一個子句。<9>更換變量名稱對子句集中的某些變量重新命名.使任意兩個子句中不出現(xiàn)相同的變量名。四、實(shí)驗(yàn)結(jié)果及代碼//化簡子句集的九步法演示//作者:劉少鵬//時間:2017.5#include<iostream>#include<sstream>#include<stack>#include<queue>usingnamespacestd;//一些函數(shù)的定義voidinitString<string&ini>;//初始化stringdel_inlclue<stringtemp>;//消去蘊(yùn)涵符號stringdec_neg_rand<stringtemp>;//減少否定符號的轄域stringstandard_var<stringtemp>;//對變量標(biāo)準(zhǔn)化stringdel_exists<stringtemp>;//消去存在量詞stringconvert_to_front<stringtemp>;//化為前束形stringconvert_to_and<stringtemp>;//把母式化為合取范式stringdel_all<stringtemp>;//消去全稱量詞stringdel_and<stringtemp>;//消去連接符號合取%stringchange_name<stringtemp>;//更換變量名稱 //輔助函數(shù)定義boolisAlbum<chartemp>;//是字母stringdel_null_bracket<stringtemp>;//刪除多余的括號stringdel_blank<stringtemp>;//刪除多余的空格voidcheckLegal<stringtemp>;//檢查合法性charnumAfectChar<inttemp>;//數(shù)字顯示為字符 //主函數(shù)voidmain<>{ cout<<"求子句集九步法演示"<<endl; system<"color0A">; //orign="Q<x,y>%~<P<y>"; //orign="<@x><P<y>>P>"; //orign="~<#x>y<x>"; //orign="~<<@x>x!b<x>>"; //orign="~<x!y>"; //orign="~<~a<b>>"; stringorign,temp; charcommand,command0,command1,command2,command3,command4,command5, command6,command7,command8,command9,command10; //============================================================================= cout<<"請輸入<Y/y>初始化謂詞演算公式"<<endl; cin>>command; if<command=='y'||command=='Y'> initString<orign>; else exit<0>; //============================================================================= cout<<"請輸入<Y/y>消除空格"<<endl; cin>>command0; if<command0=='y'||command0=='Y'> { //del_blank<orign>;//undone cout<<"消除空格后是"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>消去蘊(yùn)涵項"<<endl; cin>>command1; if<command1=='y'||command1=='Y'> { orign=del_inlclue<orign>; cout<<"消去蘊(yùn)涵項后是"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>減少否定符號的轄域"<<endl; cin>>command2; if<command2=='y'||command2=='Y'> { do { temp=orign; orign=dec_neg_rand<orign>; }while<temp!=orign>; cout<<"減少否定符號的轄域后是"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>對變量進(jìn)行標(biāo)準(zhǔn)化"<<endl; cin>>command3; if<command3=='y'||command3=='Y'> { orign=standard_var<orign>; cout<<"對變量進(jìn)行標(biāo)準(zhǔn)化后是"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>消去存在量詞"<<endl; cin>>command4; if<command4=='y'||command4=='Y'> { orign=del_exists<orign>; cout<<"消去存在量詞后是<w=g<x>是一個Skolem函數(shù)>"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>化為前束形"<<endl; cin>>command5; if<command5=='y'||command5=='Y'> { orign=convert_to_front<orign>; cout<<"化為前束形后是"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>把母式化為合取方式"<<endl; cin>>command6; if<command6=='y'||command6=='Y'> { orign=convert_to_and<orign>; cout<<"把母式化為合取方式后是"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>消去全稱量詞"<<endl; cin>>command7; if<command7=='y'||command7=='Y'> { orign=del_all<orign>; cout<<"消去全稱量詞后是"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>消去連接符號"<<endl; cin>>command8; if<command8=='y'||command8=='Y'> { orign=del_and<orign>; cout<<"消去連接符號后是"<<endl <<orign<<endl; } else exit<0>; //============================================================================= cout<<"請輸入<Y/y>變量分離標(biāo)準(zhǔn)化"<<endl; cin>>command9; if<command9=='y'||command9=='Y'> { orign=change_name<orign>; cout<<"變量分離標(biāo)準(zhǔn)化后是<x1,x2,x3代替變量x>"<<endl <<orign<<endl; } else exit<0>; //============================================================================ cout<<"完畢"<<endl; cout<<"<請輸入Y/y>結(jié)束"<<endl; do { }while<'y'==getchar<>||'Y'==getchar<>>; exit<0>;}voidinitString<string&ini
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年廣西廣電網(wǎng)絡(luò)羅城分公司招聘筆試參考題庫含答案解析
- 2025年中國移動湖北十堰分公司招聘筆試參考題庫含答案解析
- 船塢建設(shè)力工合同
- 二零二五年智能電網(wǎng)設(shè)備合伙工廠合同2篇
- 二零二五年度礦業(yè)資產(chǎn)并購全程法律支持合同3篇
- 二零二五年度班組勞務(wù)外包及技能培訓(xùn)合同3篇
- 天津武清區(qū)2025衛(wèi)生系統(tǒng)事業(yè)單位招聘高級專業(yè)技術(shù)人員擬聘歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 天津南開大學(xué)金融學(xué)院招考聘用高頻重點(diǎn)提升(共500題)附帶答案詳解
- 國家鐵路局機(jī)關(guān)服務(wù)中心度公開招考1名應(yīng)屆畢業(yè)生高頻重點(diǎn)提升(共500題)附帶答案詳解
- 國家糧食和物資儲備局部分直屬事業(yè)單位公開招聘24人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 大學(xué)英語教師試講20分鐘范例
- 雨雪天氣安全教育PPT
- 圍手術(shù)期血糖管理專家共識
- 環(huán)境社會學(xué)整本書課件完整版電子教案全套課件最全教學(xué)教程ppt(最新)
- 采購管理實(shí)務(wù)全套教學(xué)課件
- 魯教版高中地理必修一第一學(xué)期總復(fù)習(xí)課件(共141張PPT)
- 酒店項目投資分析報告可行性報告
- 煙花爆竹零售店(點(diǎn))安全技術(shù)規(guī)范.ppt課件
- 視頻監(jiān)控臺賬參考模板
- 浦江郊野公園任務(wù)書
- 850t冷剪吊裝方案
評論
0/150
提交評論