人工智能算法實(shí)現(xiàn)_第1頁(yè)
人工智能算法實(shí)現(xiàn)_第2頁(yè)
人工智能算法實(shí)現(xiàn)_第3頁(yè)
人工智能算法實(shí)現(xiàn)_第4頁(yè)
人工智能算法實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩11頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、人工智能算法實(shí)現(xiàn):1A*算法c語(yǔ)言分步閱讀A*算法,A*(A-Star)算法是一種靜態(tài)路網(wǎng)中求解最短路最有效的方法。估價(jià)值與實(shí)際值越接近,估價(jià)函數(shù)取得就越好。A*1(A-Star)算法是一種靜態(tài)路網(wǎng)中求解最短路最有效的方法。公式表示為:f(n)=g(n)+h(n),其中f(n)是從初始點(diǎn)經(jīng)由節(jié)點(diǎn)n到目標(biāo)點(diǎn)的估價(jià)函數(shù),g(n)是在狀態(tài)空間中從初始節(jié)點(diǎn)到n節(jié)點(diǎn)的實(shí)際代價(jià),h(n)是從n到目標(biāo)節(jié)點(diǎn)最佳路徑的估計(jì)代價(jià)。保證找到最短路徑(最優(yōu)解的)條件,關(guān)鍵在于估價(jià)函數(shù)h(n)的選?。汗纼r(jià)值h(n)=n到目標(biāo)節(jié)點(diǎn)的距離實(shí)際值,這種情況下,搜索的點(diǎn)數(shù)多,搜索范圍大,效率低。但能得到最優(yōu)解。如果估價(jià)值實(shí)際值

2、,搜索的點(diǎn)數(shù)少,搜索范圍小,效率高,但不能保證得到最優(yōu)解。工具/原料DEVC+或VC6.0方法/步驟1.估價(jià)值與實(shí)際值越接近,估價(jià)函數(shù)取得就越好例如對(duì)于幾何路網(wǎng)來(lái)說(shuō),可以取兩節(jié)點(diǎn)間歐幾理德距離(直線距離)做為估價(jià)值,即f=g(n)+sqrt(dx-nx)*(dx-nx)+(dy-ny)*(dy-ny);這樣估價(jià)函數(shù)f在g值一定的情況下,會(huì)或多或少的受估價(jià)值h的制約,節(jié)點(diǎn)距目標(biāo)點(diǎn)近,h值小,f值相對(duì)就小,能保證最短路的搜索向終點(diǎn)的方向進(jìn)行。明顯優(yōu)于Dijkstra算法的毫無(wú)方向的向四周搜索。conditionsofheuristicOptimistic(mustbelessthanorequal

3、totherealcost)Asclosetotherealcostaspossible詳細(xì)內(nèi)容:創(chuàng)建兩個(gè)表,OPEN表保存所有已生成而未考察的節(jié)點(diǎn),CLOSED表中記錄已訪問(wèn)過(guò)的節(jié)點(diǎn)。算起點(diǎn)的估價(jià)值;將起點(diǎn)放入OPEN表;rJnrJnrJnnuDcmoxwDcmncdc&utDnutlUDDn_D.no.no.DD.D8BBDOBCTOnD.un_.n_nGno.no.nfi.nfi.D888BBaonD.un_CRn韶dR雷JB困電甫圉碁sdcihehhfHARRnnnHnnnHEn08.QHffmrirliARRR_nn_nn_nn_nn_8ijjtt!L=3LtiOLjL-rL-rrL

4、tidtCtiD口Qrlrlrlr豁皓5.ARRR_n_n_n_n_n_ftRRRBRBIEI鰲;ARRBSBig礬TIfiJa-RAnJriEJrlsl-LLX-nnrn.u.-V1.rI-r.TATI.Tfln.TL?.T-III.rA&1/11STZILJrl雷BBiiswaffiiEBRBR雷.至ER9B事.翳$sw!aa崔崔RE常當(dāng)蜃B8088B8B8pffiffiffi2.Astar算法在靜態(tài)路網(wǎng)中的應(yīng)用,以在地圖中找從開(kāi)始點(diǎn)s到e點(diǎn)的最短行走路徑為例:首先定義數(shù)據(jù)結(jié)構(gòu)#defineMAPMAXSIZE100地圖面積最大為100 x100#defineMAXINT8192/定義一個(gè)

5、最大整數(shù),地圖上任意兩點(diǎn)距離不會(huì)超過(guò)它#defineSTACKSIZE65536保存搜索節(jié)點(diǎn)的堆棧大小#definetile_num(x,y)(y)*map_w+(x)/將x,y坐標(biāo)轉(zhuǎn)換為地圖上塊的編號(hào)#definetile_x(n)(n)%map_w)/由塊編號(hào)得出x,y坐標(biāo)#definetile_y(n)(n)/map_w)/樹(shù)結(jié)構(gòu),比較特殊,是從葉節(jié)點(diǎn)向根節(jié)點(diǎn)反向鏈接typedefstructnode*TREE;structnodeinth;inttile;TREEfather;typedefstructnode2*LINK;structnode2TREEnode;intf;LINKne

6、xt;LINKqueue;/保存沒(méi)有處理的行走方法的節(jié)點(diǎn)TREEstackSTACKSIZE;/保存已經(jīng)處理過(guò)的節(jié)點(diǎn)(搜索完后釋放)intstacktop;charmap6=x,x,x,x,x,x,x,e,x,x,x,x,x,x,x,x,X,X,X,X,S,X,x,x,x,x,x,x;/地圖數(shù)據(jù)intdis_mapMAPMAXSIZEMAPMAXSIZE;保存搜索路徑時(shí),中間目標(biāo)地最優(yōu)解intmap_w,map_h;地圖寬和高intstart_x,start_y,end_x,end_y;地點(diǎn),終點(diǎn)坐標(biāo)/路徑尋找主函數(shù)voidfindpath(int*path)printf(%d,%d,%d,%

7、d,start_x,start_y,end_x,end_y);TREEroot;inti,j;stacktop=0;for(i=O;ivmap_h;i+)for(j=0;jtile=tile_num(start_x,start_y);root-h=0;root-father=NULL;enter_queue(root,judge(start_x,start_y);for(;)intx,y,child;TREEp;root=get_from_queue();訐(root=NULL)*path=-1;return;x=tile_x(root-tile);y=tile_y(root-tile);訐(

8、x=end_x&y=end_y)break;/達(dá)到目的地成功返回child=trytile(x,y-l,root);嘗試向上移動(dòng)child&=trytile(x,y+1,root);嘗試向下移動(dòng)child&=trytile(x-1,y,root);嘗試向左移動(dòng)child&=trytile(x+1,y,root);嘗試向右移動(dòng)訐(child!=0)pop_stack();如果四個(gè)方向均不能移動(dòng),釋放這個(gè)死節(jié)點(diǎn)/回溯樹(shù),將求出的最佳路徑保存在path中for(i=0;root;i+)pathi=root-tile;root=root-father;printf(pathis%d,pathi);pa

9、thi=-1;freetree();/估價(jià)函數(shù),估價(jià)x,y到目的地的距離,估計(jì)值必須保證比實(shí)際值小intjudge(intx,inty)intdistance;distance=abs(end_x-x)+abs(end_y-y);returndistance;/嘗試下一步移動(dòng)到x,y可行否inttrytile(intx,inty,TREEfather)TREEp=father;inth;if(mapyx=x)return1;/如果(x,y)處是障礙,失敗while(p)if(x=tile_x(p-tile)&y=tile_y(p-tile)return1;如果(x,y)曾經(jīng)經(jīng)過(guò),失敗p=p-f

10、ather;h=father-h+1;訐(h=dis_mapyx)return1;/如果曾經(jīng)有更好的方案移動(dòng)到(x,y)失敗dis_mapyx=h;記錄這次到(x,y)的距離為歷史最佳距離/將這步方案記入待處理隊(duì)列p=(TREE)malloc(sizeof(*p);p-father=father;p-h=father-h+l;p-tile=tile_num(x,y);enter_queue(p,p-h+judge(x,y);return0;LelE.gcc口xy|七=.百:*en.dly+1ki4b-3gccoxy13*zirE_K*1.jcaiT.j*lhc=3n.tflflbT?吐肌Hi廣

11、匚WI?匸時(shí)1gOT.CX/-il|1*1111MVISlep(JtQDaElftdtfsii-LhIfalfeMILDTfAChi口站j74a算法戎檢技搟ihtjj:sy勺EULf七I:11!;for(Kmaphi;i+ffQtQKyi+l);fbe(5*0JjsIsbprintff*);宮淀起始點(diǎn)*是終點(diǎn)叢任世越萍蠟)0BfifiS,*風(fēng)晝戲屯目.I器“?O口建A設(shè)我E凹辭至班5*gooKy(ex+ljendi_prmtfHe*4);VQtQHytsFtartK+ljsfxprlntf(a11!?5hcF777點(diǎn)任意鍵進(jìn)行運(yùn)行找靜態(tài)路網(wǎng)idtmain()isystcrat111title曉

12、.諄prni-f(m,.,.,歐mtpathMAXINTJ;rea.iiiap(.:-rhowiap():31ftep(2Q口口|$fxudrpati(pah);princpa.G-h(path)?ge-tch&S();sysEitm.(pause;ratarnCt;mtiC3*TE_M.1r匚上priDEt(sTj5.說(shuō)明:找到路后會(huì)存到一個(gè)數(shù)組中去,我們?yōu)榱孙@示這個(gè)過(guò)程可以運(yùn)用打印函數(shù)打印出來(lái)代碼如下voidprintpath(int*path)printf(-44444444444444);for(i=0;pathi=0;i+)gotoxy(tile_x(pathi)+l,tile_y(

13、pathi)+l);printf(-);Sleep(2000);printf(n);printf(n);printf(走迷宮完成);6.整個(gè)程序的代碼如下:#includevwindows.h#includestdio.h#includevconio.hBt-iGBa憾經(jīng)jinyan.baidu.cLsJL*lJKKKKKKtK旺沈出昶JtBai總經(jīng)驗(yàn)jimngyan.lbaiTul點(diǎn)常atirjayXii廣fartj-0j1j-mitdEUH外M1*ApHId甲雲(yún)?#includeassert.h#includestdlib.h#defineMAPMAXSIZE100地圖面積最大為100 x

14、100#defineMAXINT8192/定義一個(gè)最大整數(shù),地圖上任意兩點(diǎn)距離不會(huì)超過(guò)它#defineSTACKSIZE65536保存搜索節(jié)點(diǎn)的堆棧大小#definetile_num(x,y)(y)*map_w+(x)/將x,y坐標(biāo)轉(zhuǎn)換為地圖上塊的編號(hào)#definetile_x(n)(n)%map_w)/由塊編號(hào)得出x,y坐標(biāo)#definetile_y(n)(n)/map_w)/樹(shù)結(jié)構(gòu),比較特殊,是從葉節(jié)點(diǎn)向根節(jié)點(diǎn)反向鏈接typedefstructnode*TREE;struct/*/nodeinth;inttile;TREEfather;typedefstruct/*/node2*LINK;

15、structnode2TREEnode;intf;/*/LINKnext;LINKqueue;/保存沒(méi)有處理的行走方法的節(jié)點(diǎn)TREEstackSTACKSIZE;/保存已經(jīng)處理過(guò)的節(jié)點(diǎn)(搜索完后釋放)intstacktop;charmap6=x,x,x,x,x,x,x,e,x,x,x,x,x,x,x,x,x,x,x,x,s,x,x,x,x,x,x,x;/地圖數(shù)據(jù)intdis_map/*/MAPMAXSIZEMAPMAXSIZE;保存搜索路徑時(shí),中間目標(biāo)地最優(yōu)解intmap_w,map_h;地圖寬和高intstart_x,start_y,end_x,end_y;地點(diǎn),終點(diǎn)坐標(biāo)voidgotoxy

16、(intx,inty)HANDLEa;COORDzb;zb.X=x-l;zb.Y=y-1;GetStdHandle(STD_OUTPUT_HANDLE/*/);SetConsoleCursorPosition(a,zb);a=by/初始化隊(duì)列voidinit_queue()queue=(LINK)malloc(sizeof(*queue);queue-node=NULL;queue-f=-1;queue-next=(LINK)/*/malloc(sizeof(*queue);queue-next-f=MAXINT;queue-next-node=NULL;queue-next-next=NUL

17、L;/待處理節(jié)點(diǎn)入隊(duì)列,依靠對(duì)目的地估價(jià)距離插入排序byvoidenter_queue(TREEnode,intf)LINKp=queue,father,q;while(fp-f)father=p;p=p-next/*/;assert(p);q=(LINK)malloc(sizeof(*q);assert(queue);q-f=f,q-node=node,q-next=p;father-next=q;/將離目的地估計(jì)最近的方案出隊(duì)列TREEget_from_queue()TREEbestchoice=queue-next-node;LINKnext=queue-next-next;/*/fre

18、e(queue-next);queue-next=next;stackstacktop+=bestchoice;assert(stacktopvSTACKSIZE);return/*/bestchoice;/釋放棧頂節(jié)點(diǎn)voidpop_stack()free(stack-stacktop);/釋放申請(qǐng)過(guò)的所有節(jié)點(diǎn)voidfreetree()inti;LINKp;for(i=O;ivstacktop;i+)free(stack);while/*/(queue)p=queue;free(p-node);queue=queue-next;free(p);/估價(jià)函數(shù),估價(jià)x,y到目的地的距離,估計(jì)值必

19、須保證比實(shí)際值小intjudge(intx,inty)intdistance;distance=abs(end_x-x)+abs(end_y-y);returndistance;/嘗試下一步移動(dòng)到x,y可行否inttrytile(int/*/x,inty,TREEfather)TREEp=father;inth;if(mapyx=x)return1;/如果(x,y)處是障礙,失敗while(p)/*/if(x=tile_x(p-tile)&y=tile_y(p-tile)return1;/如果(x,y)曾經(jīng)經(jīng)過(guò),失敗p=p-father;h=father-h+1;訐(h=dis_mapyx)r

20、eturn1;/如果曾經(jīng)有更好的方案移動(dòng)到(x,y)失敗dis_mapyx=h;記錄這次到(x,y)的距離為歷史最佳距離/將這步方案記入待處理隊(duì)列p=(TREE)malloc(sizeof(*p);p-father=father;p-h=father-h+l;p-tile=tile_num(x,y);enter_queue(p,p-h+judge(x,y);return0;/路徑尋找主函數(shù)voidfindpath(int*path)printf(%d,%d,%d,%d,start_x,start_y,end_x,end_y);TREEroot;inti,j;stacktop=0;for(i=O

21、;ivmap_h;i+)for(j=0;jtile=tile_num(start_x,start_y);root-h=0;root-father=NULL;enter_queue(root,judge(start_x,start_y);for(;)intx,y,child;TREEp;root=get_from_queue();訐(root=NULL)*path=-1;return;x=tile_x(root-tile);y=tile_y(root-tile);訐(x=end_x&y=end_y)break;/達(dá)到目的地成功返回child=trytile(x,y-1,root);嘗試向上移動(dòng)c

22、hild&=trytile(x,y+1,root);嘗試向下移動(dòng)child&=trytile(x-1,y,root);嘗試向左移動(dòng)child&=trytile(x+1,y,root);嘗試向右移動(dòng)訐(child!=0)pop_stack();/如果四個(gè)方向均不能移動(dòng),釋放這個(gè)死節(jié)點(diǎn)/回溯樹(shù),將求出的最佳路徑保存在path中for(i=0;root;i+)pathi=root-tile;root=root-father;printf(pathis%d,pathi/*/);pathi=-1;freetree();voidprintpath(int*path)inti;printf(-44444444444444);

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論