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

2021-09-24 15:00:22 字數 2161 閱讀 2129

問題描述

演算法設計

演算法分析

應用舉例

實驗結果

**類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出t中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意義下的最優解。

分支限界法的一般過程:

由於求解目標不同,導致分支限界法與回溯法在解空間樹t上的搜尋方式也不相同。回溯法以深度優先的方式搜尋解空間樹t,而分支限界法則以廣度優先或以最小耗費優先的方式搜尋解空間樹t。

分支限界法的搜尋策略是:在擴充套件結點處,先生成其所有的兒子結點(分支),然後再從當前的活結點表中選擇下乙個擴充套件對點。為了有效地選擇下一擴充套件結點,以加速搜尋的程序,在每一活結點處,計算乙個函式值(限界),並根據這些已計算出的函式值,從當前活結點表中選擇乙個最有利的結點作為擴充套件結點,使搜尋朝著解空間樹上有最優解的分支推進,以便盡快地找出乙個最優解。

分支限界法常以廣度優先或以最小耗費(最大效益)優先的方式搜尋問題的解空間樹。問題的解空間樹是表示問題解空間的一棵有序樹,常見的有子集樹和排列樹。在搜尋問題的解空間樹時,分支限界法與回溯法對當前擴充套件結點所使用的擴充套件方式不同。在分支限界法中,每乙個活結點只有一次機會成為擴充套件結點。活結點一旦成為擴充套件結點,就一次性產生其所有兒子結點。在這些兒子結點中,那些導致不可行解或導致非最優解的兒子結點被捨棄,其餘兒子結點被子加入活結點表中。此後,從活結點表中取下一結點成為當前擴充套件結點,並重複上述結點擴充套件過程。這個過程一直持續到找到所求的解或活結點表為空時為止。

旅行家要旅行n個城市,已知各城市之間的路程。要求選定一條從駐地出發經過每個城市一次,最後回到駐地的路線,使總的路程最小。例如:從如圖中的無向帶權圖g=(v,e)中的1號點出發,經過圖中的每個點,並且不能重複,然後回到1號點,要求經過的路徑長度是最短的(即求圖中 路徑 )。

旅行售貨員問題的解空間可以組織成一棵樹,從樹的根結點到任一葉結點的路徑定義了圖的一條周遊路線。旅行售貨員問題要在圖g中找出費用最小的周遊路線。路線是乙個帶權圖。圖中各邊的費用(權)為正數。圖的一條周遊路線是包括v中的每個頂點在內的一條迴路。周遊路線的費用是這條路線上所有邊的費用之和,樹的深度為n(即節點數的大小)。

定**向量s=};x[i]表示第i個要去的地點編號。景點不能重複走,因此,走過的景點都不能再走,xi的取值s-。

資料結構:

用bestw表示最優解,best表示最優解的路徑。

設乙個帶權的鄰接矩陣maps,表示從i頂點到j頂點的距離,maps等於的權值,若沒有邊,則maps[i][j]為無窮大。

(2).定義乙個結構體,用於儲存解空間樹的節點;

struct node

node(int _cl,int _id)

};

bool operator
因此,進入優先佇列的節點會自動進行一次排序,將最接近最優解的結點排到最前面。

解空間樹:

排列樹**

(1)建立初始節點a0, 假設從第1號結點開始走,x[1]=1,生成第二層的結點,a(cl,id),cl=0,id=2(id表示第解空間樹的第id層);x=;將a加入優先佇列。定義臨時變數t表示當前搜尋解空間的層數。

(2)擴充套件a結點,搜尋a的所有分支,for(j=t;j<=n;j++)判斷x[t-1]與x[j]是否相連,且cl+maps[x[i-1]][x[j]]q;

node node;

node=node(0,2);

int i,j;

for( i=1;i<=n;i++)

q.push(node);

while(!q.empty())

node(int _cl,int _id)

};bool operator

void bfs()

q.push(node);

while(!q.empty())

bestw=inf;

bfs();

print();

return 0;

}

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

一 問題描述 某售貨員要到若干城市去推銷商品,已知各城市之間的路程 或旅費 他要選定一條從駐地出發,經過每個城市一次,最後回到駐地的路線,使總的路程 或總旅費 最小。如下圖 1,2,3,4 四個城市及其路線費用圖,任意兩個城市之間不一定都有路可達。二 問題理解 1.分支限界法利用的是廣度優先搜尋和最...

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

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...

旅行售貨員問題 回溯法

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