TSP問(wèn)題的解決方案_第1頁(yè)
TSP問(wèn)題的解決方案_第2頁(yè)
已閱讀5頁(yè),還剩17頁(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)介

頁(yè)腳內(nèi)容頁(yè)腳內(nèi)容《算法設(shè)計(jì)與分析》實(shí)驗(yàn)報(bào)告一學(xué)號(hào):日期:20161230一、實(shí)驗(yàn)內(nèi)容:?jiǎn)栴}二、所用算法的根本思想及復(fù)雜度分析:1、蠻力法根本思想

姓名:得分:借助矩陣把問(wèn)題轉(zhuǎn)換為矩陣中點(diǎn)的求解。首先構(gòu)造距離矩陣,任意節(jié)點(diǎn)k造各行允許數(shù)組row[n]={1,1…1,各列允許數(shù)組1表示允許訪問(wèn),即該節(jié)點(diǎn)未被訪問(wèn);0表示不允許訪問(wèn),即該節(jié)點(diǎn)已經(jīng)被訪問(wèn)。假若改行或該列不允許訪問(wèn),跳過(guò)該點(diǎn)訪問(wèn)下一節(jié)點(diǎn)。程序再發(fā)問(wèn)最后一個(gè)節(jié)點(diǎn)前,所訪問(wèn)的k=0,即實(shí)現(xiàn)訪問(wèn)源節(jié)點(diǎn),得出一條簡(jiǎn)單回路。復(fù)雜度分析根本語(yǔ)句是訪問(wèn)下一個(gè)行列中最小的點(diǎn),主要操作是求平方,假設(shè)有n。2、動(dòng)態(tài)規(guī)劃法根本思想sd(i,V’)表示從頂點(diǎn)i動(dòng)身經(jīng)過(guò)V’(是一個(gè)點(diǎn)的集合)中各個(gè)頂s的最短路徑長(zhǎng)度。推導(dǎo):(分情況來(lái)辯論)①V’d(i,V’)is了,如上圖的城市3->0(0為起點(diǎn)城市)d(i,V’)=Cis(就是城市i到城市s的距離)、②假若V’不為空,那么就是對(duì)子問(wèn)題的最優(yōu)求解。你必需在V’這個(gè)城市集合中,嘗試每一個(gè),并求出最優(yōu)解。d(i,V’)=min{Cik+d(k,V’-{k})}注:Cik表示你選擇的城市和城市i的距離,d(k,V’-{k})是一個(gè)子問(wèn)題。綜上所述,TSP問(wèn)題的動(dòng)態(tài)規(guī)劃方程就出來(lái)了:復(fù)雜度分析p問(wèn)題,把原來(lái)時(shí)間復(fù)雜性()排列轉(zhuǎn)化為組合問(wèn)題,從而降低了時(shí)間復(fù)雜度,但仍需要指數(shù)時(shí)間。3、回溯法根本思想(根結(jié)點(diǎn))動(dòng)身,以要求的解或解空間中已無(wú)活結(jié)點(diǎn)時(shí)為止。0,頁(yè)腳內(nèi)容頁(yè)腳內(nèi)容點(diǎn)的所有子樹(shù)都已嘗試過(guò)并且發(fā)生沖突,則回溯到當(dāng)前結(jié)點(diǎn)的父節(jié)mpx[n]表示哈密頓回路經(jīng)過(guò)的頂點(diǎn)。復(fù)雜度分析在哈密頓回路的可能解中,考慮到約束條件則可能解應(yīng)該是(1,2,…,n)的一n!個(gè)葉子結(jié)點(diǎn),每個(gè)葉子結(jié)點(diǎn)代(。4、分支限界法根本思想(最大效益優(yōu)勢(shì)的方式搜索問(wèn)值是優(yōu)先隊(duì)列的優(yōu)先級(jí)。minout記錄。minout作算法初始化。復(fù)雜度分析(限界函數(shù)b2倍,加上第二部分離著路徑首尾節(jié)點(diǎn)最近的距離相加(不在已知路徑上的,加上第三部分除了路徑上節(jié)點(diǎn),矩陣中兩個(gè)最短2便是每個(gè)節(jié)(智力特定指出。三、源程序及注釋:1、蠻力法intmain(){inti,j,s=0;int**a;printf("輸入節(jié)點(diǎn)個(gè)數(shù):\n");scanf("%d",&n);\n",n);colable[0]=0;for(i=1;i<n;i++){colable[i]=1;}row=(int*)malloc((sizeof(int))*n);for(i=0;i<n;i++){row[i]=1;}a=(int**)malloc((sizeof(int*))*n);for(i=0;i<n;i++){a[i]=(int*)malloc((sizeof(int*))*n);}for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j])'}}i=0;while(row[i]==1){j=min(a[i]);row[i]=0;printf("訪問(wèn)路徑:\n");s=s+a[i][j];i=j;}printf("最短總距離為:%d\n",s);}intmin(int*a){intj=0,m=a[0],k=0;{j++;m=a[j];}//求最短距離{if(colable[j]==1&&row[j]==1)//節(jié)點(diǎn)沒(méi)有被訪問(wèn){if(m>=a[j]){始終保持最短距離k=j;}}}returnk;}2、動(dòng)態(tài)規(guī)劃法intintinit(){inti;intj;intt;if(scanf("%d",&n)==EOF)return-1;for(i=0;i<n;i++){for(j=0;j<n;j++){if(i==j)continue;scanf("%d",&g[i][j]);}}memset(con,-1,sizeof(con));for(i=0;i<n;i++){bit[i]=1<<i;}t=1;for(i=1;i<n;i++){con[t<<(i-1)][i]=g[0][i];}return1;}intgetcon(ints,intk){intt,tt;inti;intmin=INF;if(con[s][k]!=-1)returncon[s][k];t=s&(~bit[k-1]);for(i=1;i<n;i++){tt=t&bit[i-1];if(tt>0){if(getcon(t,i)+g[i][k]<min){min=getcon(t,i)+g[i][k];}}}con[s][k]=min;returncon[s][k];}回溯法voidbacktrack(inti){if(i>n){if(graph[road[n]][1]!=INF&&(ans+graph[road[n]][1])<bestans){bestans=ans+graph[road[n]][1];for(intj=1;j<=n;j++)bestroad[j]=road[j];}}else{for(intj=1;j<=n;j++){if(graph[road[i-1]][j]!=INF&&ans+graph[road[i-1]][j]<bestans&&!vis[j]){road[i]=j;ans+=graph[road[i-1]][j];vis[j]=1;backtrack(i+1);//改回輔助的全局變量ans-=graph[road[i-1]][j];vis[j]=0;}}}}intmain(){memset(graph,INF,sizeof(graph));cin>>n>>m;for(inti=1;i<=m;i++){inta,b;cin>>a>>b;cin>>graph[a][b];graph[b][a]=graph[a][b];}vis[1]=1;road[1]=1;//1開(kāi)頭backtrack(2);cout<<bestans<<endl;for(inti=1;i<=n;i++)cout<<bestroad[i]<<"";cout<<1<<endl;}分支限界法voidin(){scanf("%d",&n);for(inti=1;i<=n;i++){for(intj=1;j<=n;j++){if(i==j){mp[i][j]=INF;continue;}scanf("%d",&mp[i][j]);}}}structnode{intvisp[22];//標(biāo)記哪些點(diǎn)走了intst;//起點(diǎn)intst_p;//起點(diǎn)的鄰接點(diǎn)inted;//終點(diǎn)inted_p;//終點(diǎn)的鄰接點(diǎn)intk;//走過(guò)的點(diǎn)數(shù)intsumv;//經(jīng)過(guò)路徑的距離intlb;//目標(biāo)函數(shù)的值booloperator<(constnode&p)const{returnlb>p.lb;}};priority_queue<node>q;intlow,up;intinq[22];//確定上界intdfs(intu,intk,intl){if(k==n)returnl+mp[u][1];intminlen=INF,p;for(inti=1;i<=n;i++){if(inq[i]==0&&minlen>mp[u][i])/*取與所有點(diǎn)的連邊中最小的邊*/{minlen=mp[u][i];p=i;}}inq[p]=1;returndfs(p,k+1,l+minlen);}intget_lb(nodep){intret=p.sumv*2;//路徑上的點(diǎn)的距離intmin1=INF,min2=INF;//起點(diǎn)和終點(diǎn)連出來(lái)的邊f(xié)or(inti=1;i<=n;i++){if(p.visp[i]==0&&min1>mp[i][p.st]){min1=mp[i][p.st];}}ret+=min1;for(inti=1;i<=n;i++){if(p.visp[i]==0&&min2>mp[p.ed][i]){min2=mp[p.ed][i];}}ret+=min2;for(inti=1;i<=n;i++){if(p.visp[i]==0){min1=min2=INF;for(intj=1;j<=n;j++){if(min1>mp[i][j])min1=mp[i][j];}for(intj=1;j<=n;j++){if(min2>mp[j][i])min2=mp[j][i];}ret+=min1+min2;}}returnret%2==0?(ret/2):(ret/2+1);}voidget_up(){inq[1]=1;up=dfs(1,1,0);}voidget_low(){low=0;for(inti=1;i<=n;i++){/*經(jīng)過(guò)排序求兩個(gè)最小值*/intmin1=INF,min2=INF;inttmpA[22];for(intj=1;j<=n;j++){tmpA[j]=mp[i][j];}sort(tmpA+1,tmpA+1+n);//對(duì)臨時(shí)的數(shù)組進(jìn)行排序low+=tmpA[1];}}intsolve(){/*貪心法確定上界*/get_up();/*取每行最小的邊之和作為下界*/get_low();/*設(shè)置初始點(diǎn),1開(kāi)頭*/nodestar;star.st=1;star.ed=1;star.k=1;for(inti=1;i<=n;i++)star.visp[i]=0;star.visp[1]=1;star.sumv=0;star.lb=low;/*ret為問(wèn)題的解*/intret=INF;q.push(star);while(!q.empty()){nodetmp=q.top();q.pop();if(tmp.k==n-1){/*找最后一個(gè)沒(méi)有走的點(diǎn)*/intp;for(inti=1;i<=n;i++){if(tmp.visp[i]==0){p=i;break;}}intans=tmp.sumv+mp[p][tmp.st]+mp[tmp.ed][p];nodejudge=q.top();/*假若當(dāng)前的路徑和比所有的目標(biāo)函數(shù)值都小則跳出*/if(ans<=judge.lb){ret=min(ans,ret);break;}/*否則繼續(xù)求其他可能的路徑和,并更新上界*/else{up=min(up,ans);ret=min(ret,ans);continue;}}/*當(dāng)前點(diǎn)能夠向下擴(kuò)展的點(diǎn)入優(yōu)先級(jí)隊(duì)列*/nodenext;for(inti=1;i<=n;i++){if(tmp.visp[i]==0){next.st=tmp.st;/*更新路徑和*/next.sumv=tmp.sumv+mp[tmp.ed][i];/*更新最后一個(gè)點(diǎn)*/next.ed=i;/*更新頂點(diǎn)數(shù)*/next.k=tmp.k+1;/*更新經(jīng)過(guò)的頂點(diǎn)*/for(intj=1;j<=n;

溫馨提示

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