動態規劃法求解TSP問題 C

2021-10-05 10:55:53 字數 3521 閱讀 2023

此文章借鑑於博文在此基礎上重新進行了分析總結。

1、怎麼求頂點子集,即這些怎麼記錄?

答:例如4個頂點,依次為{},,,,,,,。十進位制數0、1、2、3、4、5、6、7的二進位制分別為000、001、010、011、100、101、110、111。上述集合中的元素即為二進位制中的位數,例如集合,可用二進位制110(十進位制6)代替,因為二進位制110的第一位是0,第二位第三位是1。

整理一下思路——十進位制數的二進位制表示中,哪位為1則集合中就有哪個數。十進位制6的二進位制110中,第二三位是1,則6代表集合

沒有為什麼,這是我們定下的一條規則,方便我們解題。

如此,過程矩陣d[i][j]的縱座標j就多了乙個含義。j=0,代表集合;j=1,代表集合……j=5,代表集合……以此類推。

大家可能發現乙個問題,在4個頂點中,十進位制3代表,十進位制4代表,而我們一般寫的集合順序是{},,,,,,,。集合是第3個,是第4個。會發現順序亂了,這個要說一下,集合之間的排序不影響此題的解答,讀者朋友可以將集合以任意順序寫,會發現不影響最終結果的出現。

2、判斷乙個頂點是否位於子集中

舉例解答,如要判斷集合j=是否有頂點3。

集合j=表示成二進位制串為1110101,其中集合裡面有的數對應的位數寫成1,沒有的寫成0。要在集合中找頂點3,就是要判斷二進位制串第3位是不是1,就把1110101右移(3-1)位,得到11101,然後結果和00001進行&運算,如果結果是1說明第3位是1,則說明頂點在子集中。

故判斷公式為

(j>>(i-1))&1==1

3、填寫過程矩陣過程arc[i][j]為圖的代價矩陣。

d[i][j]為過程矩陣,存放迭代結果。

以d[2][5]為例,d[2][5]=d(2,)。d[2][5] 表示從2出發,通過{1,3},最後回到起點。那麼d[2][5] = min),arc[2][3] + d(3,)} = min。從2出發,要去,先考慮去1的路。去了1後集合中只剩下 ,對應二進位制100,十進位制4,所以要求的d表就是d[1][4],這個4可以通過(101)^(1)得到,而(1) = 1<

d[i][j] = min

#include

#include

using

namespace std;

struct rode rode[

100]

[100];

//記錄過程矩陣中的路線,由點x出發,先經過點k,再經過集合z,過程矩陣j[i][j]中的j就代表集合

intmain()

//初始化第0列

for(i =

0; i < n; i++

) d[i][0

]= arc[i][0

];//填過程矩陣,第一行,因為第一行代表從頂點0開始經過一些頂點再回到0,但是我們只需要d[0][m-1]這乙個值,所以第一行先不計算,等最後再只計算d[0][m-1],節省時間。

for(j =

1; j < m; j++

)//j就代表m個子集,如j=5(二進位制為101)代表,j=3(二進位制為011)代表。二進位制1011就代表集合。這是設定的一種規則。

中有元素2。之所以這麼做,

是因為我們人知道j=6(二進位制110)代表集合,但是計算機不知道,所以要有找元素這一步*/if(

((j >>

(k -1)

)&1)

==0)//集合中沒有此元素就跳過

continue

;/*以d[2][5]為例,d[2][5]=d(2,)。d[2][5] 表示從2出發,通過{1,3},最後回到起點。

那麼d[2][5] = min),arc[2][3] + d(3,)} = min。

從2出發,要去,先考慮去1的路。去了1後集合中只剩下 ,對應二進位制100,十進位制4,所以要求的d表就是d[1][4],這個4可以通過(101)^(1)得到,而(1) = 1<

再看去3的路,去了3後集合中只剩下,對應二進位制001,十進位制1,所以要求的d表就是d[3][1],1通過(101) ^ (100)得到,而(100) = 1<

if(d[i]

[j]> arc[i]

[k]+ d[k]

[j ^(1

<<

(k -1)

)])}

}}//計算d[0][m-1],d(0,)=min),arc[0][2]+d(2,),arc[2][3]+d(3,)}

for(j =

0; j < m -

1; j++

) d[0]

[j]=-1

; d[0]

[m -1]

=0x7ffff

;for

(k =

1; k < n; k++)}

cout <<

"最短路徑為:"

<< d[0]

[m-1

]<< endl;

//輸出路線

j = m -1;

cout <<

"0→"

;for

(i=0

;i1;i++

) cout<< rode[i]

[j].y << endl;

//輸出過程矩陣

cout <<

"過程矩陣為:"

TSP問題,動態規劃法

tsp問題是指旅行家要旅行n個城市,要求各個城市經歷且僅經歷一次然後回到出發城市,並要求所走的路程最短。各個城市間的距離可以用代價矩陣來表示。假設從頂點i出發,令d i,v 表示從頂點i出發經過v 中各個頂點一次且僅一次,最後回到出發點i的最短路徑長度,開始時,v v 於是,tsp問題的動態規劃函式...

TSP問題(利用動態規劃法)

tsp問題是指旅行家要旅行n個城市,要求各個城市經歷且僅經歷一次然後回到出發城市,並要求所走的路線圖最短。無窮3 675無窮 2364 無窮267 5無窮待補充 define crt secure no warnings include include using namespace std str...

動態規劃法求解RMQ

題目描述 思路分析 下面把sparse table演算法分成預處理和查詢兩部分來說明 以求最小值為例 預處理 預處理使用dp的思想,f i,j 表示 i,i 2 j 1 區間中的最小值,我們可以開闢乙個陣列專門來儲存f i,j 的值。例如,f 0,0 表示 0,0 之間的最小值,就是num 0 f ...