剪枝法观点下的旅行商问题(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) ...
随机推荐
- terminfo 数据库?
什么是 terminfo 数据库? UNIX 系统上的 terminfo 数据库用于定义终端和打印机的属性及功能,包括各设备(例如,终端和打印机)的行数和列数以及要发送至该设备的文本的属性.UNIX ...
- Linux-swap分区
Linux内核为了提高读写效率与速度,会将文件在内存中进行缓存,这部分内存就是Cache Memory(缓存内存).即使你的程序运行结束后, Cache Memory也不会自动释放.这就会导致你在Li ...
- FreeModbus RTU slave & Modbus RTU master
一.FreeModbus RTU 协议数据格式 FreeModbus RTU是开源的一个协议,并且使用FreeModbus RTU 只能当做从机Slave,RTU协议中的指令由地址码(一个字节),功能 ...
- [ReasonML] Workshops code
/* list of strings */ let _ = ["example-1", "example-2", "example-3"]; ...
- 码农的救赎:使用Github Pages搭建博客
人生若仅仅如初见,都恨太晚 据说有博客的人比没博客人的薪水要高非常多,相传写博客也是一个高手的标配,尽管之前一直有在写(在这里).可是孤既不是高手.薪水还比别人少.之前一直在CSDN上面写博客,那是一 ...
- 电商系统Broadleaf文档翻译(六) - 主要实体main entities
主要实体 原文标题:main entities 原文出处:http://www.broadleafcommerce.com/docs/core/current/broadleaf-concepts/d ...
- JavaScript的子集和超集
1.JavaScript子集 JavaScript子集的定义大部分都是出于安全考虑,仅仅有使用这门语言的一个安全的子集编写脚本,才干让代码运行得更安全.更稳定.比方怎样更安全地运行一段由不可信第三方提 ...
- elasticsearch java 客户端之action简介
上一篇介绍了elasticsearch的client结构,client只是一个门面,在每个方法后面都有一个action来承接相应的功能.但是action也并非是真正的功能实现者,它只是一个代理,它的真 ...
- Jquery获取select选中的option的文本信息
注意:以下用的$(this)代表当前选中的select框 第一种: $(this).children("option:selec... ...查看全文
- ToggleButton控件
ToggleButton 两种状态 ·状态button -继承自CompoundButton ·主要属性:-Android:textOn -Android:textOff ·主要方法: ...