博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剪枝法观点下的旅行商问题(TSP)
阅读量:4678 次
发布时间:2019-06-09

本文共 1757 字,大约阅读时间需要 5 分钟。

1. 构建基本的穷举搜索骨架

int n;int dst[100][100];int best;const int INF = 987654321;// 初始状态下,path 存入第一节点,visited 全部元素为 false,curLen = 0;void search(vector
& path, vector
& visited, int curLen){ if (best <= curLen) return; int here = path.back(); if (path.size() == n) { best = min(best, curLen+dst[here][0]); return; } for (int next = 0; next < n; ++next){ if (visited[next]) continue; visited[next] = true; path.push_back(next); search(path, visited, curLen + dst[here][next]); visited[next] = false; path.pop_back(); }}double solve(){ best = INF; vector
visited(n, false); vector
path(1, 0); visited[0] = true; search(path, visited, 0); return best;}

2. 剪枝法初步:不如最优解就当即结束

只需在 search() 函数的开头部分加入如下一行代码:

// best 初始化为INF,// 只有在 if (path.size() == n)... 才对其进行更新;if (best <= curLen)    return;

3. 剪枝法进阶:利用启发式算法的剪枝法

“不如最优解”就终止搜索的剪枝法,虽然比较有用,但比起动态规划还差很远,“利用启发式方法估计剩余部分”的剪枝法就相对巧妙得多。

比如设计这样的启发式函数,会在未访问的城市相连路径中选择最短的路径相加。

int minEdge;double simpleHeur(const vector
& visited){ double ret = minEdge[0]; for (int i = 0; i < visited.size(); ++i) if (!visited[i]) ret += minEdge[i]; // 城市结点之间彼此互通 return ret;}void search(vector
& path, vector
& visited, int curLen){ if (best <= curLen + simpleHeur(visited)) return; //...} double solve(){ for (int i = 0; i < n; ++i){ minEdge[i] = INF; for (int j = 0; j < n; ++j){ if (i != j) minEdge[i] = min(minEdge[i], dst[i][j]); } } }

转载于:https://www.cnblogs.com/mtcnn/p/9423799.html

你可能感兴趣的文章
CodeForces999A-Mishka and Contest
查看>>
u-boot下载模式LCD显示图片修改方法(基于TQ2440)
查看>>
本人博客目录 [实时更新]
查看>>
循序渐进学.Net Core Web Api开发系列【17】:.Net core自动作业之Hangfire
查看>>
一款基于Vue的扩展性组件库 VV-UI
查看>>
数组去重
查看>>
Numba(??)
查看>>
JBPM4.4+SSH 整合配置及完整实例
查看>>
java多线程设计模式
查看>>
在Foxmail邮件客户端登录263企业邮箱
查看>>
网站架构不得不谨慎的10个问题
查看>>
SQL查看表数据占用空间代码
查看>>
Linux系统信息查看命令大全
查看>>
jquery ajax 同步异步的执行
查看>>
vue 渲染流程
查看>>
pytorch bug
查看>>
centos7.3使用squid搭建代理服务器
查看>>
温故而知新-WebSocket 教程
查看>>
OO第二次总结 多线程从玄幻到入门
查看>>
EasyUI中, datagrid用loadData方法绑定数据。
查看>>