問題:
旅行商從 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 都不行
得到了最優解。
代碼:
代碼我不會寫,哈哈哈哈哈哈哈哈哈。。。。