版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、人工智能實驗一報告題目:采用A*算法解決八數(shù)碼問題姓名:張博涵學(xué)號:081110317專業(yè):信息與計算科學(xué)提交日期:2014-05-22- -structSpringLink*next;/指向兄第結(jié)點SPLink,*PSPLink;PNodeopen;PNodeclosed;/開始狀態(tài)與目標狀態(tài)statusstartt=0,1,2,3,4,5,6,7,8;statustarget=1,4,2,3,5,8,6,7,0;/初始化一個空鏈表voidinitLink(PNode&Head)Head=(PNode)malloc(sizeof(NNode);Head-next=NULL;/判斷鏈表是否為空
2、boolisEmpty(PNodeHead)if(Head-next=NULL)returntrue;elsereturnfalse;/從鏈表中拿出一個數(shù)據(jù)voidpopNode(PNode&Head,PNode&FNode)if(isEmpty(Head)FNode=NULL;return;FNode=Head-next;Head-next=Head-next-next;FNode-next=NULL;/向結(jié)點的最終后繼結(jié)點鏈表中添加新的子結(jié)點voidaddSpringNode(PNode&Head,PNodenewData)PSPLinknewNode=(PSPLink)malloc(si
3、zeof(SPLink);newNode-pointData=newData;newNode-next=Head-child;Head-child=newNode;/釋放狀態(tài)圖中存放結(jié)點后繼結(jié)點地址的空間voidfreeSpringLink(PSPLink&Head)PSPLinktmm;while(Head!=NULL)tmm=Head;Head=Head-next;free(tmm);釋放open表與closed表中的資源voidfreeLink(PNode&Head)PNodetmn;tmn=Head;Head=Head-next;free(tmn);while(Head!=NULL)/
4、首先釋放存放結(jié)點后繼結(jié)點地址的空間freeSpringLink(Head-child);tmn=Head;Head=Head-next;free(tmn);/向普通鏈表中添加一個結(jié)點voidaddNode(PNode&Head,PNode&newNode)newNode-next=Head-next;Head-next=newNode;/向非遞減排列的鏈表中添加一個結(jié)點voidaddAscNode(PNode&Head,PNode&newNode)PNodeP;PNodeQ;P=Head-next;Q=Head;while(P!=NULL&P-fvaluefvalue)Q=P;P=P-next
5、;/上面判斷好位置之后,下面就是簡單的插入了newNode-next=Q-next;Q-next=newNode;計算結(jié)點額h值intcomputeHValue(PNodetheNode)intnum=0;for(inti=0;i3;i+)for(intj=0;jdataij!=targetij)num+;returnnum;計算結(jié)點的f,g,h值voidcomputeAllValue(PNode&theNode,PNodeparentNode)if(parentNode=NULL)theNode-gvalue=0;elsetheNode-gvalue=parentNode-gvalue+1;
6、theNode-hvalue=computeHValue(theNode);theNode-fvalue=theNode-gvalue+theNode-hvalue;/初始化函數(shù),進行算法初始條件的設(shè)置voidinitial()初始化open以及closed表initLink(open);initLink(closed);/初始化起始結(jié)點,令初始結(jié)點的父節(jié)點為空結(jié)點PNodeNULLNode=NULL;PNodeStart=(PNode)malloc(sizeof(NNode);for(inti=0;i3;i+)for(intj=0;jdataij=starttij;Start-parent=
7、NULL;Start-child=NULL;Start-next=NULL;computeAllValue(Start,NULLNode);起始結(jié)點進入open表addAscNode(open,Start);/將B節(jié)點的狀態(tài)賦值給A結(jié)點voidstatusAEB(PNode&ANode,PNodeBNode)for(inti=0;i3;i+)for(intj=0;jdataij=BNode-dataij;/兩個結(jié)點是否有相同的狀態(tài)boolhasSameStatus(PNodeANode,PNodeBNode)for(inti=0;i3;i+)for(intj=0;jdataij!=BNode-
8、dataij)returnfalse;returntrue;/結(jié)點與其祖先結(jié)點是否有相同的狀態(tài)boolhasAnceSameStatus(PNodeOrigiNode,PNodeAnceNode)while(AnceNode!=NULL)if(hasSameStatus(OrigiNode,AnceNode)returntrue;AnceNode=AnceNode-parent;returnfalse;/取得方格中空的格子的位置voidgetPosition(PNodetheNode,int&row,int&col)for(inti=0;i3;i+)for(intj=0;jdataij=0)r
9、ow=i;col=j;return;/交換兩個數(shù)字的值voidchangeAB(int&A,int&B)intC;C=B;B=A;A=C;/檢查相應(yīng)的狀態(tài)是否在某一個鏈表中boolinLink(PNodespciNode,PNodetheLink,PNode&theNodeLink,PNode&preNode)preNode=theLink;theLink=theLink-next;while(theLink!=NULL)if(hasSameStatus(spciNode,theLink)theNodeLink=theLink;returntrue;preNode=theLink;theLin
10、k=theLink-next;returnfalse;/產(chǎn)生結(jié)點的后繼結(jié)點(與祖先狀態(tài)不同)鏈表voidSpringLink(PNodetheNode,PNode&spring)introw;intcol;getPosition(theNode,row,col);/空的格子右邊的格子向左移動if(col!=2)PNoderlNewNode=(PNode)malloc(sizeof(NNode);statusAEB(rlNewNode,theNode);changeAB(rlNewNode-datarowcol,rlNewNode-datarowcol+1);if(hasAnceSameStat
11、us(rlNewNode,theNode-parent)free(rlNewNode);/與父輩相同,丟棄本結(jié)點elserlNewNode-parent=theNode;rlNewNode-child=NULL;rlNewNode-next=NULL;computeAllValue(rlNewNode,theNode);/將本結(jié)點加入后繼結(jié)點鏈表addNode(spring,rlNewNode);/空的格子左邊的格子向右移動if(col!=0)PNodelrNewNode=(PNode)malloc(sizeof(NNode);statusAEB(lrNewNode,theNode);chan
12、geAB(lrNewNode-datarowcol,lrNewNode-datarowcol-1);if(hasAnceSameStatus(lrNewNode,theNode-parent)free(lrNewNode);/與父輩相同,丟棄本結(jié)點elselrNewNode-parent=theNode;lrNewNode-child=NULL;lrNewNode-next=NULL;computeAllValue(lrNewNode,theNode);/將本結(jié)點加入后繼結(jié)點鏈表addNode(spring,lrNewNode);/空的格子上邊的格子向下移動if(row!=0)PNodeudN
13、ewNode=(PNode)malloc(sizeof(NNode);statusAEB(udNewNode,theNode);changeAB(udNewNode-datarowcol,udNewNode-datarow-1col);if(hasAnceSameStatus(udNewNode,theNode-parent)free(udNewNode);/與父輩相同,丟棄本結(jié)點elseudNewNode-parent=theNode;udNewNode-child=NULL;udNewNode-next=NULL;computeAllValue(udNewNode,theNode);/將本
14、結(jié)點加入后繼結(jié)點鏈表addNode(spring,udNewNode);/空的格子下邊的格子向上移動if(row!=2)PNodeduNewNode=(PNode)malloc(sizeof(NNode);statusAEB(duNewNode,theNode);changeAB(duNewNode-datarowcol,duNewNode-datarow+1col);if(hasAnceSameStatus(duNewNode,theNode-parent)free(duNewNode);/與父輩相同,丟棄本結(jié)點elseduNewNode-parent=theNode;duNewNode-c
15、hild=NULL;duNewNode-next=NULL;computeAllValue(duNewNode,theNode);/將本結(jié)點加入后繼結(jié)點鏈表addNode(spring,duNewNode);/輸出給定結(jié)點的狀態(tài)voidoutputStatus(PNodestat)for(inti=0;i3;i+)for(intj=0;j3;j+)coutdataij;coutgvalue;if(goal-parent!=NULL)outputBestRoad(goal-parent);cout第deepnum-層的狀態(tài):endl;outputStatus(goal);voidAStar()P
16、NodetmpNode;/指向從open表中拿出并放到closed表中的結(jié)點的指針PNodespring;/tmpNode的后繼結(jié)點鏈PNodetmpLNode;/tmpNode的某一個后繼結(jié)點PNodetmpChartNode;PNodethePreNode;/指向?qū)⒁獜腸losed表中移到open表中的結(jié)點的前一個結(jié)點的指針boolgetGoal=false;/標識是否達到目標狀態(tài)longnumcount=1;/記錄從open表中拿出結(jié)點的序號initial。;/對函數(shù)進行初始化initLink(spring);/對后繼鏈表的初始化tmpChartNode=NULL;cout從open表中
17、拿出的結(jié)點的狀態(tài)及相應(yīng)的值endl;while(!isEmpty(open)從open表中拿出f值最小的元素,并將拿出的元素放入closed表中popNode(open,tmpNode);addNode(closed,tmpNode);cout第numcount+個狀態(tài)是:endl;outputStatus(tmpNode);cout其f值為:fvalueendl;cout其g值為:gvalueendl;cout其h值為:hvaluegvaluegvalue)tmpChartNode-parent=tmpLNode-parent;tmpChartNode-gvalue=tmpLNode-gva
18、lue;tmpChartNode-fvalue=tmpLNode-fvalue;free(tmpLNode);狀態(tài)在closed表中已經(jīng)存在elseif(inLink(tmpLNode,closed,tmpChartNode,thePreNode)addSpringNode(tmpNode,tmpChartNode);if(tmpLNode-gvaluegvalue)PNodecommu;tmpChartNode-parent=tmpLNode-parent;tmpChartNode-gvalue=tmpLNode-gvalue;tmpChartNode-fvalue=tmpLNode-fvalue;freeSpringLink(tmpChartNode-child);tmpChartNode-child=NULL;popNode(thePreNode,commu);addAscNode(open
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 汽車按揭貸款合同的利息計算
- 水資源開發(fā)利用合同
- 邢臺學(xué)院《籃球》2022-2023學(xué)年第一學(xué)期期末試卷
- 邢臺學(xué)院《中小學(xué)課余體育訓(xùn)練理論與方法》2022-2023學(xué)年第一學(xué)期期末試卷
- 吉林省延邊朝鮮族自治州(2024年-2025年小學(xué)五年級語文)人教版綜合練習(xí)(上學(xué)期)試卷及答案
- 高頻數(shù)據(jù)掃描:前期政策效果逐步顯現(xiàn)
- 2024年碎花片項目可行性研究報告
- 2024年心型盒裝糖果項目可行性研究報告
- 2024至2030年中國紅寶石耳釘數(shù)據(jù)監(jiān)測研究報告
- 手術(shù)室管理制度與流程
- 醫(yī)療器械風(fēng)險定性定量分析表
- 腐蝕與防護概述課件
- 屠宰企業(yè)(生豬屠宰場)安全風(fēng)險分級管控體系方案資料匯編(2022-2023年)
- 小學(xué)學(xué)生發(fā)展指導(dǎo)中心工作方案
- 哈工大自動控制原理大作業(yè)
- 班主任的工作藝術(shù)課件
- 2022年中國鹽業(yè)集團有限公司校園招聘筆試模擬試題及答案解析
- 決議、章程范本
- 部編版六年級語文上冊第24課《京劇趣談》優(yōu)質(zhì)課件(最新)
- 幼兒園中班健康教案《腸胃小鬧鐘》含反思
- 裝配式建筑精裝修裝配施工方法
評論
0/150
提交評論