版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
./人工智能實(shí)驗(yàn)報(bào)告八數(shù)碼演示程序姓名:處添加內(nèi)容學(xué)號(hào):處添加內(nèi)容計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)所學(xué)專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)八數(shù)碼演示程序報(bào)告題目:八數(shù)碼演示程序20XX4月9日提交日期:20XX4月9日八數(shù)碼演示程序問題描述1.1八數(shù)碼問題的解釋八數(shù)碼問題是人工智能經(jīng)典難題之一。問題是在3×3方格盤上,放有八個(gè)數(shù)碼,剩下一個(gè)為空,每一空格其上下左右的數(shù)碼可移至空格。問題給定初始位置和目標(biāo)位置,要求通過一系列的數(shù)碼移動(dòng),將初始位置轉(zhuǎn)化為目標(biāo)位置。本文介紹用A星算法,采用估計(jì)值h〔n〔曼哈頓距離和g<m><當(dāng)前深度>的和作為估計(jì)函數(shù)。1.2八數(shù)碼問題的搜索形式描述初始狀態(tài):初始狀態(tài)向量,規(guī)定向量中各分量對(duì)應(yīng)的位置,各位置上的初始數(shù)字<0,1,3,4,5,6,7,8,2>后繼函數(shù):移動(dòng)規(guī)則,按照某條規(guī)則移動(dòng)數(shù)字得到的新向量<0,1,3,4,5,6,7,8,9>轉(zhuǎn)移到<4,1,3,0,5,6,7,8,2>目標(biāo)測(cè)試:新向量是否是目標(biāo)狀態(tài),也即為<0,1,2,3,4,5,6,7,8>路徑耗散函數(shù):在搜索時(shí),每深入一層則當(dāng)前步數(shù)代價(jià)加1,代價(jià)總和由當(dāng)前步數(shù)和可能還需要移動(dòng)的步數(shù)之和。1.3解決方案介紹首先,A*算法需要個(gè)估價(jià)<評(píng)價(jià)>函數(shù):f<x>=g<x>+h<x>g<x>通常表示移動(dòng)至當(dāng)前狀態(tài)需要的步數(shù),h<x>則是啟發(fā)函數(shù)。在算法進(jìn)行的時(shí)候,我們將對(duì)每一個(gè)可能移動(dòng)到的狀態(tài)做評(píng)價(jià),計(jì)算其f<x>,然后將其放入一個(gè)OPEN數(shù)組中,最后我們選取OPEN中f<x>值最小的狀態(tài)作為下一步,再重復(fù)上述過程,因?yàn)閒<x>值最小的狀態(tài)意味著它最有可能<不是一定>最接近最終狀態(tài)。算法介紹2.1搜索算法一般介紹A*算法是一種啟發(fā)式搜索算法,是常用的最短路搜尋算法,在游戲領(lǐng)域中有廣泛的應(yīng)用。所謂啟發(fā)式算法,它與常規(guī)的搜索方法最大的不同是在執(zhí)行過程中始終有一個(gè)提示性的信息在引導(dǎo)著算法的進(jìn)行,使得我們不斷靠近目標(biāo)而不是盲目的遍歷,這個(gè)提示信息就是由啟發(fā)函數(shù)產(chǎn)生的,啟發(fā)函數(shù)的好壞將直接影響算法的效率,從幾篇文獻(xiàn)看來,A*算法和廣度優(yōu)先、深度優(yōu)先算法相比是有很明顯的效率優(yōu)勢(shì)的。2.2算法偽代碼InitializeOPEN、CLOSE、初始狀態(tài)source,最終狀態(tài)dest;Push<source,OPEN>;While<!OPEN.isEmpty<>>{FindFirstElementOfOpen<>;cuNode=Pop<OPEN>;If isTheSame<cuNode,dest>Thenexit;Push<cuNode,close>Extend<cuNode>;}ExtendNewNode<NewNode>{If CLOSE.NOTcontains<NewNode> Then If OPEN.NOTcontains<NewNode>Push<NewNode,OPEN>;Else IfOPEN.get<NewNode>.f>NewNode.f ThenPush<NewNode,OPEN>;}算法實(shí)現(xiàn)3.1實(shí)驗(yàn)環(huán)境與問題規(guī)模本文采用java語(yǔ)言進(jìn)行程序設(shè)計(jì),在圖形界面上可以顯示八數(shù)碼格局,并可以隨機(jī)生成新的起始狀態(tài)和目標(biāo)狀態(tài)。問題規(guī)模為8,解決八數(shù)碼問題,但可以比較容易就能修改為對(duì)15數(shù)碼問題的求解。3.2數(shù)據(jù)結(jié)構(gòu)1.類Node,表示一個(gè)結(jié)點(diǎn),也即搜索過程中的某一個(gè)狀態(tài),其內(nèi)部數(shù)據(jù)成員有ID〔可以唯一地表示一個(gè)狀態(tài)結(jié)點(diǎn),parentID〔該狀態(tài)結(jié)點(diǎn)的母結(jié)點(diǎn),保存這個(gè)值是為了在找到目標(biāo)結(jié)點(diǎn)時(shí)可以回溯其路徑,a[][]〔一個(gè)二維數(shù)組,用于存放當(dāng)前八數(shù)碼的狀態(tài),g〔表示從起始狀態(tài)結(jié)點(diǎn)開始到當(dāng)前狀態(tài)結(jié)點(diǎn)所走過的步數(shù),h〔表示從當(dāng)前狀態(tài)結(jié)點(diǎn)到目標(biāo)狀態(tài)結(jié)點(diǎn)有可能還要走多少步數(shù),f〔就是g值與h值的和。2.OPEN表,實(shí)現(xiàn)的時(shí)候使用的是HashMap,以保證所存的每一個(gè)狀態(tài)的唯一性;Open表的用途是存放產(chǎn)生的可能的新狀態(tài),這些新狀態(tài)有待于擴(kuò)展。3.CLOSE表,實(shí)現(xiàn)的時(shí)候使用的是HashMap,以保證所存的每一個(gè)狀態(tài)的唯一性;存放ID=>Node結(jié)點(diǎn)鍵值對(duì),用途是記錄已經(jīng)訪問過的狀態(tài)。3.3實(shí)驗(yàn)結(jié)果起始狀態(tài)210785436終結(jié)狀態(tài)012345678目標(biāo)可達(dá),總執(zhí)行步數(shù)為21步,搜索算法所耗時(shí)間為31毫秒3.4系統(tǒng)中間及最終輸出結(jié)果〔要求有屏幕顯示1.無(wú)解時(shí)的情形:2.有解時(shí)的情形:起始狀態(tài):自動(dòng)演示時(shí)的移動(dòng)過程截圖:最后達(dá)到目標(biāo)狀態(tài):參考文獻(xiàn)人工智能游戲編程真言 <美>SteveRabin主編 Java項(xiàng)目開發(fā)實(shí)踐 陸正武,張志立編著 JavaSE6.0編程指南 吳亞峰,紀(jì)超編著 數(shù)據(jù)結(jié)構(gòu)經(jīng)典算法實(shí)現(xiàn)與習(xí)題解答 汪杰等編著 SwingHacks:100個(gè)業(yè)界最尖端的技巧和工具 JoshuaMarinacci,ChrisAdamson著 Java綜合實(shí)例經(jīng)典 吳其慶編著 附錄—源代碼及其注釋〔算法部分,不包括界面設(shè)計(jì)的代碼:packageMyAI;importjava.util.HashMap;importjava.util.Iterator;importjava.util.Map;importjava.util.Vector;importjava.util.Map.Entry;classNode{ LongID; LongparentID; inta[][]; intg; inth; intf; Node<longID,longparentID,inta[][],intg,inth>{ this.ID=ID; this.parentID=parentID; this.a=a; this.g=g; this.h=h; this.f=g+h; }}publicclassEightNumber{ privateMap<Long,Node>open=newHashMap<Long,Node><>; privateMap<Long,Node>close=newHashMap<Long,Node><>; privateint[][]source=null; privateint[][]dest=null; publicEightNumber<int[][]source,int[][]dest>{ this.source=source; this.dest=dest; } publicVector<Node>process<>{ Nodes=newNode<computeID<source>,0,source,0,computeH<source, dest>>;//令起始結(jié)點(diǎn)的母結(jié)點(diǎn)ID為0 Noded=newNode<computeID<dest>,0,dest,0,0>;//目標(biāo)狀態(tài)的母結(jié)點(diǎn)未知,g值未知 System.out.println<"起始狀態(tài)">; printNode<s>; System.out.println<"終結(jié)狀態(tài)">; printNode<d>; if<!resolvable<this.source,this.dest>>{ returnnull; } push<s,open>; NodecuNode=s; //intcount=0; while<!open.isEmpty<>>{ //count++; cuNode=pop<open>; if<isTheSame<cuNode,d>>{ System.out.println<"找到目標(biāo)">; break; } push<cuNode,close>; extendNode<cuNode,d>; } returnprintResult<cuNode>; } privateVector<Node>printResult<NodecuNode>{ intcount=0; Vector<Node>result=newVector<Node><>; while<cuNode.parentID!=0>{ count++; result.add<cuNode>; printNode<cuNode>; cuNode=close.get<cuNode.parentID>; } printNode<cuNode>; System.out.println<"總共經(jīng)過"+count+"步數(shù)">; returnresult; } privatevoidprintNode<NodecuNode>{ for<inti=0;i<3;i++>{ for<intj=0;j<3;j++>{ System.out.print<cuNode.a[i][j]+"">; } System.out.println<>; } System.out.println<"">; } privatevoidextendNode<NodecuNode,Nodedest>{ intheng=0,zong=0;//i,j分別為0的橫縱坐標(biāo) for<inti=0;i<3;i++> for<intj=0;j<3;j++> if<cuNode.a[i][j]==0>{ heng=i; zong=j; break; } if<zong-1>=0>{//如果0可以往左邊移動(dòng) int[][]state=newint[3][3]; for<inti=0;i<3;i++> for<intj=0;j<3;j++> state[i][j]=cuNode.a[i][j]; state[heng][zong]=cuNode.a[heng][zong-1]; state[heng][zong-1]=0; extend<state,cuNode,dest>; } if<zong+1<=2>{//如果0可以往右邊移動(dòng) int[][]state=newint[3][3]; for<inti=0;i<3;i++> for<intj=0;j<3;j++> state[i][j]=cuNode.a[i][j]; state[heng][zong]=cuNode.a[heng][zong+1]; state[heng][zong+1]=0; extend<state,cuNode,dest>; } if<heng-1>=0>{//如果0可以往上邊移動(dòng) int[][]state=newint[3][3]; for<inti=0;i<3;i++> for<intj=0;j<3;j++> state[i][j]=cuNode.a[i][j]; state[heng][zong]=cuNode.a[heng-1][zong]; state[heng-1][zong]=0; extend<state,cuNode,dest>; } if<heng+1<=2>{//如果0可以往下邊移動(dòng) int[][]state=newint[3][3]; for<inti=0;i<3;i++> for<intj=0;j<3;j++> state[i][j]=cuNode.a[i][j]; state[heng][zong]=cuNode.a[heng+1][zong]; state[heng+1][zong]=0; extend<state,cuNode,dest>; } } privatevoidextend<int[][]state,NodecuNode,Nodedest>{ Nodenode=newNode<computeID<state>,cuNode.ID,state,cuNode.g+1, computeH<state,dest.a>>; if<!close.containsKey<node.ID>>{ if<!open.containsKey<node.ID>> push<node,open>; else{ if<open.get<node.ID>.f>node.f> push<node,open>; } } } privatebooleanisTheSame<NodecuNode,Noded>{ if<cuNode.ID.equals<d.ID>> returntrue; returnfalse; } privatevoidpush<Nodea,Map<Long,Node>open2>{ open2.put<a.ID,a>; } privateNodepop<Map<Long,Node>open2>{ Iterator<Entry<Long,Node>>it=open.entrySet<>.iterator<>; Map.Entry<Long,Node>e=it.next<>; intfmin=e.getValue<>.f; Nodenode=e.getValue<>; while<it.hasNext<>>{ e=it.next<>; if<e.getValue<>.f<fmin>{ fmin=e.getValue<>.f; node=e.getValue<>; } } returnopen2.remove<node.ID>; } publicstaticbooleanresolvable<int[][]source,int[][]dest>{ intcount1=0; intcount2=0; int[]starts=transform1<source>; int[]ends=transform1<dest>; for<inti=0;i<9;i++>{ for<intj=0;j<i;j++> if<starts[i]<starts[j]&&starts[i]!=0> count1++;//統(tǒng)計(jì)初始狀態(tài)的逆序數(shù) } for<inti=0;i<9;i++>{ for<intj=0;j<i;j++> if<ends[i]<ends[j]&&ends[i]!=0> count2++;//統(tǒng)計(jì)目標(biāo)狀態(tài)的逆序數(shù) } if<count1%2==count2%2>{ System.out.println<"有解">; returntrue; }else{ System.out.println<"無(wú)解">; returnfalse; } } privatelongcomputeID<inta[][]>{ longsum=0; for<inti=0;i<3;i++> for<intj=0;j<3;j++>{ sum=sum*10+a[i][j]; } returnsum; } privateintcomputeH<intnode[][],intdest[][]>{ intcount=0; for<inti=0;i<=2;i++> for<intj=0;j<=2;j++> for<intg=0;g<=2;g++> for<intk=0;k<=2;k++>{ if<node[i][j]==dest[g][k]&&node[i][j]!=0>//a[][]為初始的,b[][]為目標(biāo) { count+=Math.abs<i-g>+Math.abs<j-k>;
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 廣東江門幼兒師范高等??茖W(xué)?!痘A(chǔ)英語(yǔ)二》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東財(cái)貿(mào)職業(yè)學(xué)院《陳設(shè)設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 二氧化碳制備課件
- 《如何贏得合作》課件
- 贛州職業(yè)技術(shù)學(xué)院《工程計(jì)量與計(jì)價(jià)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024“五史”全文課件
- 小學(xué)生手工剪紙課件
- 贛南衛(wèi)生健康職業(yè)學(xué)院《漢語(yǔ)言文學(xué)專業(yè)概論》2023-2024學(xué)年第一學(xué)期期末試卷
- 贛南科技學(xué)院《燃燒學(xué)B》2023-2024學(xué)年第一學(xué)期期末試卷
- 《保護(hù)煤柱的設(shè)計(jì)》課件
- 奧齒泰-工具盒使用精講講解學(xué)習(xí)課件
- 最新MARSI-醫(yī)用黏膠相關(guān)皮膚損傷課件
- 工程開工報(bào)審表范本
- 航空小鎮(zhèn)主題樂園項(xiàng)目規(guī)劃設(shè)計(jì)方案
- 保潔冬季防滑防凍工作措施
- 少兒美術(shù)課件-《我的情緒小怪獸》
- 永續(xù)債計(jì)入權(quán)益的必備條件分析
- 預(yù)應(yīng)力鋼絞線張拉伸長(zhǎng)量計(jì)算程序單端(自動(dòng)版)
- 基坑監(jiān)測(cè)課件ppt版(共155頁(yè))
- 開發(fā)區(qū)開發(fā)管理模式及發(fā)展要素PPT課件
- 急診科科主任述職報(bào)告范文
評(píng)論
0/150
提交評(píng)論