1. 程式人生 > >TSP問題,動態規劃法

TSP問題,動態規劃法

    TSP問題是指旅行家要旅行n個城市,要求各個城市經歷且僅經歷一次然後回到出發城市,並要求所走的路程最短。各個城市間的距離可以用代價矩陣來表示。

    假設從頂點i出發,令d(i, V')表示從頂點i出發經過V'中各個頂點一次且僅一次,最後回到出發點i的最短路徑長度,開始時,V'=V-{i},於是,TSP問題的動態規劃函式為:

d(i,V')=min{cik+d(k,V-{k})}(k∈V')

d(k,{})=cki(k≠i)

    虛擬碼:

for (i=1; i<n; i++)     //初始化第0列
	d[i][0]=c[i][0]; 
 for (j=1; j<2n-1-1; j++)  
 	for (i=1; i<n; i++)   //依次進行第i次迭代
		if (子集V[j]中不包含i) 
 			對V[j]中的每個元素k,計算[i][j]=min(c[i][k]+d[k][j-1]);
對V[2n-1-1]中的每一個元素k,計算d[0][2n-1-1]=min(c[0][k]+d[k][2n-1-2]);
輸出最短路徑長度d[0][2n-1-1];

    筆者在寫此程式時卡在瞭如何判斷:子集V[j]中不包含i。解決方法是對n個頂點分別用0~n-1的數字編號,按個數為1,2,……,n-1的順序生成1~n-1個元素的子集存放在陣列V[2^n-1]中。這樣,在判斷時就可以將當前點與陣列編號按位與運算(如下圖所示),為0則為需要進行計算(這時才能品味按位與運算的美)。


    完整程式碼:

#include<iostream.h>
#include<math.h>
int main()
{
	int i,j,k,min,brief,n;
	int D[20][20];
	cout<<"頂點個數:";
	cin>>n;
	int b=(int)pow(2,n-1);
  	for(i=0;i<n;i++)
    	for(j=0;j<n;j++)
      		cin>>D[i][j];
  	int ** Route = (int **)calloc(n, sizeof(int *));
  	int ** Mat = (int **)calloc(n, sizeof(int *));
  	for(i=0;i<n;i++)
  	{
    	Route[i] = (int *)calloc(b*b, sizeof(int))+i*b;
    	Mat[i] = (int *)calloc(b*b, sizeof(int))+i*b;
  	}
  	for(i=0;i<b;i++)
   		for(j=0;j<n;j++)
	    {
			Route[j][i] = -1;
   			Mat[j][i] = -1;
	    }
  	for(i=0;i<n;i++)//初始化第0列 
    	Route[i][0] = D[i][0];    
  	for(i=1;i<b-1;i++)
	    for(j=1;j<n;j++)//依次進行第i次迭代 
			if( ((int)pow(2,j-1) & i) == 0)//子集V[j不包含i 
			{
				min=999;
				for(k=1;k<n;k++)
				if( (int)pow(2,k-1) & i )
				{
					brief = D[j][k] + Route[k][i-(int)pow(2,k-1)]; 
					if(brief < min)
					{
						min = brief;
						Route[j][i] = min;
						Mat[j][i] = k;//區域性最優決策
					}
				}    
			}
	min=999;
  	for(k=1;k<n;k++)
	{
		brief = D[0][k] + Route[k][b-1 - (int)pow(2,k-1)];
		if(brief < min)
		{
			min = brief;
			Route[0][b-1] = min;//最優解
			Mat[0][b-1] = k;
		}
	}
	cout<<"最短路徑長度:"<<Route[0][b-1]<<endl;//最短路徑長度
	cout<<"最短路徑:"<<"1";
	for(i=b-1,j=0; i>0; )
	{
		j = Mat[j][i];
		i = i - (int)pow(2,j-1);
		cout<<"->"<<j+1;
	}
	cout<<"->1"<<endl;
	for(i=0;i<n;i++)
	{
		for(j=0;j<b;j++)
  			cout<<Route[i][j]<<" ";
		cout<<endl;
	}
	free(Route);
	free(Mat);
	return 0;
}

相關推薦

TSP問題動態規劃法

    TSP問題是指旅行家要旅行n個城市,要求各個城市經歷且僅經歷一次然後回到出發城市,並要求所走的路程最短。各個城市間的距離可以用代價矩陣來表示。    假設從頂點i出發,令d(i, V')表示從頂點i出發經過V'中各個頂點一次且僅一次,最後回到出發點i的最短路徑長度,開

資料結構與演算法- 五大常用演算法總結(分治法回溯法分治限界法貪心演算法動態規劃法

1.分治法(Recurrence and Divide-Conquer)        對於一個規模為n的問題,若該問題可以容易解決(比如說規模n較小)則直接解決,否則將其分解為k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞迴地解決這些子問

分治法動態規劃法貪心法回溯法分支限界法的區別和聯絡以及適用情況

    筆者這學期的《演算法設計與分析》課程已經進入尾聲,在這裡對學過的演算法進行總結歸納。筆者先對各個演算法的思想進行簡單的陳述,然後再進行對比。一、演算法思想    (一)分治法(divide and conquer method)    是將待求解的原問題劃分成k個較小

動態規劃法解決TSP問題(C++)

/*旅行商問題(Traveling Saleman Problem,TSP)又譯為旅行推銷員問題、貨郎擔問題,簡稱為TSP問題,是最基本的路線問題,該問題是在尋求單一旅行者由起點出發,通過所有給定的需

jsp頁面中動態調用系統時間的實現

簡單 char ext fonts get har interval sso 星期 在做WEB項目時,經常會須要 在頁面中顯示當前時間,以下介紹一個簡單的調用系統時間的方法,效果如圖: 在頁面中插入以下代碼即可了 <div id="time"&

mybatis使用註解替代xml配置動態生成Sql

key list 數據 很難 pro ring 參考 rec 不知道 mybatis使用註解替代xml配置時,遇到判斷條件是否為null或者為空時,@Select很難搞定,不知道怎麽辦? mybatis3中增加了使用註解來配置Mapper的新特性,使用 SelectPro

動態SQL是什麽??什麽是靜態SQL動態SQL的動態體現在哪裏???

等於 我們 dad var print 動態生成 sca user pan 首先,所謂SQL的動態和靜態,是指SQL語句在何時被編譯和執行,二者都是用在SQL嵌入式編程中的,這裏所說的嵌入式是指將SQL語句嵌入在高級語言中,而不是針對於單片機的那種嵌入式編程。在某種高級語

【sql技巧】mysql修改時動態指定要修改的字段 update `table` set (case when ....) = 1 where id = xx

幫助 ase stack pan 希望 需求 記錄 開始 lec 如果你點進了這篇帖子,那麽你一定遇到了跟我一樣的問題。別看題目的set case when...,我一開始也是第一反應是用case when但是發現並不好使。 問題呢,說得高大上一點:動態指定要修改的字段。

POJ 3268 Bookshelf 2 動態規劃法題解

contains using std enc onos book filled with cor Description Farmer John recently bought another bookshelf for the cow library, but t

CMD命令動態執行存儲或DML命令

cmd word logs sina -- mil col art sql --exec master..xp_cmdshell CMD命令 --EXECUTE sys.sp_sqlexec 執行存儲 --EXEC sp_executesql 執行DML語句 C

malloc,colloc,realloc內存分配動態靜態庫的生成與調用

lac 輸出 初始化 clu 技術 pragma num idt return ?? 1.在main方法裏面直接定義一個很大的數組的時候。可能會出現棧溢出:錯誤代碼演示: #include<stdio.h> #include<stdlib.h&g

微信小程序之分享動態添加分享數據

tle images nsh 動態 fail spa tro blog ppm 1、效果: 2、.js代碼: page({ /** * 用戶點擊分享按鈕或右上角分享 */ onShareAppMessage: function (res)

vue小荔枝時間控件動態按月份增減。

input lang fun today 3.0 .get lan substr ocl 依賴框架有jq,bootstrap3.0,vue2.0; 自封裝(搬運)時間控件,bootstrap-datetimepicker。資源下載:看這裏 需求: 默認本地時間,相隔一

log4j範例動態切換日誌位置

參考 () apache lin extends 切換 位置 bsp string 詳解參考:http://www.cnblogs.com/ITEagle/archive/2010/04/23/1718365.html Logger.getRootLogger().

web應用路徑問題(相對路徑絕對路徑動態獲取路徑)

body des 轉發器 端口號 .get redirect style https 不容易 1、相對路徑和絕對路徑 絕對路徑:以 “ / ” 開頭的路徑,是完整的路徑。 相對路徑:不以 “ / ” 開頭的路徑,是相對於當前web資源目錄的路徑。 在絕對路徑中, “ / ”

超多經典 canvas 實例動態離子背景、移動炫彩小球、貪吃蛇、坦克大戰、是男人就下100層、心形文字等等等

ntb contex lin 如果 maxwidth sel 容器 操作 reat 超多經典 canvas 實例 普及:<canvas> 元素用於在網頁上繪制圖形。這是一個圖形容器,您可以控制其每一像素,必須使用腳本來繪制圖形。 註意:IE 8 以及更早的版本不

【設計模式】代理模式:靜態代理動態代理spring aop

spring 實現接口 找到 master 代碼 -s result java 統一 代理模式分為靜態代理和動態代理。我們拿鏈家來舉例子,我們本人是真實的對象,有真實的業務需求:需要去找房子;鏈家是中介,是代理類,他來幫我執行找房子的這個操作。 靜態代理:   1.實現一個

java mybatis學習之$和#區別mapper代理接口動態SQL在日誌中輸出mybatis的sql語句

except 控制臺 處理方式 ron target 技術分享 需要 prefix job 1.在mybatis中,$和#的區別: #{}:表示一個預處理參數,參數類型不定,是根據傳入的參數類型來設定的。類似於JDBC中的? 特例使用,模糊查詢:(針對oracle): an

【java】java反射機制動態獲取對象的屬性和對應的參數值並屬性按照字典序排序Field.setAccessible()方法的說明【可用於微信支付 簽名生成】

modifier 直接 this 字段值 1-1 讓我 toupper ima play 方法1:通過get()方法獲取屬性值 package com.sxd.test.controller; public class FirstCa{ private

最大子矩陣最大連續子數組進階動態規劃初級poj1050

ostream 子數組 images 使用 運行時間 規劃 out 思考 turn 題目描述:現給出一個N*N矩陣,要求求出擁有最大和的子矩陣的和。 例如: 這樣的一個矩陣,最大子矩陣的和為15; 此題可以讓人聯想到求最大連續子數組,求最大子數組在上一篇文章中http:/