日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

回溯法——旅行商(TSP)问题

發布時間:2023/12/16 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 回溯法——旅行商(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)问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。