剪枝法观点下的旅行商问题(TSP)
1. 构建基本的穷举搜索骨架
int n;
int dst[100][100];
int best;
const int INF = 987654321;
// 初始状态下,path 存入第一节点,visited 全部元素为 false,curLen = 0;
void search(vector<int>& path, vector<bool>& 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<bool> visited(n, false);
vector<int> 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<bool>& visited){
double ret = minEdge[0];
for (int i = 0; i < visited.size(); ++i)
if (!visited[i])
ret += minEdge[i];
// 城市结点之间彼此互通
return ret;
}
void search(vector<int>& path, vector<bool>& 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]);
}
}
}
剪枝法观点下的旅行商问题(TSP)的更多相关文章
- pyqt样式表语法笔记(下)--原创
pyqt样式表语法笔记(下) python 启动界面 QSS pyqt 一.启动界面的设置 简单点~说话的方式简单点用一张静态图片作为程序启动界面为例. 原来的语句 python 7行 ...
- 【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...
- HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索
转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5568822.html 第一次遇到迷宫搜索,给我的感觉是十分惊喜的:搞懂这个的话,感觉自己又掌握了一项技能~ 个人 ...
- 07_旅行商问题(TSP问题,货郎担问题,经典NPC难题)
问题来源:刘汝佳<算法竞赛入门经典--训练指南> P61 问题9: 问题描述:有n(n<=15)个城市,两两之间均有道路直接相连,给出每两个城市i和j之间的道路长度L[i][j],求 ...
- 遗传算法解决旅行商问题(TSP)
这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...
- 禁忌搜索算法TSA 旅行商问题TSP python
import math import random import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot ...
- Sqli labs系列-less-5&6 报错注入法(下)
我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...
- 26数据查询的各种小玩法-select 下(必学)-天轰穿sqlserver视频教程
大纲:简单查询-选择数据列,使用字符串,改变列标题,使用数据运算,使用ALL语DISTINCT关键字,使用TOP关键字,排序 优酷超清地址,为了冲优酷的访问量,所以这里只放优酷的地址了,其实其他网站还 ...
- 三进制状态压缩DP(旅行商问题TSP)HDU3001
http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others) ...
随机推荐
- iptables-save && iptables-restore iptables规则保存于还原
iptables-save命令用于将linux内核中的iptables表导出到标准输出设备商,通常,使用shell中I/O重定向功能将其输出保存到指定文件中. 语法 -t:指定要保存的表的名称. 实例 ...
- lastlog---显示系统中所有用户最近一次登录信息。
lastlog命令用于显示系统中所有用户最近一次登录信息. lastlog文件在每次有用户登录时被查询.可以使用lastlog命令检查某特定用户上次登录的时间,并格式化输出上次登录日志/var/log ...
- 今日SGU 5.12
SGU 149 题意:求每一个点的距离最远距离的点的长度 收获:次大值和最大值,dfs #include<bits/stdc++.h> #define de(x) cout<< ...
- UVALive 5292 Critical Links
Critical Links Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Ori ...
- lubuntu自动登录(lxde)
lubuntu自动登录(lxde) 1.重启ubuntu,在grub界面长按shirft进入grub菜单: 2.选择recovery mode,按"e"键进入编辑页面: 3.把ro ...
- sqlserver存储过程实现多表分页
if @PageIndex = 1 begin if @strWhere != ’’ set @strSQL = ’select top ’ + str(@PageSize) +’ ’+@strGet ...
- [Python] Object spread operator in Python
In JS, we have object spread opreator: const x = { a: '1', b: '2' } const y = { c: '3', d: '4' } con ...
- unity3d 改动gui label颜色,定义颜色需除以256
GUIStyle titleStyle2 = new GUIStyle(); titleStyle2.fontSize = 20; titleStyle2.normal.textColor = new ...
- Android Multiple dex files define BuildConfig
dexOptions { preDexLibraries = false }
- 在CentOS7 开发与部署 asp.net core app笔记
原文:在CentOS7 开发与部署 asp.net core app笔记 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lihongzhai/art ...