人工智能課程設(shè)計(jì)報(bào)告-羅馬尼亞度假問(wèn)題_第1頁(yè)
人工智能課程設(shè)計(jì)報(bào)告-羅馬尼亞度假問(wèn)題_第2頁(yè)
人工智能課程設(shè)計(jì)報(bào)告-羅馬尼亞度假問(wèn)題_第3頁(yè)
人工智能課程設(shè)計(jì)報(bào)告-羅馬尼亞度假問(wèn)題_第4頁(yè)
人工智能課程設(shè)計(jì)報(bào)告-羅馬尼亞度假問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩45頁(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è)計(jì)報(bào)告 課 程:人工智能能課程設(shè)計(jì)計(jì)報(bào)告 班 級(jí): 姓 名: 學(xué) 號(hào): 指導(dǎo)教師:趙曼 2015年年11月 - 49 -人工智能課課程設(shè)計(jì)報(bào)報(bào)告課程背景 人工智能(AArtifficiaal Inntellligennce),英英文縮寫為為AI。它它是研究、開(kāi)發(fā)用于于模擬、延延伸和擴(kuò)展展人的智能能的理論、方法、技技術(shù)及應(yīng)用用系統(tǒng)的一一門新的技技術(shù)科學(xué)。 人工智智能是計(jì)算算機(jī)科學(xué)的的一個(gè)分支支,它企圖圖了解智能能的實(shí)質(zhì),并并生產(chǎn)出一一種新的能能以人類智智能相似的的方式做出出反應(yīng)的智智能機(jī)器,該該領(lǐng)域的研研究包括機(jī)機(jī)器人、語(yǔ)語(yǔ)言識(shí)別、圖像識(shí)別別、自然語(yǔ)語(yǔ)言處理和和專家系統(tǒng)統(tǒng)等。人工工

2、智能從誕誕生以來(lái),理理論和技術(shù)術(shù)日益成熟熟,應(yīng)用領(lǐng)領(lǐng)域也不斷斷擴(kuò)大,可可以設(shè)想,未未來(lái)人工智智能帶來(lái)的的科技產(chǎn)品品,將會(huì)是是人類智慧慧的“容器”。人工智能是是對(duì)人的意意識(shí)、思維維的信息過(guò)過(guò)程的模擬擬。人工智智能不是人人的智能,但但能像人那那樣思考、也可能超超過(guò)人的智智能。人工智能是是一門極富富挑戰(zhàn)性的的科學(xué),從從事這項(xiàng)工工作的人必必須懂得計(jì)計(jì)算機(jī)知識(shí)識(shí),心理學(xué)學(xué)和哲學(xué)。人工智能能是包括十十分廣泛的的科學(xué),它它由不同的的領(lǐng)域組成成,如機(jī)器器學(xué)習(xí),計(jì)計(jì)算機(jī)視覺(jué)覺(jué)等等,總總的說(shuō)來(lái),人人工智能研研究的一個(gè)個(gè)主要目標(biāo)標(biāo)是使機(jī)器器能夠勝任任一些通常常需要人類類智能才能能完成的復(fù)復(fù)雜工作。但不同的的時(shí)代、不

3、不同的人對(duì)對(duì)這種“復(fù)雜工作作”的理解是是不同的。人工智能是是計(jì)算機(jī)學(xué)學(xué)科的一個(gè)個(gè)分支,二二十世紀(jì)七七十年代以以來(lái)被稱為為世界三大大尖端技術(shù)術(shù)之一(空空間技術(shù)、能源技術(shù)術(shù)、人工智智能)。也也被認(rèn)為是是二十一世世紀(jì)三大尖尖端技術(shù)(基基因工程、納米科學(xué)學(xué)、人工智智能)之一一。這是因因?yàn)榻陙?lái)它獲獲得了迅速速的發(fā)展,在在很多學(xué)科科領(lǐng)域都獲獲得了廣泛泛應(yīng)用,并并取得了豐豐碩的成果果,人工智智能已逐步步成為一個(gè)個(gè)獨(dú)立的分分支,無(wú)論論在理論和和實(shí)踐上都都已自成一一個(gè)系統(tǒng)。人工智能是是研究使計(jì)計(jì)算機(jī)來(lái)模模擬人的某某些思維過(guò)過(guò)程和智能能行為(如如學(xué)習(xí)、推推理、思考考、規(guī)劃等等)的學(xué)科科,主要包包括計(jì)算機(jī)機(jī)

4、實(shí)現(xiàn)智能能的原理、制造類似似于人腦智智能的計(jì)算算機(jī),使計(jì)計(jì)算機(jī)能實(shí)實(shí)現(xiàn)更高層層次的應(yīng)用用。人工智智能將涉及及到計(jì)算機(jī)機(jī)科學(xué)、心心理學(xué)、哲哲學(xué)和語(yǔ)言言學(xué)等學(xué)科科??梢哉f(shuō)說(shuō)幾乎是自自然科學(xué)和和社會(huì)科學(xué)學(xué)的所有學(xué)學(xué)科,其范范圍已遠(yuǎn)遠(yuǎn)遠(yuǎn)超出了計(jì)計(jì)算機(jī)科學(xué)學(xué)的范疇,人人工智能與與思維科學(xué)學(xué)的關(guān)系是是實(shí)踐和理理論的關(guān)系系,人工智智能是處于于思維科學(xué)學(xué)的技術(shù)應(yīng)應(yīng)用層次,是是它的一個(gè)個(gè)應(yīng)用分支支。從思維維觀點(diǎn)看,人人工智能不不僅限于邏邏輯思維,要要考慮形象象思維、靈靈感思維才才能促進(jìn)人人工智能的的突破性的的發(fā)展,數(shù)數(shù)學(xué)常被認(rèn)認(rèn)為是多種種學(xué)科的基基礎(chǔ)科學(xué),數(shù)數(shù)學(xué)也進(jìn)入入語(yǔ)言、思思維領(lǐng)域,人人工智能學(xué)學(xué)科也必須須

5、借用數(shù)學(xué)學(xué)工具,數(shù)數(shù)學(xué)不僅在在標(biāo)準(zhǔn)邏輯輯、模糊數(shù)數(shù)學(xué)等范圍圍發(fā)揮作用用,數(shù)學(xué)進(jìn)進(jìn)入人工智智能學(xué)科,它它們將互相相促進(jìn)而更更快地發(fā)展展。題目一:羅羅馬利亞度度假問(wèn)題一. 問(wèn)題題描述分別用代價(jià)價(jià)一致的寬寬度優(yōu)先、有限制的的深度優(yōu)先先(預(yù)設(shè)搜搜索層次)、貪婪算法法和A*算法求解解“羅馬利亞亞度假問(wèn)題題”。即找到從從初始地點(diǎn)點(diǎn) Araad到 目目的地點(diǎn) Buchharesst 的一條路路徑。要求:分別用文件件存儲(chǔ)地圖圖和啟發(fā)函函數(shù)表,用用生成節(jié)點(diǎn)點(diǎn)數(shù)比較幾幾種算法在在問(wèn)題求解解時(shí)的效率率,并列表給出出結(jié)果。數(shù)據(jù)如下:1、地圖2、啟發(fā)函函數(shù)值A(chǔ)rad 366 Mehaadia 241 Buchhares

6、st 0 Neammt 2334 Craiiova 160 Oraddea 3380 Dobeerta 242Pitessti 1100 Eforrie 1161 Rimmmicu_Vikeea 1993 Fagaaras 176 Sibiiu 2553 Glurrgiu 77Timissoaraa 3299 Hirssova 151 Urziicenii 80 Iasii 2266 Vasllui 1199 Lugooj 2444 Zeriind 33743、地圖數(shù)數(shù)據(jù)表0 10000 10000 10000 11000 10000 10000 10000 11000 10000 10000

7、 1440 10000 1188 10000 10000 11000 10000 10000 7551000 0 10000 10000 11000 10000 75 10000 10000 11000 10000 10000 10000 11000 10000 10000 10000 11000 70 100001000 10000 0 10000 11000 10000 10000 1001 10000 10000 2211 10000 900 10000 11000 85 10000 10000 11000 100001000 10000 10000 0 10000 11000 1000

8、0 10000 10000 11000 10000 10000 10000 11000 10000 10000 877 10000 10000 110001000 10000 10000 10000 00 10000 1200 138 10000 1466 10000 10000 11000 10000 10000 10000 11000 10000 10000 100001000 10000 10000 10000 11000 0 10000 10000 11000 10000 10000 1551 10000 10000 11000 10000 10000 10000 11000 7110

9、00 75 10000 10000 1120 10000 0 10000 11000 10000 10000 10000 11000 10000 10000 10000 11000 10000 10000 100001000 10000 1011 10000 1388 10000 10000 0 10000 997 10000 10000 10000 11000 10000 10000 10000 11000 10000 100001000 10000 10000 10000 11000 10000 10000 10000 00 11000 10000 10000 10000 11000 86

10、 10000 10000 11000 10000 100001000 10000 10000 10000 1146 10000 10000 977 10000 0 10000 880 10000 11000 10000 10000 10000 11000 10000 100001000 10000 2111 10000 10000 10000 11000 10000 10000 10000 00 999 10000 10000 10000 11000 10000 10000 10000 11000140 10000 10000 10000 11000 151 10000 10000 10000

11、 880 99 0 10000 10000 10000 11000 10000 10000 10000 110001000 10000 90 10000 10000 11000 10000 10000 10000 11000 10000 10000 0 10000 11000 10000 10000 10000 11000 10000118 10000 10000 10000 11000 10000 10000 10000 11000 10000 10000 10000 11000 0 10000 10000 11000 10000 1111 100001000 10000 10000 100

12、00 11000 10000 10000 10000 886 10000 10000 10000 11000 10000 0 988 10000 11000 10000 100001000 10000 85 10000 10000 11000 10000 10000 10000 11000 10000 10000 10000 11000 98 0 10000 10000 10000 110001000 10000 10000 877 10000 10000 11000 10000 10000 10000 11000 10000 10000 10000 11000 10000 0 922 100

13、00 100001000 10000 10000 10000 11000 10000 10000 10000 11000 10000 10000 10000 11000 10000 10000 10000 992 0 10000 100001000 70 10000 10000 11000 10000 10000 10000 11000 10000 10000 10000 11000 111 10000 10000 10000 11000 0 1000075 10000 10000 10000 11000 71 10000 10000 11000 10000 10000 10000 11000

14、 10000 10000 10000 11000 10000 10000 0二.設(shè)計(jì)分分析1.算法分分析 1) 寬度優(yōu)先先搜索算法廣度優(yōu)先搜搜索使用隊(duì)隊(duì)列(quueue)來(lái)來(lái)實(shí)現(xiàn)1、把根節(jié)節(jié)點(diǎn)放到隊(duì)隊(duì)列的末尾尾。2、每次從從隊(duì)列的頭頭部取出一一個(gè)元素,查查看這個(gè)元元素所有的的下一級(jí)元元素,把它它們放到隊(duì)隊(duì)列的末尾尾。并把這這個(gè)元素記記為它下一一級(jí)元素的的前驅(qū)。3、找到所所要找的元元素時(shí)結(jié)束束程序。4、如果遍遍歷整個(gè)圖圖還沒(méi)有找找到,結(jié)束束程序。2)深度優(yōu)優(yōu)先搜索算算法深度優(yōu)先搜搜索用棧(sstackk)來(lái)實(shí)現(xiàn)現(xiàn),整個(gè)過(guò)過(guò)程可以想想象成一個(gè)個(gè)倒立的樹樹形:1、把根節(jié)節(jié)點(diǎn)壓入棧棧中。2、每次從從棧

15、中彈出出一個(gè)元素素,搜索所所有在它下下一級(jí)的元元素,把這這些元素壓壓入棧中。并把這個(gè)個(gè)元素記為為它下一級(jí)級(jí)元素的前前驅(qū)。3、找到所所要找的元元素時(shí)結(jié)束束程序。4、如果遍遍歷整個(gè)樹樹還沒(méi)有找找到,結(jié)束束程序。3)貪婪算算法1.建立數(shù)數(shù)學(xué)模型來(lái)來(lái)描述問(wèn)題題把求解的的問(wèn)題分成成若干個(gè)子子問(wèn)題。對(duì)每一子子問(wèn)題求解解,得到子子問(wèn)題的局局部最優(yōu)解解。把子問(wèn)題題的解局部部最優(yōu)解合合成原來(lái)解解問(wèn)題的一一個(gè)解。實(shí)現(xiàn)該算法法的過(guò)程:從問(wèn)題的某某一初始解解出發(fā);whilee 能朝給給定總目標(biāo)標(biāo)前進(jìn)一步步do求出可行解解的一個(gè)解解元素;由所有解元元素組合成成問(wèn)題的一一個(gè)可行解解。4)A*算算法A*1 (AA-Staa

16、r)算法法是一種靜靜態(tài)路網(wǎng)中中求解最短短路最有效效的直接搜搜索方法。公式表示為為: f(n)=gg(n)+h(n),其中 f(n) 是是從初始點(diǎn)點(diǎn)經(jīng)由節(jié)點(diǎn)點(diǎn)n到目標(biāo)標(biāo)點(diǎn)的估價(jià)價(jià)函數(shù),g(n) 是在狀態(tài)態(tài)空間中從從初始節(jié)點(diǎn)點(diǎn)到n節(jié)點(diǎn)點(diǎn)的實(shí)際代代價(jià),h(n) 是從n到到目標(biāo)節(jié)點(diǎn)點(diǎn)最佳路徑徑的估計(jì)代代價(jià)。保證找到最最短路徑(最最優(yōu)解的)條條件,關(guān)鍵鍵在于估價(jià)價(jià)函數(shù)f(n)的選選?。汗纼r(jià)值h(n)實(shí)際際值,搜索索的點(diǎn)數(shù)少少,搜索范范圍小,效效率高,但但不能保證證得到最優(yōu)優(yōu)解。2.數(shù)據(jù)結(jié)結(jié)構(gòu)1)圖結(jié)構(gòu)構(gòu): 實(shí)現(xiàn)存儲(chǔ)儲(chǔ)“羅馬尼亞亞度假問(wèn)題題”的圖空間間; 抽象圖結(jié)結(jié)構(gòu)的實(shí)現(xiàn)現(xiàn):typeddef struu

17、ct /圖節(jié)節(jié)點(diǎn)類型charr cittynamme200;int vallue;int cosst;Ver;classs Grapph /圖圖結(jié)構(gòu)publiic:Grapph();Graaph(); VVer VVMaxxV;int edgeeMaxxVMaxxV;int numoofedgges; /注意這這個(gè)變量的的引用位置置/讀取取地圖節(jié)點(diǎn)點(diǎn)信息voidd ReaadVerrtex();/讀取取地圖邊關(guān)關(guān)系信息voidd ReaadEdgge();/取與與第V個(gè)節(jié)節(jié)點(diǎn)的第一一個(gè)鄰接點(diǎn)點(diǎn)int GetFFirsttVerttex(iint vv);/找到到第V1個(gè)個(gè)節(jié)點(diǎn)的VV2之后的的下

18、一個(gè)鄰鄰接節(jié)點(diǎn)int GetNNextVVerteex(innt v11, innt v22);int GetVVerVaalue(int iindexx);/獲取Vindeex 的的ver 的vallue值int GetVVerCoost(iint iindexx);/獲取Vindeex 的的ver 的cosst 值int GetEEdge(int rrow, int ccol);/獲取取edgeerowwcool 的的值voidd SettVerCCost(int iindexx,intt cosst);2)隊(duì)列結(jié)結(jié)構(gòu)寬度優(yōu)先算算法以及AA*算法 使用到。抽象隊(duì)列結(jié)結(jié)構(gòu)實(shí)現(xiàn):classs

19、SeqQQueueepubliic:SeqQQueuee();SeqqQueuue();voidd QueeueInnitiaate();int QueuueNottEmptty();int QueuueApppend(int xx);int QueuueDellete(int *d);int QueuueOrdderApppendd(intt x, Grapph &GG);/A*算法使用用int Queuue_A_OrdeerApppend(int xx, Grraph &G);privaate:int queuueMaaxSizze;int rearr;int fronnt;int cou

20、nnt;3)棧結(jié)構(gòu)構(gòu)深度優(yōu)先算算法使用;棧結(jié)構(gòu)的抽抽象類型實(shí)實(shí)現(xiàn):classs Stacckpubliic:Stacck();Staack();booll StaackNootFulll();booll StaakNottEmptty();voidd StaackPoop(Grraph &G);voidd StaackPuush(iint xx, Grraph &G);voidd PriintSttack(Grapph &GG);int GetWWeighht();privaate:int a1000;int top11;int weigght;三.算法設(shè)設(shè)計(jì)1) 寬度度優(yōu)先搜索索算法/寬度優(yōu)

21、優(yōu)先算法void Romaania_Tripp:BrroadFFirsttSearrch(GGraphh &graaph, int v)int u, ww; i = 0;SeqCCQuenne quueue;visiitedv = 1;/訪問(wèn)節(jié)點(diǎn)點(diǎn)counnt+;if (v = end)retuurn;queuue.QuueueAAppennd( vv);/入入隊(duì)列whille (qqueuee.QueeueNootEmppty()/隊(duì)隊(duì)列非空queeue.QQueueeDeleete(&u);/取隊(duì)列列節(jié)點(diǎn)w = graaph.GGetFiirstVVerteex( uu);whiile (

22、w != -1) /有子子節(jié)點(diǎn)的話話iff (!vvisittedww)/如果子節(jié)節(jié)點(diǎn)未被訪訪問(wèn),則訪問(wèn)子子節(jié)點(diǎn)VVisitt(w, u);vvisittedww = 1;ccountt+;iif (ww = end)/找到到結(jié)果Prinnt(grraph, b, end, v);retuurn;qqueuee.QueeueApppendd(w);/節(jié)點(diǎn)點(diǎn)壓入隊(duì)列列w = grraph.GetNNextVVerteex(u, w);2)深度優(yōu)優(yōu)先搜索算算法/深度優(yōu)優(yōu)先算法bool isOKK = ffalsee;int llevell = 00;constt int LLevell = 88;

23、/預(yù)預(yù)設(shè)的搜索索層次void Romaania_Tripp:DeepthFFirsttSearrch(GGraphh &graaph, int v, Stackk &staack)int w; ii = 00;if (isOKK = truee)retuurn;if (leveel+1 Leevel)retuurn;/大于于搜索層次次時(shí)不再深深入leveel+;visiitedv = 1;/訪問(wèn)該節(jié)節(jié)點(diǎn)counnt+;stacck.SttackPPush(v, graaph);if (v = end | sstackk.GettWeigght() = MaxWWeighht)w = -1;if

24、 (v = end&staack.GGetWeeightt() = MaaxWeiight)coout sttack.GetWWeighht()MMaxWeeightt = sstackk.GettWeigght();*/coout 路徑徑長(zhǎng)度為: staack.GGetWeeightt() enndl 訪問(wèn)問(wèn)節(jié)點(diǎn)數(shù)為為: coount eendl搜索層層次:levvelendll;issOK = truue;elseew = graaph.GGetFiirstVVerteex(v);/取取當(dāng)前節(jié)點(diǎn)點(diǎn)的第一個(gè)個(gè)子節(jié)點(diǎn)whille (ww != -1)if (!viisiteedw)Deepth

25、FFirsttSearrch(ggraphh, w, staack);/遞歸歸訪問(wèn)w = graaph.GGetNeextVeertexx(v, w);/取取當(dāng)前節(jié)點(diǎn)點(diǎn)的下一個(gè)個(gè)子節(jié)點(diǎn)visiitedv = 0;/返回時(shí)置置該節(jié)點(diǎn)為為未訪問(wèn)stacck.SttackPPop( grapph);/將將該節(jié)點(diǎn)彈彈出棧,并并根據(jù)grraph 中weiight 的值更改改當(dāng)前棧值值leveel-;3)貪婪算算法/貪婪算算法void Romaania_Tripp:Grreedyy_Alggoritthms(Grapph &graaph, int v)int u, ww;SeqCCQuenne quueu

26、e;/隊(duì)列列存儲(chǔ)圖節(jié)節(jié)點(diǎn)在圖中中的索引值值,優(yōu)先隊(duì)隊(duì)列,vaalue小小的在隊(duì)頭頭visiitedv = 1;if (v = end) reeturnn; queuue.QuueueOOrderrAppeend( v, graaph);/圖節(jié)節(jié)點(diǎn)按優(yōu)先先順序入隊(duì)隊(duì)列counnt+; /訪訪問(wèn)節(jié)點(diǎn)數(shù)數(shù)+1whille (qqueuee.QueeueNootEmppty()/寬寬度優(yōu)先,循循環(huán)queeue.QQueueeDeleete( &u);/刪除除隊(duì)列頭元元素并返回回刪除的數(shù)數(shù)值/ccout u= u ;w = graaph.GGetFiirstVVerteex(u);whiile (w !

27、= -1)iff (!vvisittedww)VVisitt(w, u);/訪問(wèn)ww節(jié)點(diǎn),將將way b 的指指向更新iif (ww = end) /coout ww=ennd;counnt+; retuurn; qqueuee.QueeueOrrderAAppennd( ww, grraph); /圖節(jié)點(diǎn)按按優(yōu)先順序序入隊(duì)列ccountt+;w = grraph.GetNNextVVerteex(u, w);4)A*算法/A*算算法void Romaania_Tripp:ASStar_Algoorithhms(GGraphh &graaph, int v)/i = 0; couunt = 0

28、;int u, ww;SeqCCQuenne quueue;if (v = end) retturn;/到達(dá)達(dá)終點(diǎn)queuue.Quueue_A_OrrderAAppennd(v, graaph); counnt+;whille (qqueuee.QueeueNootEmppty()queeue.QQueueeDeleete( &u);if (u = ennd)coout 路徑徑長(zhǎng)度為: graaph.GGetVeerCosst(u) + ggraphh.GettVerVValuee(u) eendl 訪問(wèn)問(wèn)節(jié)點(diǎn)數(shù)為為: coount eendl;reeturnn;w = graaph.GGe

29、tFiirstVVerteex( uu);whiile (w != -1)innt coost=ggraphh.GettVerCCost(u) + graaph.GGetEddge(ww,u);grraph.SetVVerCoost(ww, coost);/設(shè)置置當(dāng)前節(jié)點(diǎn)點(diǎn)移動(dòng)到目目標(biāo)節(jié)點(diǎn)的的預(yù)估費(fèi)用用quueue.Queuue_A_OrdeerApppend( w, grapph);/按按預(yù)估費(fèi)用用優(yōu)先入隊(duì)隊(duì)列 coount+;w = grraph.GetNNextVVerteex(u, w);四.運(yùn)行結(jié)結(jié)果及分析析分析:節(jié)點(diǎn)數(shù)路徑長(zhǎng)度耗時(shí)msOptimmalitty: Complleten

30、ness: BFS1145016NoYESDFS 1260531NoNOGreeddy845016NONOA*算法164180YESYES通過(guò)比較,GGreeddy搜索生生成的結(jié)點(diǎn)點(diǎn)數(shù)目最少少,為8個(gè)個(gè),效率最最高;A*算法生成成的結(jié)點(diǎn)數(shù)數(shù)目最多,為為30個(gè),效效率最低。DFS(一一般)、BFS和和Greeedy搜索索找到的都都不一定最最優(yōu)解, A*算法法具有完備備性且始終終找到的是是最優(yōu)解。寬度優(yōu)先先雖然是完完備的(如如果分支因因子有限的的話),在在任何情況況下寬度優(yōu)優(yōu)先都能找找到一個(gè)解解,但是,它它找到的第第一個(gè)解并并非最優(yōu)的的,此外,最最壞的情況況是,當(dāng)目目標(biāo)結(jié)點(diǎn)是是第d層的的最后一個(gè)個(gè)

31、被擴(kuò)展的的結(jié)點(diǎn)時(shí),它它將耗費(fèi)大大量的時(shí)間間。寬度優(yōu)優(yōu)先時(shí)間復(fù)復(fù)雜度:(bb為分支因因子,d為為深度);空間復(fù)雜雜度為所存存儲(chǔ)的節(jié)點(diǎn)點(diǎn)的個(gè)數(shù)。DFS不不是完備的的(除非查查找空間是是有限的),同同時(shí),它也也不能找到到最優(yōu)解。深度優(yōu)先先的時(shí)間復(fù)復(fù)雜度:;空間復(fù)雜雜度:(bb為分支因因子,m為為深度,僅僅有一枝需需要存儲(chǔ));。貪婪算算法不是完完備的。同同時(shí),它找找到的解也也不一定是是最優(yōu)解。其時(shí)間復(fù)復(fù)雜度:(bb代表分支支數(shù),m為為深度);空間復(fù)雜雜度為)。所以只有有A*算法法和DFSS(回溯+剪枝)是是完備的,且且能夠找到到最優(yōu)解;其時(shí)間復(fù)復(fù)雜度:擴(kuò)擴(kuò)展節(jié)點(diǎn)的的數(shù)目;空空間復(fù)雜度度:所有生生成的結(jié)

32、點(diǎn)點(diǎn)。綜合來(lái)來(lái)看,BFFS和貪婪婪算法的效效率較高,但但解并非最最優(yōu),而AA*算法的的效率稍遜遜色,但解解為最優(yōu);DFS(回回溯+剪枝枝)搜索雖雖能找到最最優(yōu)解但效效率最低。源代碼/Graaph.hh#praggma onceeusingg nameespacce sttd;#defiine MaxVV 20 /*#iffndeff MY_DEBUUG#defiine MMY_DEEBUG #endiif*/typeddef struuctcharr cittynamme200;/城市名int vallue;/權(quán)值int cosst;/A*算法法中從當(dāng)前前節(jié)點(diǎn)移動(dòng)動(dòng)到目標(biāo)節(jié)節(jié)點(diǎn)的預(yù)估估費(fèi)用Ve

33、r;classs Grapphpubliic:Grapph();Graaph(); VVer VVMaxxV;int edgeeMaxxVMaxxV;int numoofedgges; /注意這這個(gè)變量的的引用位置置/讀取取地圖節(jié)點(diǎn)點(diǎn)信息voidd ReaadVerrtex();/讀取取地圖邊關(guān)關(guān)系信息voidd ReaadEdgge();/取與與第V個(gè)節(jié)節(jié)點(diǎn)的第一一個(gè)鄰接點(diǎn)點(diǎn)int GetFFirsttVerttex(iint vv);/找到到第V1個(gè)個(gè)節(jié)點(diǎn)的VV2之后的的下一個(gè)鄰鄰接節(jié)點(diǎn)int GetNNextVVerteex(innt v11, innt v22);int GetVVer

34、Vaalue(int iindexx);/獲取Vindeex 的的ver 的vallue值int GetVVerCoost(iint iindexx);/獲取Vindeex 的的ver 的cosst 值int GetEEdge(int rrow, int ccol);/獲取取edgeerowwcool 的的值voidd SettVerCCost(int iindexx,intt cosst);privaate:;/Queeue.hh#praggma oncee#incllude#incllude Staack.hh#defiine MaxSSize 30/*#iffndeff MY_DEBUU

35、G#defiine MMY_DEEBUG #endiif/*/classs SeqQQueueepubliic:SeqQQueuee();SeqqQueuue();voidd QueeueInnitiaate();int QueuueNottEmptty();int QueuueApppend(int xx);int QueuueDellete(int *d);int QueuueOrdderApppendd(intt x, Grapph &GG);/A*算法使用用int Queuue_A_OrdeerApppend(int xx, Grraph &G);privaate:int queuue

36、MaaxSizze;int rearr;int fronnt;int counnt;typeddef SeqQQueuee SeqCCQuenne;/Rommaniaa_Triip.h#praggma oncee#incllude Queeue.hhtypeddef struuctint fathher;int me;way;classs Romaania_Tripppubliic:Romaania_Tripp();Rommaniaa_Triip();voidd Vissit(iint vv, innt u);voidd Priint(GGraphh &grraph, wayy *b, int

37、t endd, innt sttart);voidd BrooadFiirstSSearcch(Grraph &graaph, int vv);voidd DeppthFiirstSSearcch(Grraph &graaph, int vv,Staack &stacck);voidd Greeedy_Algoorithhms(GGraphh &grraph, intt v);voidd ASttar_AAlgorrithmms(Grraph &graaph, int vv);voidd ReSSet();int GetCCountt();int GetMMaxWeeightt();int G

38、etEEnd();way* GettB();privaate:way *b;int i;int end;int counnt;int visiitedCCity20;int MaxWWeighht;int visiited20;/Staack.hh#praggma oncee#inclludeGrapph.h#inclludeusingg nameespacce sttd;/*#iffndeff MY_DEBUUG#defiine MMY_DEEBUG #endiif*/classs Stacckpubliic:Stacck();Staack();booll StaackNootFulll()

39、;booll StaakNottEmptty();voidd StaackPoop(Grraph &G);voidd StaackPuush(iint xx, Grraph &G);voidd PriintSttack(Grapph &GG);int GetWWeighht();privaate:int a1000;int top11;int weigght;/Graaph.ccpp#inclludeGrapph.h#incllude#incllude#incllude#inclludeusingg nameespacce sttd;Graphh:Graaph()numoofedgges =

40、0;Graphh:GGraphh()void Grapph:RReadVVerteex()int i=0, v;charr ch20;fstrream infiile(啟發(fā)式數(shù)數(shù)值.txxt, ios:in);whille (iinfille ch & iinfille v)#ifdeef MYY_DEBBUGpriintf(%st%dn, ch, v);#endiifVii.vaalue = v;Vii.coost = 0;strrcpy(Vi.cittynamme, cch);i+;void Grapph:RReadEEdge()int valuu, i;fstrream infiile(

41、地圖數(shù)據(jù)據(jù)表.txxt, ios:in);i = 0;whille (iinfille vallu)edggei / 200i % 200 = valuu;#ifdeef MYY_DEBBUGif (i % 20 = 00)couut enddl;couuteedgei/200i%20tt;#endiifi+;/取與第第V個(gè)節(jié)點(diǎn)點(diǎn)的第一個(gè)個(gè)鄰接點(diǎn)int GGraphh:GeetFirrstVeertexx(intt v)if (v= 20)retturn -1;for (intt coll = 00; cool00 & edgeevcool11000)retturn col;retuurn -

42、1;/找到第第V1個(gè)節(jié)節(jié)點(diǎn)的V22之后的下下一個(gè)鄰接接節(jié)點(diǎn)int GGraphh:GeetNexxtVerrtex(int v1, intt v2)if (v1= 20 | vv2= 20)retturn -1;for (intt coll= v22 + 11; cool0 & edggev11cool11000)retturn col;retuurn -1;int GGraphh:GeetVerrValuue(innt indeex)/獲取取Vinndex 的veer 的vvaluees值retuurn VVinddex.valuue;int GGraphh:GeetVerrCostt(in

43、tt indeex)/獲取取Vinndex 的veer 的ccost 值retuurn VVinddex.costt;int GGraphh:GeetEdgge(innt row, int col)/獲取取edgeerowwcool 的的值retuurn eedgerowcol;void Grapph:SSetVeerCosst(innt indeex, intt costt)Vinndex.cosst = costt;/Queeue.ccpp#inclludeQueuue.h#incllude#incllude Staack.hhSeqQuueue:SeqqQueuue()rearr = 0

44、0;fronnt = 0;counnt = 0;SeqQuueue:SeeqQueeue()int SSeqQuueue:QueeueNootEmppty()if (counnt != 0)rreturrn 1;elsee retuurn 00;int SSeqQuueue:QueeueApppendd( innt x)if (counnt0 & rrear = ffrontt)couut 隊(duì)列列已滿 eendl;retturn 0;elseequeeuerrear = xx;reaar = (reaar + 1) % MaxxSizee;couunt+;retturn 1;int SSeqQ

45、uueue:QueeueDeeletee( innt *d)if (counnt = 0)couut 隊(duì)列列已空 0 & rrear = ffrontt)couut 隊(duì)列列已滿 = GG.Vqqueueereaar - 1.valuue)/隊(duì)尾插入入quueuerearr = x;reear = (reear + 1) % MaaxSizze;coount+;reeturnn 1;elsseiff (G.Vx.vaalue G.Vqqueueepossitioon.valuue)posiitionn+;iint ii;ffor (i = fronnt; ii0 & rrear = ffront

46、t)couut 隊(duì)列列已滿 x22 )/隊(duì)尾插入入quueuerearr = x;reear = (reear + 1) % MaaxSizze;coount+;reeturnn 1;elsse /隊(duì)頭插插入iff (G.Vx.vaalue + G.Vx.coost G.Vqqueueepossitioon%MaaxSizze.valuue + G.Vqqueueepossitioon%MaaxSizze.costt)posiitionn+;iint ii;ffor (i = fronnt; iipossitioon; ii+)queuue(ii - 11 + MMaxSiize) % Maa

47、xSizze = queeueii%MaxxSizee;qqueuee(i - 1 + MaaxSizze) % MaxxSizee = x;ffrontt = (fronnt - 1 + MaxSSize) % MMaxSiize;ccountt+;rreturrn 1;retuurn 00;/Romaania_Tripp.cppp#inclludeRomaania_Tripp.h#incllude#incllude#inclludeusingg nameespacce sttd;Romannia_TTrip:Rommaniaa_Triip()b = new way1100;i = 0;en

48、d = 2;counnt = 0;MaxWWeighht = 100000;for (sizze_t i = 0; ii 220; ii+)vissiteddi = 0;void Romaania_Tripp:ReeSet()if(NNULL!=b)ddelettebb;b = new way220;i = 0;end = 2;counnt = 0;for (sizze_t i = 0; ii 220; ii+)vissiteddi = 0;Romannia_TTrip:Roomaniia_Trrip()if (NULLL != b)deeleteeb;void Romaania_Tripp:

49、Viisit(int v, intt u)bi.fatther = u;bi.me = v;i +;void Romaania_Tripp:Prrint(Grapph &graaph, way *b, intt end, int starrt)int Bwayy = 00;vecttor CityyNamee;striing nname = grraph.Vennd.ccitynname;CityyNamee.pussh_baack(nname);whille (11)forr (intt j = 0; ji; j+)iff (bj.me = ennd)nname = grraph.Vbj.f

50、athher.cityynamee;CCityNName.pushh_bacck(naame);BBway += ggraphh.edggebj.mebj.fathher;eend = bj.fathher;if (endd = starrt)breaak;coutt 0; i)couut CittyNammei ;coutt Buchharesst enddl;coutt 路徑長(zhǎng)度度為: BBway eendl 訪訪問(wèn)節(jié)點(diǎn)數(shù)數(shù)為: ccountt Leevel)retuurn;/大于于搜索層次次時(shí)不再深深入leveel+;visiitedv = 1;/訪問(wèn)該節(jié)節(jié)點(diǎn)counnt+;stacck

51、.SttackPPush(v, graaph);if (v = end | sstackk.GettWeigght() = MaxWWeighht)w = -1;if (v = end&staack.GGetWeeightt() = MaaxWeiight)coout sttack.GetWWeighht()MMaxWeeightt = sstackk.GettWeigght();*/coout 路徑徑長(zhǎng)度為: staack.GGetWeeightt() enndl 訪問(wèn)問(wèn)節(jié)點(diǎn)數(shù)為為: coount eendl搜索層層次:levvelendll;issOK = truue;elseew = g

52、raaph.GGetFiirstVVerteex(v);/取取當(dāng)前節(jié)點(diǎn)點(diǎn)的第一個(gè)個(gè)子節(jié)點(diǎn)whille (ww != -1)if (!viisiteedw)DeepthFFirsttSearrch(ggraphh, w, staack);/遞歸歸訪問(wèn)w = graaph.GGetNeextVeertexx(v, w);/取取當(dāng)前節(jié)點(diǎn)點(diǎn)的下一個(gè)個(gè)子節(jié)點(diǎn)visiitedv = 0;/返回時(shí)置置該節(jié)點(diǎn)為為未訪問(wèn)stacck.SttackPPop( grapph);/將將該節(jié)點(diǎn)彈彈出棧,并并根據(jù)grraph 中weiight 的值更改改當(dāng)前棧值值leveel-;/貪婪算算法void Romaania_T

53、ripp:Grreedyy_Alggoritthms(Grapph &graaph, int v)int u, ww;SeqCCQuenne quueue;/隊(duì)列列存儲(chǔ)圖節(jié)節(jié)點(diǎn)在圖中中的索引值值,優(yōu)先隊(duì)隊(duì)列,vaalue小小的在隊(duì)頭頭visiitedv = 1;if (v = end) reeturnn; queuue.QuueueOOrderrAppeend( v, graaph);/圖節(jié)節(jié)點(diǎn)按優(yōu)先先順序入隊(duì)隊(duì)列counnt+; /訪訪問(wèn)節(jié)點(diǎn)數(shù)數(shù)+1whille (qqueuee.QueeueNootEmppty()/寬寬度優(yōu)先,循循環(huán)queeue.QQueueeDeleete( &u);/

54、刪除除隊(duì)列頭元元素并返回回刪除的數(shù)數(shù)值/ccout u= u ;w = graaph.GGetFiirstVVerteex(u);whiile (w != -1)iff (!vvisittedww)VVisitt(w, u);/訪問(wèn)ww節(jié)點(diǎn),將將way b 的指指向更新iif (ww = end) /coout ww=ennd;counnt+; retuurn; qqueuee.QueeueOrrderAAppennd( ww, grraph); /圖節(jié)點(diǎn)按按優(yōu)先順序序入隊(duì)列ccountt+;w = grraph.GetNNextVVerteex(u, w);/A*算算法void Romaan

55、ia_Tripp:ASStar_Algoorithhms(GGraphh &graaph, int v)/i = 0; couunt = 0;int u, ww;SeqCCQuenne quueue;if (v = end) retturn;/到達(dá)達(dá)終點(diǎn)queuue.Quueue_A_OrrderAAppennd(v, graaph); counnt+;whille (qqueuee.QueeueNootEmppty()queeue.QQueueeDeleete( &u);if (u = ennd)coout 路徑徑長(zhǎng)度為: graaph.GGetVeerCosst(u) + ggraphh.

56、GettVerVValuee(u) eendl 訪問(wèn)問(wèn)節(jié)點(diǎn)數(shù)為為: coount eendl;reeturnn;w = graaph.GGetFiirstVVerteex( uu);whiile (w != -1)innt coost=ggraphh.GettVerCCost(u) + graaph.GGetEddge(ww,u);grraph.SetVVerCoost(ww, coost);/設(shè)置置當(dāng)前節(jié)點(diǎn)點(diǎn)移動(dòng)到目目標(biāo)節(jié)點(diǎn)的的預(yù)估費(fèi)用用quueue.Queuue_A_OrdeerApppend( w, grapph);/按按預(yù)估費(fèi)用用優(yōu)先入隊(duì)隊(duì)列 coount+;w = grraph.Ge

57、tNNextVVerteex(u, w);int RRomannia_TTrip:GettCounnt()retuurn ccountt;int RRomannia_TTrip:GettMaxWWeighht()retuurn MMaxWeeightt;int RRomannia_TTrip:GettEnd()retuurn eend;way *Romaania_Tripp:GeetB()retuurn bb;/Souurce.cpp/*On holiiday in RRomannia; currrentlly inn AraadFlighht leeavess tommorroow frrom BBuchaaresttFormuulatee goaal:Bee in BuchharesstFormuulatee prooblemmStatees: vvarioous ccitieesActioons: drivve beetweeen ciitiessFind soluutionnSequeence of ccitiees; ee.g. Aradd, Siibiu, Faggarass,Buchaarestt,*/#inclludeGrapph.h#inclludeQueuue.h#inclludeStacck.h#inclludeRomaania_Tripp.h#in

溫馨提示

  • 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)論