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:/