TSP(Traveling Salesman Problem)-----浅谈旅行商问题(动态规划,回溯实现)
1.什么是TSP問題
一個售貨員必須訪問n個城市,這n個城市是一個完全圖,售貨員需要恰好訪問所有城市的一次,并且回到最終的城市。
城市于城市之間有一個旅行費(fèi)用,售貨員希望旅行費(fèi)用之和最少。
完全圖:完全圖是一個簡單的無向圖,其中每對不同的頂點(diǎn)之間都恰連有一條邊相連。
2.TSP問題前提
回朔法:把所有的解列出來,形成一棵樹,利用剪枝深度優(yōu)先進(jìn)行遍歷,遍歷的過程記錄和尋找最優(yōu)解。(剪枝就是把一條再深搜下去也不是最優(yōu)解的分支剪去)。
動態(tài)規(guī)劃:把一個大問題拆分成小問題,把小問題的最優(yōu)結(jié)果通過表保留,在新問題需要用到的時候可以直接獲取。
PS:下面的圖,文字中出現(xiàn)1,2,3,4分別表示城市1,城市2,城市3,城市4
3.回朔法實(shí)現(xiàn)TSP問題
上面提到回朔法就是把所有的解列出來,形成一棵樹,上面的例子形成的樹如下:我們假設(shè)城市1為起點(diǎn)
上面介紹回溯法就是把所有解列出來,然后剪枝深搜。那么我們需要解決的就是剪枝深搜了。剪枝深搜中最麻煩的就是找到何時剪枝的條件了。
首先我們假設(shè)不知道剪枝條件,先模擬深搜跑一遍。
從1深搜到4回到1,花費(fèi)11,記錄這個數(shù)值。接下來回溯,繼續(xù)深搜。一步一步深搜的時候,遇到了一個特殊的時候:
還記得我們之前記錄的最短花費(fèi)為11嗎,1->2->4->3 花費(fèi)已經(jīng)11了,3回到1,還需要進(jìn)行花費(fèi),不管花費(fèi)多少,反正已經(jīng)比我之前找出來的要大了,那這個時候我再深搜下去就沒什么意義了,所以可以進(jìn)行剪枝。我不繼續(xù)找了,直接回溯。
所以剪枝條件出來了: 走下一步的距離 + 之前已經(jīng)走過的距離的總和 >之前算出的最短路徑 。
4.動態(tài)規(guī)劃實(shí)現(xiàn)TSP
上面介紹了動態(tài)規(guī)劃就是把大問題分解成小問題。我們現(xiàn)在的大問題是從1 經(jīng)過2,3,4 回到1花費(fèi)最少,那么我們把他分解一下。
我們從1出發(fā)有三種方案
1、 從1出發(fā),到2,然后再從2出發(fā),經(jīng)過[3,4]這幾個城市,然后回到1,使得花費(fèi)最少。
2、 從1出發(fā),到3,然后再從3出發(fā),經(jīng)過[2,4]這幾個城市,然后回到1,使得花費(fèi)最少。
3、 從1出發(fā),到4,然后再從4出發(fā),經(jīng)過[2,3]這幾個城市,然后回到1,使得花費(fèi)最少。
上面也提到了最優(yōu)結(jié)果通過表來保留:設(shè)置一個二維的動態(tài)規(guī)劃表dp ,dp[1]{2,3,4}表示從1號城市出發(fā),經(jīng)過2,3,4 回到1花費(fèi)最少。
要求上面三個方案的最小值意味:(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是已知的,那么我們現(xiàn)在的目的就是求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
那么經(jīng)過慢慢的分解,我們知道了我們已知了從4到1的最小花費(fèi),那么就可以推出從3出發(fā)經(jīng)過4回到1的花費(fèi)。。。。。。。從而推出我們所要求的最優(yōu)解。
5.時間復(fù)雜度分析
回溯法:
動態(tài)規(guī)劃法:
總結(jié)
以上是生活随笔為你收集整理的TSP(Traveling Salesman Problem)-----浅谈旅行商问题(动态规划,回溯实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数学--数论--HDU 2104 丢手绢
- 下一篇: CSS字体样式属性