1. 程式人生 > >回溯法——旅行商(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)問題

問題描述 給定一個n頂點網路(有向或無向),找出一個包含n個頂點且具有最小耗費的換路。任何一個包含網路所有頂點的換路稱為一個旅行。旅行商問題(Traveling Salesman Problem,TSP)是要尋找一條耗費最少的旅行。

分支定界——行商(TSP)問題

問題描述 給定一個n頂點網路(有向或無向),找出一個包含n個頂點且具有最小耗費的換路。任何一個包含網路所有頂點的換路稱為一個旅行。旅行商問題(Traveling Salesman Problem,TSP)是要尋找一條耗費最少的旅行。

演算法課堂實驗報告(五)——python回溯與分支限界行商TSP問題)

python實現回溯法與分支限界 一、開發環境 開發工具:jupyter notebook 並使用vscode,cmd命令列工具協助程式設計測試演算法,並使用codeblocks輔助編寫C++程式 程式語言:python3.6 二、實驗目標 1. 請用回溯法求對稱的旅

數學建模常用Matlab/Lingo/c程式碼總結系列——行商TSP問題

Lingo程式碼: MODEL: SETS: CITY / 1.. 6/: U; ! U( I) = sequence no. of city; LINK( CITY, CITY): DIST, ! The distance matri

模擬退火算-行商問題-matlab實現

是否 -i ren isp close 交換 coo 準則 matrix 整理一下數學建模會用到的算法,供比賽時候參考食用。 —————————————————————————————————————————— 旅行商問題(TSP): 給定一系列城市和每對城市之間的距離,求

行商(TSP)及相關問題列表

1, 旅行商問題(Traveling Salesman Problem, TSP) 這個問題字面上的理解是:有一個推銷員,要到n個城市推銷商品,他要找出一個包含所有n個城市的具有最短路程的環路。 TSP的歷史很久,最早的描述是1759年尤拉研究的騎士周遊問題,即對於國際象棋棋

遺傳演算法 求解行商 TSP 問題,matlab程式碼

學習啟發式演算法時,旅行商問題是一個經典的例子。其中,遺傳演算法可以用來求解該問題。遺傳演算法是一種進化演算法,由於其啟發式演算法的屬性,並不能保證得到最優解。求解效果與初始種群選取,編碼方法,選擇方法,交叉變異規則有關。 上課時,老師不知從哪裡找了一個非常粗糙的程式,自己

TSP(Traveling Salesman Problem)-----淺談行商問題(動態規劃,回溯實現)

  1.什麼是TSP問題   一個售貨員必須訪問n個城市,這n個城市是一個完全圖,售貨員需要恰好訪問所有城市的一次,並且回到最終的城市。   城市於城市之間有一個旅行費用,售貨員希望旅行費用之和最少。   完全圖:完全圖是一個簡單的無向圖,其中每對不同的頂點之間都恰連有一條邊相連。      2.T

基於分支限界行商問題(TSP)一

//分支限界法 #include<iostream> #include<algorithm> #include<cstdio> #include<queue> const int INF = 100000; const int MAX_N = 22; usin

HDU 3001 Travelling:TSP行商

sta init using 多少 b- upd eof == als 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=3001 題意:   有n個城市,m條雙向道路,每條道路走一次需要花費路費v。你可以將任意一個城市作為起點出

【算學習】雙調歐幾裏得行商問題(動態規劃)(轉)

png .com 16px 我們 pan 子結構 最小 而且 復雜度 雙調歐幾裏得旅行商問題是一個經典動態規劃問題。《算法導論(第二版)》思考題15-1和北京大學OJ2677都出現了這個題目。 旅行商問題描述:平面上n個點,確定一條連接各點的最短閉合旅程。這個解的一般形式

[數學建模(三)]遺傳算行商問題

size log 數學建模 col randperm pre 個數 blog sum clc,clear sj=load(‘data3.txt‘) %加載敵方100 個目標的數據 x=sj(:,1); y=sj(:,2); d1=[70,40]; sj0=[d1

迷茫的行商:一個無處不在的計算機算問題

jpg tao 技術 分享 com tps .com bsp 說明 掃碼時備註或說明中留下郵箱付款後如未回復請至https://shop135452397.taobao.com/聯系店主迷茫的旅行商:一個無處不在的計算機算法問題

行商問題(Traveling Salesman Problem,TSP)的+Leapms線性規劃模型及c++呼叫

知識點 旅行商問題的線性規劃模型旅行商問題的+Leapms模型及CPLEX求解C++呼叫+Leapms 旅行商問題 旅行商問題是一個重要的NP-難問題。一個旅行商人目前在城市1,他必須對其餘n-1個城市訪問且僅訪問一次而後回到城市1,請規 劃其最短的迴圈路線。 旅行商問題的建模 設城市i,j之間的距

行商問題TSP】【狀態壓縮dp】【記憶化dp】

【題意】 給定一個n個頂點組成的帶權的有向圖的距離矩陣d[i,j],要求從0開始結果所有點一次回到0,問所經過邊的總權重的最小值為多少 【思路】 旅行商問題TSP,狀態壓縮dp,記憶化dp 【分析】 假設當前已經訪問過的頂點集合為S,(起點0當作還未訪問過的點),當

行商問題(TSP,Traveling Salesman Problem)

題意:給定一個n個頂點組成的帶權有向圖的距離矩陣d(I,j)(INF表示沒有邊)。要求從頂點0出發,經過每個頂點恰好一次後再次回到頂點0.問所經過的邊的總權重的最小值是多少? 假設現在已經訪問過的頂點的集合(起點0當作還未訪問過的頂點)為S,當前所在的頂點為v,用dp[S]

遺傳演算法解決TSP行商問題(附:Python實現)

前言 我先囉嗦一下:不是很喜歡寫計算智慧的演算法,因為一個演算法就要寫好久。前前後後將近有兩天的時間。 好啦,現在進入正題。 巡迴旅行商問題(TSP)是一個組合優化方面的問題,已經成為測試組合優化新演算法的標準問題。應用遺傳演算法解決 TSP 問題,首先對訪問

TSP 行商

THUOJ 資料結構(上)TSP 旅行商 點選檢視題目:TSP旅行商 實現思路 建立鄰接表 每讀入一條邊u->v,將其插入u中(後面將實現的tspNode中的邊,是以其為出發點的邊),並將v的入度+1 拓撲排序過程中計算最長道路經過的村莊數 演算法:零入度拓撲排序,p16

2-opt求解TSP行商)問題的python實現

2-opt其實是2-optimization的縮寫,簡言之就是兩元素優化。也可以稱作2-exchange 。(摘自百度百科) 這個一種隨機性演算法,基本思想就是隨機取兩個元素進行優化,一直到無法優化為止。在小規模TSP問題上,2-opt無論從效率還是效果上都優於

圖論演算法(4) --- TSP行商問題 求最短迴路(acm)

對於TSP旅行商問題,我們做的最多的也就是求最短迴路了,那麼對於一個數據量適中的圖來說,一般的dfs方法即可求解,在這裡,我應用dfs的思想來實現此問題,而關鍵之處在於對矩陣的改進,這樣的操作可以使得應用搜索思想求TSP問題時,效率有顯著的提高。對於矩陣的改進,我們對矩陣的