算法分析与设计实验报告实验3:分支限界法的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

while (pq.size()) {
Node tmp = pq.top();pq.pop(); if (tmp.k == n - 1) {
int p; for (int i = 1; i <= n; i++) {
if (!tmp.visited[i]) {
p = i; break; } } int ans = tmp.sumv + cost[p][tmp.s] + cost[tmp.e][p];
int tmpA[MAX_N]; for (int j = 1; j <= n; j++) {
tmpA[j] = cost[i][j]; } sort(tmpA + 1, tmpA + 1 + n); low += tmpA[1]; } } int get_lb(Node p) { int ret = p.sumv * 2; int min1 = INF, min2 = INF; for (int i = 1; i <= n; i++) {
} for (int j = 1; j <= n; j++) {
if (min2 > cost[j][i]) min2 = cost[j][i];
} ret += min1 + min2; } } return (ret + 1) / 2; }
int solve() {
get_up();
get_low();
cin >> cost[i][j]; if (i == j) {
cost[i][j] = INF; } } } cout << solve() << endl; return 0; }
adebca19
调 试 过 程 及 实 验 结 果
通过这次实验,学会了优先队列的使用方法,知道了如何求 TSP 问题的限界函

数。但一开始不知道怎么实现这个算法,还借鉴了网上代码。一开始编写的代

码错误很多,后来慢慢修改。总而言之,这次实验收获很大。


#include<iostream>
#include<algorithm>
2018/04/19
有 5 个城市,城市之间的距离(所有城市间的距离小于 100KM)如图所示,
试用分支限界法求一条旅游回路,使得从某城市出发经过其他的 4 个城市在返


回到出发城市的总距离最短


例如: 输入:5 -1 3 4 2 7 3 -1 4 6 3 4 4 -1 5 8 2 6 5 -1 6 7 3 8 6 -1 输出:
#include<cstdio>
#include<queue>
const int INF = 100000;
const int MAX_N = 22;
using namespace std;
int n; int cost[MAX_N][MAX_N]; struct Node {
bool visited[MAX_N]; int s; int s_p;
next.s = tmp.s; next.sumv = tmp.sumv + cost[tmp.e][i]; next.e = i; next.k = tmp.k + 1; for (int j = 1; j <= n; j++) next.visited[j] = tmp.visited[j]; next.visited[i] = true;
min2 = cost[p.e][i]Hale Waihona Puke Baidu }
} ret += min2; for (int i = 1; i <= n; i++) {
if (!p.visited[i]) {
min1 = min2 = INF; for (int j = 1; j <= n; j++) {
if (min1 > cost[i][j]) min1 = cost[i][j];
课程实验报告
课程名称 算法分析与设计 班级 计算 161 实验日期
姓名
何严鸿
学号 20160701 实验成绩 9
实验名称
实验 3:分支限界法的应用

1.理解分支限界法的剪枝搜索策略;


2.掌握分支限界法的基本思想。





操作系统:Windows


IDE:Visual C++

(1)旅行商问题
int e; int e_p; int k; int sumv; int lb; bool operator <(const Node &p)const {
return p.lb < lb; } }; priority_queue<Node> pq; int low, up; bool dfs_visited[MAX_N];
next.lb = get_lb(next); if (next.lb > up) continue; pq.push(next);
} }
} return ret; } int main() { cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
} }
dfs_visited[p] = true; return dfs(p, k + 1, l + minlen);
} void get_up() {
dfs_visited[1] = true; up = dfs(1, 1, 0); }
void get_low() {
low = 0; for (int i = 1; i <= n; i++) {
Node star; star.s = 1;//起点为 1 star.e = 1;//终点为 1 star.k = 1;//走过了 1 个点 for (int i = 1; i <= n; i++) {
star.visited[i] = false; } star.visited[1] = true; star.sumv = 0; star.lb = low; int ret = INF; pq.push(star);
int dfs(int u, int k, int l) {
if (k == n) return l + cost[u][1]; int minlen = INF, p; for (int i = 1; i <= n; i++) {
if (!dfs_visited[i] && minlen > cost[u][i]){ minlen = cost[u][i]; p = i;
if (!p.visited[i] && min1 > cost[i][p.s]) {
min1 = cost[i][p.s]; }
} ret += min1; for (int i = 1; i <= n; i++) {
if (!p.visited[i] && min2 > cost[p.e][i]) {
if (ans <= tmp.lb) {
ret = min(ans, ret); break; }
else {
up = min(up, ans); ret = min(ret, ans); continue;
} }
Node next; for (int i = 1; i <= n; i++) {
if (!tmp.visited[i]) {
相关文档
最新文档