一、問題
同文章 <分支限界法----旅行售貨員問題>
二、代碼實現
程式實現了 遞迴回溯 解決該問題
迭代回溯演算法仍在考慮中...
/****************************************************************<br /> *問 題:旅行售貨員<br /> *算 法:回溯法<br /> *描 述:解空間為 排列樹<br /> ****************************************************************/<br />#include <stdio.h><br />#define N 4 //城市數目<br />#define NO_PATH -1 //沒有通路<br />#define MAX_WEIGHT 4000<br />int City_Graph[N+1][N+1]; //儲存圖資訊<br />int x[N+1]; //x[i]儲存第i步遍曆的城市<br />int isIn[N+1]; //儲存 城市i是否已經加入路徑<br />int bestw; //最優路徑總權值<br />int cw; //當前路徑總權值<br />int bestx[N+1]; //最優路徑<br />//-----------------------------------------------------------------<br />void Travel_Backtrack(int t){ //遞迴法<br />int i,j;<br />if(t>N){ //走完了,輸出結果<br />for(i=1;i<=N;i++) //輸出當前的路徑<br />printf("%d ",x[i]);<br />printf("/n");<br />if(cw < bestw){ //判斷當前路徑是否是更優解<br />for (i=1;i<=N;i++){<br />bestx[i] = x[i];<br />}<br />bestw = cw;<br />}<br />return;<br />}<br />else{<br />for(j=1;j<=N;j++){ //找到第t步能走的城市<br />if(City_Graph[x[t-1]][j] != NO_PATH && !isIn[j]){ //能到而且沒有加入到路徑中<br />isIn[j] = 1;<br />x[t] = j;<br />cw += City_Graph[x[t-1]][j];<br />Travel_Backtrack(t+1);<br />isIn[j] = 0;<br />x[t] = 0;<br />cw -= City_Graph[x[t-1]][j];<br />}<br />}<br />}<br />}<br />void main(){<br />int i;<br />City_Graph[1][1] = NO_PATH;<br />City_Graph[1][2] = 30;<br />City_Graph[1][3] = 6;<br />City_Graph[1][4] = 4;</p><p>City_Graph[2][1] = 30;<br />City_Graph[2][2] = NO_PATH;<br />City_Graph[2][3] = 5;<br />City_Graph[2][4] = 10;<br />City_Graph[3][1] = 6;<br />City_Graph[3][2] = 5;<br />City_Graph[3][3] = NO_PATH;<br />City_Graph[3][4] = 20;</p><p>City_Graph[4][1] = 4;<br />City_Graph[4][2] = 10;<br />City_Graph[4][3] = 20;<br />City_Graph[4][4] = NO_PATH;<br />//測試遞迴法<br />for (i=1;i<=N;i++){<br />x[i] = 0; //表示第i步還沒有解<br />bestx[i] = 0; //還沒有最優解<br />isIn[i] = 0; //表示第i個城市還沒有加入到路徑中<br />}</p><p>x[1] = 1; //第一步 走城市1<br />isIn[1] = 1; //第一個城市 加入路徑<br />bestw = MAX_WEIGHT;<br />cw = 0;<br />Travel_Backtrack(2); //從第二步開始選擇城市<br />printf("最優值為%d/n",bestw);<br />printf("最優解為:/n");<br />for(i=1;i<=N;i++){<br />printf("%d ",bestx[i]);<br />}<br />printf("/n");<br />}