分枝限界法求TSP問題 C C

2021-09-02 19:10:23 字數 2077 閱讀 2761

旅行商問題(tsp):給定一系列城市和每對城市之間的距離,求解訪問每一座城市一次並回到起始城市的最短迴路。它是組合優化中的乙個np困難問題,在運籌學和理論電腦科學中非常重要。

這篇文章裡介紹一下基於分支限界法的tsp演算法。

對於tsp,我們需要利用上界和下界來對bfs進行剪枝,通過不斷更新上界和下界,盡可能的排除不符合需求的child,以實現剪枝。最終,當上限和下限等同時,我們可以獲得最優的bfs解,以解決tsp問題。

在第一篇中,我們用dfs獲取上界,用每行矩陣最小值來獲取下界。

**如下,下面**中,我採用貪心法(使用dfs暴力搜尋到乙個結果)來獲取最初的上界,通過累加每行旅行商矩陣中的最小值來獲取乙個下界。

#include#include#include#includeconst int inf = 100000;

const int max_n = 22;

using namespace std;

//n*n的乙個矩陣

int n;

int cost[max_n][max_n];//最少3個點,最多max_n個點

struct node

};priority_queuepq;//建立乙個優先佇列

int low, up;//下界和上界

bool dfs_visited[max_n];//在dfs過程中搜尋過

//確定上界,利用dfs(屬於貪心演算法),貪心法的結果是乙個大於實際值的估測結果

int dfs(int u, int k, int l)//當前節點,目標節點,已經消耗的路徑

}return dfs(p, k + 1, l + minlen);

}void get_up()

//用這種簡單粗暴的方法獲取必定小於結果的乙個值

void get_low()

sort(tmpa + 1, tmpa + 1 + n);//對臨時的陣列進行排序

low += tmpa[1];

}}int get_lb(node p)

//cout << min1 << endl;

}ret += min1;

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

//cout << min2 << endl;

}ret += min2;

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

for (int j = 1; j <= n; j++)

ret += min1 + min2;}}

return (ret + 1) / 2;

}int solve()

star.visited[1] = true;

star.sumv = 0;//經過的路徑距離初始化

star.lb = low;//讓目標值先等於下界

int ret = inf;//ret為問題的解

pq.push(star);//將起點加入佇列

while (pq.size())

}int ans = tmp.sumv + cost[p][tmp.s] + cost[tmp.e][p];//已消耗+回到開始消耗+走到p的消耗

//如果當前的路徑和比所有的目標函式值都小則跳出

if (ans <= tmp.lb)

//否則繼續求其他可能的路徑和,並更新上界

else

}//當前點可以向下擴充套件的點入優先順序佇列

node next;

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

}//cout << pq.size() << endl;bug:測試為0

}return ret;

}int main()}}

cout << solve() << endl;

return 0;

}

執行結果:

5

100000 5 61 34 12

57 100000 43 20 7

39 42 100000 8 21

6 50 42 100000 8

41 26 10 35 100000

36

分枝限界法 最優裝載問題

採用分枝限界法求解最優裝載問題。給出以下裝載問題的求解過程和結果 n 5,貨櫃重量為w 5,2,6,4,3 限重為 w 10。在裝載重量相同時最優裝載方案是貨櫃個數最少的方案。include include using namespace std define maxn 21 最多的貨櫃數 問題表示...

1044 用分枝定界法求解TSP問題

用分枝定界法求解tsp問題 time limit 1000ms memory limit 65536k total submit 15 accepted 7 description 已知n個城市之間的相互距離,現有一推銷員必須遍訪這n個城市,並且每個城市只能訪問一次,最後又必須返回出發城市。如何安排...

分枝 限界法的相關知識

定義 分支定界 branch and bound 演算法是一種在問題的解空間樹上搜尋問題的解的方法。但與回溯演算法不同,分支定界演算法採用廣度優 先或最小耗費優先的方法搜尋解空間樹,並且,在分支定界演算法中,每乙個活結點只有一次機會成為擴充套件結點。利用分支定界演算法對問 題的解空間樹進行搜尋,它的...