




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、人工智能實驗一報告題目:采用A*算法解決八數(shù)碼問題姓名:張博涵學號:081110317專業(yè):信息與計算科學提交日期: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ù),進行算法初始條件的設置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;/檢查相應的狀態(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)及相應的值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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業(yè)自動化在制造業(yè)的應用前景
- 工業(yè)遺址改造為環(huán)境藝術設計的實踐
- 工業(yè)自動化技術對能源消耗的影響研究
- 工作中的高效化-從智慧家居看現(xiàn)代職場環(huán)境改造
- 工作效率與時間管理的心理學原理
- 工作滿意度與組織績效關系研究
- 工作空間的多元化與包容性設計
- 工程中的數(shù)學應用與思維訓練
- 工廠自動化設備的選型與配置
- 工作更高效的團隊設備應用指南
- 高等職業(yè)學校鐵道機車車輛制造與維護專業(yè)崗位實習標準
- 重慶市巡游出租汽車駕駛員區(qū)域科目參考試題庫(含答案)
- 2024至2030年中國醫(yī)療信息化行業(yè)趨勢研究及投資前景分析報告
- 蘇教版四年級科學下冊復習方法
- 南昌市產(chǎn)業(yè)投資集團有限公司人才招聘筆試真題2023
- 2024年湖南省初中學業(yè)水平模擬考試英語試題(定心卷)
- 2022年西藏中考地理真題
- 劇毒易制爆化學品防盜、防搶、防破壞及技術防范系統(tǒng)發(fā)生故障等狀態(tài)下的應急處置預案
- 壯族文化宣傳介飲食服飾建筑風俗習慣特點傳統(tǒng)節(jié)日課件
- 降低患者便秘品管圈課件
- 《國有企業(yè)管理人員處分條例》重點解讀
評論
0/150
提交評論