TSP問題

1. 蠻力法:

基本思想:

找出所有可能的旅行路線,即依次考查圖中所有頂點的全排列,從中選擇路徑長度最短的哈密頓迴路(也稱簡單迴路).

時間複雜性: Ω(n!)

2.  動態規劃法:

僞代碼:

輸入: 圖的代價矩陣arc[n][n]
輸出: 從頂點0出發經過所有頂點一次且一次再回到頂點0的最短路徑長度

1. 初始化第0列:
   for(i=1; i<n; i++)
       d[i][0]=arc[i][0];
2. 依次處理每一個子集數組V[2^(n-1)]
   for(i=1; i<n; i++)
       if(子集V[j]中不包含i)
        對V[j]中的每個元素k,計算d[i][j]=min{arc[i][k]+d[k][j-1]};
3. 輸出最短路徑長度d[0][2^(n-1)-1].

時間複雜性: Ω(2^n)

3. 貪心法:

3.1: 最近鄰點策略求解TSP

僞代碼:

輸入: 無向帶權圖G=(V,E),頂點w
輸出: 迴路長度TSPLength

1. 初始化,P={};TSPLength=0;
2. u=w;V=V-{w};
3. 循環直到集合P中包含n-1條邊
   3.1 查找與頂點u鄰接的最小代價邊{u,v},並且v屬於集合V;
   3.2 P=P+{(u,v)];V=V-{v};TSPLength=TSPLength+Cuv;
   3.3 輸出經過的路徑u->v,u=v,轉步驟3繼續求解;
4. 輸出TSPLength+Cuv.

時間性能:O(n*2)

3.2 : 最短鏈接策略求解TSP問題

僞代碼:

輸入: 無向帶權圖G=(V,E),頂點w
輸出: 迴路長度TSPLength

1. 初始化: P={};TSPLength=0;
2. E`=E;
3. 循環直到集合P中包含n-1條邊
   3.1 在E`中選取最短邊{u,v};
   3.2 E`=E`-{(u,v)};
   3.3 如果(頂點u和v在P中不連通&&不產生分歧)
       則P=P+{(u,v)};TSPLength=TSPLength+Cuv;
4. 輸出TSPLength.

時間性能: O(n*log2n)       n倍log以2爲底n的對數

4. 分支界限法:

僞代碼: 

輸入: 圖G=(V,E)
輸出: 最短哈密頓迴路

1. 根據限界函數計算目標函數的下界down;採用貪心法得到上屆up;
2. 計算根結點的目標函數值並加入待處理的結點表PT;
3. 循環直到某個葉子節點的目標函數值在表PT中取得最小值
   3.1 i=表PT中具有最小值的結點;
   3.2 對結點i的每個孩子節點x執行下列操作:
       3.2.1 估算結點x的目標函數值lb;
       3.2.2 若(lb<=up),則將結點x加入表PT中,否則丟失該節點;
4. 將葉子節點對應的最優值輸出,回溯求得最優解的各個分量.

5. 近似算法:

僞代碼:

輸入: 無向帶權圖G=(V,E)
輸出: 近似最短迴路

1. 在圖中任選一個頂點v;
2. 採用Prim算法生成以頂點v爲根節點的最小生成樹T;
3. 對生成樹T從頂點v出發進行深度優先遍歷,得到遍歷序列L;
4. 根據L得到圖G的哈密頓迴路.

時間複雜性: O(n^2)

 


未完待續...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章