1. 程式人生 > >TSP(Traveling Salesman Problem)-----淺談旅行商問題(動態規劃,回溯實現)

TSP(Traveling Salesman Problem)-----淺談旅行商問題(動態規劃,回溯實現)

  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.時間複雜度分析

  回溯法:

  動態規劃法: