旅行商問題 | 回溯:N排列(最小剪枝)

旅行推銷員問題TSP):給定一系列城市和每對城市之間的距離,求解訪問每一座城市一次並回到起始城市的最短迴路。

它是組合優化中的一個NP難問題~


 一、思路

       回溯算法就是梳理好、有順序、合理地進行全遍歷。很明顯,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]  //換回來哦
}

 

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