旅行推銷員問題(TSP):給定一系列城市和每對城市之間的距離,求解訪問每一座城市一次並回到起始城市的最短迴路。
一、思路
回溯算法就是梳理好、有順序、合理地進行全遍歷。很明顯,TSP 經過不同城市各一次,選擇每個城市的經過順序對於迴路的總路程是有影響的。所以 TSP 問題的解空間是全體排列,那麼我們需要遍歷所有點的排列情況。
對於需要遍歷 n 個點的排序情況,我們需要選擇 n - 1 次,爲此我們可以建立一棵很形象的 排列決策樹:在樹的第 i 層即是對第 i
個位置的選擇,其應該有 (n - i + 1) 種選擇範圍。比如下面是對數字 123 的所有排列遍歷的決策樹:
二、僞代碼實現
假設初始所有的數字無序地存儲在 x 數組中。決策樹中第 i 層即是對第 i 位的選擇,在遍歷到第 i 層時, 1~ i - 1 位的數字已經確定(存在 x 數組中),故我們第 i 層的選取只能在 x[ i ] ~ x[n] 中。
這裏其實帶了最小問題的剪枝操作:只有當前的值小於已經記錄的最小情況時,我們才繼續下一層搜索。
backtrack(int t) { //搜索樹的第t層:確定第 t 位的選擇
if(t > n) {
//遍歷的終點
return;
}
for i = t : n
change x[i] and x[t] //選則第 i個數爲 第 t 位
if 滿足限制條件和界限條件
backtrack(t + 1) //繼續選擇下一位
change x[i] and x[t] //換回來哦
}