1秒登錄
一、問題
同文章 <分支限界法----旅行售貨員問題>
二、代碼實現
程序實現了 遞歸回溯 解決該問題
迭代回溯算法仍在考慮中...
/**************************************************************** *問 題:旅行售貨員 *算 法:回溯法 *描 述:解空間為 排列樹 ****************************************************************/ #include <stdio.h> #define N 4 //城市數目 #define NO_PATH -1 //沒有通路 #define MAX_WEIGHT 4000 int City_Graph[N+1][N+1]; //保存圖信息 int x[N+1]; //x[i]保存第i步遍歷的城市 int isIn[N+1]; //保存 城市i是否已經加入路徑 int bestw; //最優路徑總權值 int cw; //當前路徑總權值 int bestx[N+1]; //最優路徑 //----------------------------------------------------------------- void Travel_Backtrack(int t){ //遞歸法 int i,j; if(t>N){ //走完了,輸出結果 for(i=1;i<=N;i++) //輸出當前的路徑 printf("%d ",x[i]); printf("/n"); if(cw < bestw){ //判斷當前路徑是否是更優解 for (i=1;i<=N;i++){ bestx[i] = x[i]; } bestw = cw; } return; } else{ for(j=1;j<=N;j++){ //找到第t步能走的城市 if(City_Graph[x[t-1]][j] != NO_PATH && !isIn[j]){ //能到而且沒有加入到路徑中 isIn[j] = 1; x[t] = j; cw += City_Graph[x[t-1]][j]; Travel_Backtrack(t+1); isIn[j] = 0; x[t] = 0; cw -= City_Graph[x[t-1]][j]; } } } } void main(){ int i; City_Graph[1][1] = NO_PATH; City_Graph[1][2] = 30; City_Graph[1][3] = 6; City_Graph[1][4] = 4; City_Graph[2][1] = 30; City_Graph[2][2] = NO_PATH; City_Graph[2][3] = 5; City_Graph[2][4] = 10; City_Graph[3][1] = 6; City_Graph[3][2] = 5; City_Graph[3][3] = NO_PATH; City_Graph[3][4] = 20; City_Graph[4][1] = 4; City_Graph[4][2] = 10; City_Graph[4][3] = 20; City_Graph[4][4] = NO_PATH; //測試遞歸法 for (i=1;i<=N;i++){ x[i] = 0; //表示第i步還沒有解 bestx[i] = 0; //還沒有最優解 isIn[i] = 0; //表示第i個城市還沒有加入到路徑中 } x[1] = 1; //第一步 走城市1 isIn[1] = 1; //第一個城市 加入路徑 bestw = MAX_WEIGHT; cw = 0; Travel_Backtrack(2); //從第二步開始選擇城市 printf("最優值為%d/n",bestw); printf("最優解為:/n"); for(i=1;i<=N;i++){ printf("%d ",bestx[i]); } printf("/n"); }
本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。