1. 程式人生 > >動態規劃——旅行推銷員問題

動態規劃——旅行推銷員問題

一,問題描述:

TSP問題(Travelling Salesman Problem)即旅行商問題,又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市。路徑的選擇目標是要求得的路徑路程為所有路徑之中的最小值。

二、思考

這道題是一個圖論題,把每一個城市化為一個頂點,兩個頂點間的權重表示城市之間的距離,但是同兩個頂點之間不同方向的權重可以不同,我們要求的就是距離最短的哈密頓迴路。

如果我們考慮每一種迴路,一個頂點到另一個頂點都是可達的,那麼可能的總數有(n-1)!種,甚至要劣於指數複雜度。

若存在一箇中間點,屬於最優情況,那麼從頭到這個中間點,從中間點到最後都要求是最優情況,則適用於最優性原理。

本題適用於最優性原理

將有向圖轉化為鄰接矩陣,

V表示所有頂點的集合。

A表示V的一個子集。

W[i][j]表示從vi到vj的直接距離。

D[vi][A]表示從vi到v1經過A中的所有頂點且僅經過一次的最短路徑。

則有D[vi][A]=min{W[i][j]+D[vj][A-{vj}]}(vj∈A)

解釋:從頂點vi經過A中所有頂點到達v1的最短距離等於從vi到vj的距離加從頂點vj經過A中所有頂點到達v1的最短距離的最小值(其中vj從A中取)

三、實現

void travel(int n,const number W[][],index P[][],number& minlenth) 
{
	index i,j,k;
	number D[n][V-{v1}];
	for(i=2;i<=n;i++)
	D[i][空集]=W[i][1];//從頂點vi到v1的直接距離 
	for(k=1;k<=n-2;k++)//遍歷A的每個子集  
		for(包含k個頂點的所有子集A屬於V-{vi}) //從小到大遍歷 
			for(滿足i!=1且vi不在v中的i)//算出任意點出發到v1結束的最短距離 
			{
				D[i][A]=min{W[i][j]+D[j][A-{vj}};//vj∈A 
				P[i][A]=給出最小值的j值; 
		 	} 
	D[1][V-{vi}]=min{W[i][j]+D[j][A-{v1,vj}};	//2<=j<=n   從v1出發到v1結束的最短距離 
	P[1][V-{vi}]=給出最小值的j值 ;	
	minlengt=D[1][V-{vi}];
}
時間複雜度:T(n)=Θ((n^2)*(2^n))

記憶體複雜度:M(n)=Θ(n*(2^n))

目前還沒有人找到一種演算法時間複雜度優於指數複雜度,但也沒有人證明這種演算法不存在。