求解思路:
動態規劃的方法的最大難點就在於初始變數的確定,選擇合適的初始變數才能更好的運用動態規劃的方式解決問題。我在這裡定義的變數就是d(i,s),設s出發點,其中i是乙個點,而s是點的集合,這個變數的意思就是從i出發,經過s中的所有點一次且僅一次且回到出發點s的最小距離。當s為空時,就表示i到起始點s的權值。
所以有如下的動態規劃方程:
d(i,s)=min(j屬於s)
d(i,s)=cis(i!=s且s=null)
cij表示weight(i,j)
這裡實現我用的是遞迴的思想,那個每次從集合中去除點的操作,我用了乙個vector,然後從最後的點開始迴圈,每次把要去除的點和最後的點交換下,在pop掉,遞迴呼叫後再把之前的用push_back加上,這樣也不會影響前面的點的順序。
所以通過上面的方程我們就能求得最小tsp圈的權值了。
然後是路徑的求取:
在這裡設定乙個二維陣列m[i][s],s表示乙個集合,這個表示從i到集合s中選取的最優點,這也就是路徑上的一點。為了表示集合的獨特性,可以用集合中的點3次方之和來表示,也可以用2的幾次方之和等等,只要保證不重複即可。
Python求解tsp問題(動態規劃,簡單易懂)
解題思路主要有兩部分 第一部分 i為當前節點 城市 s為還沒有遍歷的節點 城市集合 第二部分,回溯,找到最優的路徑,需要將s集合一一對應乙個數字 類似於編碼,一般用二進位制 不如 tsp問題 class solution def init self,x,start node self.x x 距離矩...
動態規劃法求解TSP問題 C
此文章借鑑於博文在此基礎上重新進行了分析總結。1 怎麼求頂點子集,即這些怎麼記錄?答 例如4個頂點,依次為 十進位制數0 1 2 3 4 5 6 7的二進位制分別為000 001 010 011 100 101 110 111。上述集合中的元素即為二進位制中的位數,例如集合,可用二進位制110 十進...
關於tsp問題的動態規劃求解的matlab實現
筆者另外加一句話哈,如果有筆者表述不清或寫不清楚的地方,歡迎讀者來聯絡和討論,大家一起進步。這篇文章的 是筆者自己用動態規劃的思想用matlab實現的,裡面的用到了矩陣運算和matlab內建函式的使用,相比c寫起來 少了很多,數學好的看起來應該更加簡單易懂。但是是根據一位大牛的文章寫的,這裡附上他文...