人工智能技術(shù)課程設(shè)計(jì)報(bào)告_第1頁
人工智能技術(shù)課程設(shè)計(jì)報(bào)告_第2頁
人工智能技術(shù)課程設(shè)計(jì)報(bào)告_第3頁
人工智能技術(shù)課程設(shè)計(jì)報(bào)告_第4頁
人工智能技術(shù)課程設(shè)計(jì)報(bào)告_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論