回溯法——旅行商(TSP)问题
生活随笔
收集整理的這篇文章主要介紹了
回溯法——旅行商(TSP)问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題描述
給定一個n頂點網絡(有向或無向),找出一個包含n個頂點且具有最小耗費的換路。任何一個包含網絡所有頂點的換路稱為一個旅行。旅行商問題(Traveling Salesman Problem,TSP)是要尋找一條耗費最少的旅行。
圖1 四頂點網絡
如圖1是一個四頂點無向網絡。這個網絡的一些旅行:1,2,4,3,1;1,3,2,4,1和1,4,3,2,1。旅行1,2,4,3,1的耗費為66,;旅行1,3,2,4,1的耗費為25;旅行1,4,3,2,1的耗費為55.故1,3,2,4,1是網絡中耗費最少的旅行。
算法設計分析
旅行是包含所有頂點的一個循環,所以可以把任意頂點作為起點也是終點,我們選擇頂點1作為起點和終點。于是可以用[1,x2…,xn,1]表示一個旅行,那么x2到xn的所有排列構成n頂點旅行商問題的解空間。
圖2 四頂點網絡的解空間樹
城市之間的旅行耗費存儲在二維數組cost[n][n] 中, bestCostSoFar 表示當前最優旅行,
C++實現
#include<iostream> using namespace std; #define N 5//全局變量 int n = N - 1; int cost[N][N]; //cost[1:4][1:4] 表示城市之間的旅行耗費,不存在路徑則耗費等于-1 int bestTour[N]; //bestTour[1:4] 記錄最佳路徑 int currentTour[N]; //currentTour[1:4] 記錄當前路徑 int bestCostSoFar = -1; //當前最低耗費 int currentCost = 0; //當前耗費void rTSP(int currentLevel) {//回溯遞歸函數if (currentLevel == n){//當前為葉結點的父節點if (cost[currentTour[n - 1]][n] != -1 && cost[currentTour[n]][1] != -1 &&(bestCostSoFar == -1 || currentCost + cost[currentTour[n - 1]][n] +cost[currentTour[n]][1] < bestCostSoFar)){//發現最優的旅行bestCostSoFar = currentCost + cost[currentTour[n - 1]][n] +cost[currentTour[n]][1];copy(currentTour + 1, currentTour + n + 1, bestTour + 1);}}else{//搜索子樹for (int j = currentLevel; j <= n; ++j)if (cost[currentTour[currentLevel - 1]][currentTour[j]] != -1 &&(bestCostSoFar == -1 || currentCost +cost[currentTour[currentLevel - 1]][currentTour[j]] < bestCostSoFar)){//子樹currentTour[j]可行swap(currentTour[currentLevel], currentTour[j]);currentCost += cost[currentTour[currentLevel - 1]][currentTour[currentLevel]];rTSP(currentLevel + 1);currentCost -= cost[currentTour[currentLevel - 1]][currentTour[currentLevel]];swap(currentTour[currentLevel], currentTour[j]);}} }void init() {cost[1][1] = -1;cost[1][2] = 30;cost[1][3] = 6;cost[1][4] = 4;cost[2][1] = 30;cost[2][2] = -1;cost[2][3] = 5;cost[2][4] = 10;cost[3][1] = 6;cost[3][2] = 5;cost[3][3] = -1;cost[3][4] = 20;cost[4][1] = 4;cost[4][2] = 10;cost[4][3] = 20;cost[4][4] = -1; } void main() {init();int i;for (i = 1; i <= n; i++)currentTour[i] = i;rTSP(2); //起點定為1,從第二層開始 cout << "最少的運費為:" << bestCostSoFar << endl;cout << "最佳路徑為: ";for (i = 1; i <= n; i++){cout << bestTour[i] << "->";}cout << bestTour[1] << endl; }測試結果:
最少的運費為:25 最佳路徑為: 1->3->2->4->1 請按任意鍵繼續. . .總結
以上是生活随笔為你收集整理的回溯法——旅行商(TSP)问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kevgir靶机渗透——弱口令爆破
- 下一篇: winxp专业版下安装sql2000企业