版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
人工智能技術(shù)課程設(shè)計(jì)報(bào)告學(xué)號(hào):姓名:課程設(shè)計(jì)題目:貨郎擔(dān)(旅行商)問題:設(shè)有n個(gè)城市,城市之間均有道路,一個(gè)旅行商從某城市出發(fā),經(jīng)過其余n-1個(gè)城市一次且僅一次,最后回到出發(fā)的城市,他如何走才能使他所走的路程最短?用A*算法實(shí)現(xiàn),語言不限算法實(shí)現(xiàn): 本程序使用A*算法實(shí)現(xiàn) A*算法,作為啟發(fā)式算法中很重要的一種,被廣泛應(yīng)用在最優(yōu)路徑求解和一些策略設(shè)計(jì)的問題中。而A*算法最為核心的部分,就在于它的一個(gè)估值函數(shù)的設(shè)計(jì)上:f(n)=g(n)+h(n) 其中f(n)是每個(gè)可能試探點(diǎn)的估值,它有兩部分組成:一部分為g(n),它表示從起始搜索點(diǎn)到當(dāng)前點(diǎn)的代價(jià)(通常用某結(jié)點(diǎn)在搜索樹中的深度來表示)。另一部分,即h(n),它表示啟發(fā)式搜索中最為重要的一部分,即當(dāng)前結(jié)點(diǎn)到目標(biāo)結(jié)點(diǎn)的估值。一種具有f(n)=g(n)+h(n)策略的啟發(fā)式算法能成為A*算法的充分條件是:1)
搜索樹上存在著從起始點(diǎn)到終了點(diǎn)的最優(yōu)路徑。2)
問題域是有限的。 3) 所有結(jié)點(diǎn)的子結(jié)點(diǎn)的搜索代價(jià)值>0。 4) h(n)=<h*(n)(h*(n)為實(shí)際問題的代價(jià)值)。 在旅行商問題中 節(jié)點(diǎn)(A...XY)的代價(jià)=起始城市到X城的代價(jià)+X城到Y(jié)城的代價(jià)其中的代價(jià)可以是距離,費(fèi)用或者時(shí)間等 節(jié)點(diǎn)(A…XY)的啟發(fā)值=(城市總數(shù)-已訪問的城市數(shù)-1)*min{所有兩城之間的代價(jià)} 在程序中的實(shí)現(xiàn): p->gvalue=p_min->gvalue+relation[p_min->num-1][i]; p->hvalue=min*(number-p->level-1); p->fvalue=p->gvalue+p->hvalue;其中g(shù)value:g(n)hvalue:h(n)fvalue:f(n)p_min->gvalue:起始城市到X城的代價(jià)relation[p_min->num-1][i]:一個(gè)二維數(shù)組,X城到Y(jié)城的代價(jià)min:min{所有兩城之間的代價(jià)}number:城市總數(shù)p->level:城市節(jié)點(diǎn)所處于搜索樹的層次,和已訪問的城市數(shù)同值 在本程序中定義一個(gè)結(jié)構(gòu)體node用于表示城市節(jié)點(diǎn): structnode{ intnum; intfvalue;//f值 intgvalue;//g值 inthvalue;//h值 intlevel;//層 structnode*parent;//父節(jié)點(diǎn) structnode*next;//后繼 structnode*front;//前驅(qū)};定義一個(gè)結(jié)構(gòu)體final_path表示Open表和Bestpath表structfinal_path{ structnode*head; structnode*tail;}Open,Bestpath;其中Open表用于存放擴(kuò)展出來的節(jié)點(diǎn)Bestpath表用于在程序的末尾存放最佳路徑測(cè)試數(shù)據(jù)的輸入使用鄰接矩陣表示完全圖使用二維數(shù)組relation[100][100]存放程序流程:將path數(shù)組中元素值置下標(biāo)值:path[i]=i+1按要求輸入鄰接矩陣默認(rèn)從第一個(gè)點(diǎn)開始搜索,并將path[0]=-1,表示該點(diǎn)已被納入路徑擴(kuò)展剛剛被納入路徑的節(jié)點(diǎn),擴(kuò)展的方法為在path數(shù)組中搜索值不為-1的元素,為之創(chuàng)建節(jié)點(diǎn)寫入數(shù)據(jù)(包括g值,h值,f值,parent節(jié)點(diǎn))并納入Open表中在Open表中搜索f值最小的節(jié)點(diǎn)確定為當(dāng)前的最優(yōu)路徑點(diǎn)p_min,并且將上一次的最優(yōu)路徑點(diǎn)所在的路徑上所有節(jié)點(diǎn)的path表中的元素值改為其下標(biāo)值,表示刪除原路徑,同時(shí)將p_min所在的路徑上所有節(jié)點(diǎn)的path表中元素值改為-1,表示創(chuàng)建新路徑?;氐?步循環(huán),直至path表中所有的元素值均為-1退出循環(huán)由此獲得最后一次的最優(yōu)路徑點(diǎn),利用結(jié)構(gòu)體中的parent指針得到最佳路徑,并將路徑存放在Bestpath表中輸出最佳路徑程序退出。程序缺陷: 由于專注于算法的實(shí)現(xiàn),沒有設(shè)置輸入不合法的報(bào)錯(cuò)。 所以若要獲得正確的結(jié)果,在輸入路徑點(diǎn)個(gè)數(shù)和鄰接矩陣時(shí)要正確輸入程序截圖:(以5個(gè)路徑點(diǎn)為例) 測(cè)試用例: 提供四組測(cè)試用例(鄰接矩陣表示完全圖),路徑點(diǎn)個(gè)數(shù)分別是4,5,5,6 第一組:0213204114013110路徑如下:A-->C-->D-->B-->A第二組:0127510443240127410353230路徑如下:A-->B-->E-->C-->D-->A第三組:0534450354330544550344430路徑如下:A-->C-->B-->E-->D-->A第四組:011111101111110111111011111101111110路徑如下:A-->B-->C-->D-->E-->F-->A心得體會(huì): 在這次課程設(shè)計(jì)中,我第一次使用A*算法,遇到的問題還是不少的 旅行商問題在以前接觸過,當(dāng)時(shí)解決的時(shí)候使用的是另外一種算法。 A*算法中最讓我頭疼的地方就是h(n)的設(shè)計(jì),要滿足h(n)<h*(n),在最初,我使用了H(n)=max*(number-p->level-1),出來的結(jié)果并不一定是最優(yōu)路徑,后來我發(fā)現(xiàn)問題處在max上面,使用max使得算法變得很簡(jiǎn)單,但也不完善,使得搜索樹是一路往下走,沒有了回溯的可能性,我將max換成了min,這樣就可以滿足h(n)<h*(n),使之得到正確的結(jié)果。 在寫程序中,定義的Bestpath表本來目的是存放每次搜索出來的當(dāng)前最優(yōu)路徑點(diǎn),后來發(fā)現(xiàn)因?yàn)椴豢杀苊獬霈F(xiàn)算出的最優(yōu)路徑點(diǎn)與前一個(gè)路徑點(diǎn)不在同一分支上,造成回溯,所以放棄使用Bestpath實(shí)時(shí)存放最優(yōu)路徑點(diǎn),而是在結(jié)構(gòu)體node中增加了parent指針,利用該指針構(gòu)成鏈表存放路徑,并且在每次找到新節(jié)點(diǎn)的時(shí)候刪除原路徑,同時(shí)創(chuàng)建新路徑。最終只要得到最優(yōu)路徑即可。核心代碼:structnode{ intnum; intfvalue;//f值 intgvalue;//g值 inthvalue;//h值 intlevel;//層 structnode*parent;//父節(jié)點(diǎn) structnode*next;//后繼 structnode*front;//前驅(qū)};structfinal_path{ structnode*head; structnode*tail;}Open,Bestpath;voidmain(){ intrelation[100][100];//鄰接矩陣 intpath[100];//路徑點(diǎn)集合 inti,j,number;//number路徑點(diǎn)的數(shù)目 intmax=0; //存放最大值,用于計(jì)算h值 intmin;//存放最小值,用于計(jì)算h值 intcount;//用于計(jì)數(shù) cout<<"輸入路徑點(diǎn)的數(shù)目:"; cin>>number; for(i=0;i<number;i++) { path[i]=i+1;//用1,2,3,4.....來表示路徑點(diǎn) } for(i=0;i<number;i++) {//輸入鄰接矩陣 for(j=0;j<number;j++) { cin>>relation[i][j]; if(relation[i][j]>max)max=relation[i][j]; } } min=max;//初始化min,使其為所有路徑中的最大值 for(i=0;i<number;i++) { for(j=0;j<number;j++) { if(relation[i][j]==0)continue; else { if(min>relation[i][j]) min=relation[i][j]; } } }//設(shè)置min為所有路徑中的最小值 structnode*p0=newstructnode; p0->level=0; p0->num=1;//A點(diǎn) p0->parent=NULL; path[0]=-1;//默認(rèn)從第一個(gè)路徑點(diǎn)開始搜索 Open.head=newstructnode; Open.tail=newstructnode; Open.head->next=Open.tail; Open.tail->front=Open.head;//初始化Open表 structnode*p1,*p2; structnode*p_min; structnode*p_temp; p1=Open.head; p2=Open.tail; //p1,p2用于確定節(jié)點(diǎn)插入Open表的位置 for(i=1;i<number;i++)//對(duì)A節(jié)點(diǎn)進(jìn)行擴(kuò)展,建立搜索樹的第一層 {//插入節(jié)點(diǎn) structnode*p; p=newstructnode; p->num=path[i]; p->level=1;//第一層 p->gvalue=relation[0][i];//A點(diǎn)到其他點(diǎn)的距離 p->hvalue=min*(number-p->level-1); p->fvalue=p->gvalue+p->hvalue; p->parent=p0; p1->next=p; p->front=p1; p->next=p2; p2->front=p; p1=p; if(i==1)p_min=p1; else {//尋找最優(yōu)路徑點(diǎn) if(p_min->fvalue>p1->fvalue)p_min=p1; } } p_temp=p_min; //在Open中刪除找到的路徑點(diǎn),因?yàn)橄旅鎸⒁獙?duì)它進(jìn)行擴(kuò)展 p_min->front->next=p_min->next; p_min->next->front=p_min->front; path[p_min->num-1]=-1;//path中不為-1的個(gè)數(shù)為未到達(dá)路徑點(diǎn) //擴(kuò)展找到的路徑點(diǎn)(從第二層level=2開始進(jìn)入循環(huán)) while(1) { for(i=0,count=0;i<number;i++) { if(path[i]==-1) { count++; } } if(count==number)break;//path數(shù)組中所有元素均為-1,則退出 else { p1=Open.tail->front; p2=Open.tail; for(i=0;i<number;i++) { if(path[i]!=-1) { structnode*p; p=newstructnode; p->num=path[i]; p->level=p_min->level+1;//由最優(yōu)路徑點(diǎn)的level確定子節(jié)點(diǎn)的level p->gvalue=p_min->gvalue+relation[p_min->num-1][i]; p->hvalue=min*(number-p->level-1); p->fvalue=p->gvalue+p->hvalue; p->parent=p_min; p1->next=p; p->front=p1; p->next=p2; p2->front=p; p1=p; } } } structnode*p=Open.head->next; i=1; while(p!=Open.tail) {//從Open表中尋找 if(i==1)p_min=p; else {//尋找最優(yōu)路徑點(diǎn) if(p_min->fvalue>p->fvalue)p_min=p; } i++; p=p->next; }//找到最優(yōu)路徑點(diǎn) p=p_temp;//上一次的最優(yōu)路徑點(diǎn) while(p!=NULL) {//撤銷上一次路徑 path[p->num-1]=p->num; p=p->parent; } p=p_min;//新找到的最優(yōu)路徑點(diǎn) while(p!=NULL) {//重配置新路徑 path[p->num-1]=-1; p=p->parent; } p_temp=p_min;//再次使得p_temp指向最優(yōu)路徑點(diǎn),為下一次所用 //在Open中刪除找到的路徑點(diǎn) p_min->front->next=p_min->next; p_min->next->front=p_min->front; } //循環(huán)結(jié)束 //初始化Bestpath表 Bestpath.head=newstructnod
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件開發(fā)與服務(wù)協(xié)議書
- 砌筑勞務(wù)分包合作協(xié)議
- 幼兒園轉(zhuǎn)讓合同協(xié)議模板
- 鍋爐房工程招投標(biāo)實(shí)務(wù)
- 拆除建筑垃圾清運(yùn)項(xiàng)目合同
- 建筑行業(yè)分包勞務(wù)協(xié)議
- 稅務(wù)減免顧問合作協(xié)議
- 電力電纜供應(yīng)協(xié)議
- 模板工程分包協(xié)議范本
- 租賃合同續(xù)簽合同簽訂合同應(yīng)注意
- 蘇教版五年級(jí)數(shù)學(xué)上冊(cè)第三單元達(dá)標(biāo)測(cè)試卷含答案
- 積分上鏈方案
- JC-T 753-2001 硅質(zhì)玻璃原料化學(xué)分析方法
- 沈陽職業(yè)技術(shù)學(xué)院?jiǎn)握小堵殬I(yè)技能測(cè)試》參考試題庫(含答案)
- 高等數(shù)學(xué)課件第一章函數(shù)與極限
- 黃石市黃石港區(qū)2023-2024學(xué)年八年級(jí)上學(xué)期期末數(shù)學(xué)測(cè)評(píng)卷(含答案)
- 孤獨(dú)癥abc量表孤獨(dú)癥兒童行為量表ABC量表
- 國企紀(jì)檢監(jiān)察培訓(xùn)課件
- 宮腔鏡可行性報(bào)告
- 預(yù)付式消費(fèi)監(jiān)管服務(wù)平臺(tái)建設(shè)方案
- 2024年應(yīng)急管理部宣傳教育中心招考聘用筆試歷年難、易錯(cuò)考點(diǎn)試題后附答案帶解析
評(píng)論
0/150
提交評(píng)論