1.什么是TSP問題
一個售貨員必須訪問n個城市,這n個城市是一個完全圖,售貨員需要恰好訪問所有城市的一次,並且回到最終的城市。
城市於城市之間有一個旅行費用,售貨員希望旅行費用之和最少。
完全圖:完全圖是一個簡單的無向圖,其中每對不同的頂點之間都恰連有一條邊相連。
2.TSP問題前提
回朔法:把所有的解列出來,形成一棵樹,利用剪枝深度優先進行遍歷,遍歷的過程記錄和尋找最優解。(剪枝就是把一條再深搜下去也不是最優解的分支剪去)。
動態規划:把一個大問題拆分成小問題,把小問題的最優結果通過表保留,在新問題需要用到的時候可以直接獲取。
PS:下面的圖,文字中出現1,2,3,4分別表示城市1,城市2,城市3,城市4
3.回朔法實現TSP問題
上面提到回朔法就是把所有的解列出來,形成一棵樹,上面的例子形成的樹如下:我們假設城市1為起點
上面介紹回溯法就是把所有解列出來,然后剪枝深搜。那么我們需要解決的就是剪枝深搜了。剪枝深搜中最麻煩的就是找到何時剪枝的條件了。
首先我們假設不知道剪枝條件,先模擬深搜跑一遍。
從1深搜到4回到1,花費11,記錄這個數值。接下來回溯,繼續深搜。一步一步深搜的時候,遇到了一個特殊的時候:
還記得我們之前記錄的最短花費為11嗎,1->2->4->3 花費已經11了,3回到1,還需要進行花費,不管花費多少,反正已經比我之前找出來的要大了,那這個時候我再深搜下去就沒什么意義了,所以可以進行剪枝。我不繼續找了,直接回溯。
所以剪枝條件出來了: 走下一步的距離 + 之前已經走過的距離的總和 >之前算出的最短路徑 。
4.動態規划實現TSP
上面介紹了動態規划就是把大問題分解成小問題。我們現在的大問題是從1 經過2,3,4 回到1花費最少,那么我們把他分解一下。
我們從1出發有三種方案
1、 從1出發,到2,然后再從2出發,經過[3,4]這幾個城市,然后回到1,使得花費最少。
2、 從1出發,到3,然后再從3出發,經過[2,4]這幾個城市,然后回到1,使得花費最少。
3、 從1出發,到4,然后再從4出發,經過[2,3]這幾個城市,然后回到1,使得花費最少。
上面也提到了最優結果通過表來保留:設置一個二維的動態規划表dp , dp[1]{2,3,4}表示從1號城市出發,經過2,3,4 回到1花費最少。
要求上面三個方案的最小值意味:(D12表示1到2的距離,其他同理)
dp[1] [{2,3,4}] = min{ D12+dp[2]{3,4} ,D13+dp[3]{2,4} , D14+dp[4]{2,3}}
由於D12,D13,D14是已知的,那么我們現在的目的就是求dp[2]{3,4},dp[3]{2,4},dp[4]{2,3},
照貓畫虎,我們可以列出:(這里只列出dp[2]{3,4} ,其他兩個類似)
dp[2]{3,4} = min{ D23+dp[3]{4} ,D24+dp[4][3}}
dp[3]{4}]= D43+dp[4]{}
dp[4]{}=D41
那么經過慢慢的分解,我們知道了我們已知了從4到1的最小花費,那么就可以推出從3出發經過4回到1的花費。。。。。。。從而推出我們所要求的最優解。
5.時間復雜度分析
回溯法:
動態規划法: