TSP問題(旅行商問題)[分支限界法]


問題:

  旅行商從 a 開始周游下圖所有的城市一次,然后回到 a,城市之間的旅行代價在圖中標明。

  請選擇一個最優的行走順序使得周游所有城市的代價最小。

      

思路:

  隨便怎么周游,對於一個城市來說,一定有一條進的路和一條出的路。

  對於每個城市來說,暫時都選取代價最小的兩條路來作為理想的路線,就算這些路不合理。

  比如對於 a 來說,選擇 a<->c(1) & a<->b(3) ;對於 e 來說,選擇 e<->c(2) & e<->d(3)。

  把所有的這些值加起來除以2,

  本題即 lb=[(a<->c+a<->b)+(b<->a+b<->c)+(c<->a+c<->e)+(d<->e+d<->c)+(e<->c+e<->d)]/2=[(1+3)+(3+6)+(1+2)+(3+4)+(2+3)]/2=14 .

   把這個值當成是理想的最小代價,然后接下來搜索解空間樹的時候,都在該基礎上進行。

  下面畫出搜索解空間樹的過程,其中方框上面的是點的名稱,下面是假設的理想周游代價,方框頭頂是搜索順序:

  剛開始從 a 走

  

  從 a 可以到達 b、c、d、e,

  

  這里有一個小細節,就是圖中的 2 節點。想想如果周游路線 a<->b<->d<->e<->a 和 a<->e<->d<-><->c<->b<->a ,這兩條路線其實是一樣的,但是如果不加處理的話,可能兩條路線會在搜索的時候都被搜索過,這樣浪費了時間。因此,我們這里做個小約定,約定 b 要在 c 之前出現。因此,圖中節點 2 就被拋棄了。

  繼續上面的,從 a 走到那些點后,怎么計算理想代價呢,也就是說怎么計算 lb 呢。

  我們用 a 到 d 來舉例子吧。

  最開始 lb 是選取每個點的代價最小的兩條路, lb=[(a<->c+a<->b)+(b<->a+b<->c)+(c<->a+c<->e)+(d<->e+d<->c)+(e<->c+e<->d)]/2。a 走的是c 和 b 這兩個,d 走的是e 和 c 。

  現在我們選擇 a<->d ,那 d 的一條路要被改成 a 了。我們選擇將原來的 a<->b 改成 a<->d,因為要使代價最小,所以選擇代價大的來替換。那么 d<->c 就被替換成 d<->a了。這時再計算就可以得到新的 lb 了。  

  我們應該選擇 lb 最小的往下搜索,較大的等下再搜索。於是

  

  繼續向下

  

  這時已經找出兩個周游路程了(因為最后肯定要回到 a 就沒向下畫了),我們繼續搜索,看看有沒再好點的解。向上退一層,就是 節點 6 了,所以

  

  繼續搜索,發現節點 7 才走到 e 就要 19,而 節點 11 走完了只需要 16,所以把它拋棄,繼續退回,發現 3,4 都不行

  

  得到了最優解。

  

代碼:

   代碼我不會寫,哈哈哈哈哈哈哈哈哈。。。。

 

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM