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