分支限界法 旅行售貨員問題

2022-03-16 07:50:00 字數 1501 閱讀 7456

一、問題描述

某售貨員要到若干城市去推銷商品,已知各城市之間的路程(或旅費)。他要選定一條從駐地出發,經過每個城市一次,最後回到駐地的路線,使總的路程(或總旅費)最小。

如下圖:1,2,3,4 四個城市及其路線費用圖,任意兩個城市之間不一定都有路可達。

二、問題理解

1.分支限界法利用的是廣度優先搜尋和最優值策略。

2.利用二維陣列儲存圖資訊city_graph[max_size][max_size]

其中city_graph[i][j]的值代表的是城市i與城市j之間的路徑費用

一旦乙個城市沒有通向另外城市的路,則不可能有迴路,不用再找下去了

3. 我們任意選擇乙個城市,作為出發點。(因為最後都是乙個迴路,無所謂從哪出發)

下面是關鍵思路:

想象一下,我們就是旅行員,假定從城市1出發,根據廣度優先搜尋的思路,我們要把從城市1能到達的下乙個城市,都要作為一種路徑走一下試試。

可是程式裡面怎麼實現這種「試試」呢?

利用一種

資料結構

,儲存我們每走一步後,當前的一些狀態引數,如,我們已經走過的城市數目(這樣就知道,我們有沒有走完,比如上圖,當我們走了四個城市之後,無論從第四個城市是否能回到起點城市,都就意味著我們走完了,只是這條路徑合不合約束以及能不能得到最優解的問題)。這裡把,這種資料結構成為結點。這就需要另乙個資料結構,儲存我們每次試出來的路徑,這就是堆。

資料結構定義如下:

a.我們剛開始的時候不知道最總能得到的路徑是什麼,所以我們,就認為按照城市編號的次序走一遍。於是有了第乙個結點0,放入堆             中。 相當於來到了城市1(可以是所有城市中的任意乙個,這裡姑且設為圖中城市1)。

b.從城市1,出發,發現有三條路可走,分別走一下,這樣就產生了三個結點,都放入堆中。

結點1 資料為:x[1 2 3 4],深度為s=1(深度為0表示在城市1還沒有開始走),這說明,結點1是從城市1走來,走過了1個城                                      市,當前停在城市2,後面的城市3 和城市4都還沒有走,但是具體是不是就按照3.4的順序走,這個不一定。

結點2 資料為:x[1 3 2 4],深度為s=1,表示,從城市1走來,走過了1個城市,當前停在了城市3,後面2.4城市還沒走

結點3 資料為:x[1 4 3 2],深度為s=1,表示,從城市1走來,走過了1個城市,當前停在了城市4,後面3.2城市還沒有走

c. 從堆中取乙個結點,看看這個結點是不是走完了的,也就是要看看它的深度是不是3,是的話,說明走完了,看看是不是能回到起                點,如果可以而且費用少於先前得到最優的費用,就把當前的解作為最優解。

如果沒有走完,就繼續把這條路走下去。

以上就是簡單的想法,而實際的程式中,堆還需要提供對結點的優先權排序的支援。而當前結點在往下乙個城市走時,也是需要約束和限界函式,這些書上講的很清楚,不懂,就翻翻書。

有點要提出來說說的就是結點優先權和限界函式時都用到了乙個最小出邊和,就相當於把所有城市最便宜的一條路(邊)費用加起來的值。

下面是**

分支限界法 旅行售貨員問題

1 n int 4 2 max weight int 4000 3 no path int 1 4 city graph int 0 n 1 for in range n 1 初始化dp 5 x int 0 n 1 for in range n 1 儲存第i步便利的城市 6 isin int 0 n...

分支與限界 旅行售貨員問題

問題描述 演算法設計 演算法分析 應用舉例 實驗結果 類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出t中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一...

旅行售貨員問題 回溯法

某售貨員要到若干城市去推銷商品,已知各城市之間的路程,他要選定一條從駐地出發,經過每個城市一遍,最後回到住地的路線,使總的路程最短。結果為 1 3 2 4 1 回溯法,序列樹,假設起點為 1。演算法開始時 x 1,2,3,n x 1 n 有兩重含義 x 1 i 代表前 i 步按順序走過的城市,x i...