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)的更多相关文章

  1. pyqt样式表语法笔记(下)--原创

    pyqt样式表语法笔记(下) python 启动界面 QSS pyqt 一.启动界面的设置 简单点~说话的方式简单点用一张静态图片作为程序启动界面为例. 原来的语句     python    7行 ...

  2. 【智能算法】用模拟退火(SA, Simulated Annealing)算法解决旅行商问题 (TSP, Traveling Salesman Problem)

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 文章声明 此文章部分资料和代码整合自网上,来源太多已经无法查明出处,如侵犯您的权利,请联系我删除. 01 什么是旅行商问题(TS ...

  3. HDOJ-ACM1010(JAVA) 奇偶剪枝法 迷宫搜索

    转载声明:原文转自:http://www.cnblogs.com/xiezie/p/5568822.html 第一次遇到迷宫搜索,给我的感觉是十分惊喜的:搞懂这个的话,感觉自己又掌握了一项技能~ 个人 ...

  4. 07_旅行商问题(TSP问题,货郎担问题,经典NPC难题)

    问题来源:刘汝佳<算法竞赛入门经典--训练指南> P61 问题9: 问题描述:有n(n<=15)个城市,两两之间均有道路直接相连,给出每两个城市i和j之间的道路长度L[i][j],求 ...

  5. 遗传算法解决旅行商问题(TSP)

    这次的文章是以一份报告的形式贴上来,代码只是简单实现,难免有漏洞,比如循环输入的控制条件,说是要求输入1,只要输入非0就行.希望会帮到以后的同学(*^-^*) 一.问题描述 旅行商问题(Traveli ...

  6. 禁忌搜索算法TSA 旅行商问题TSP python

    import math import random import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot ...

  7. Sqli labs系列-less-5&6 报错注入法(下)

    我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...

  8. 26数据查询的各种小玩法-select 下(必学)-天轰穿sqlserver视频教程

    大纲:简单查询-选择数据列,使用字符串,改变列标题,使用数据运算,使用ALL语DISTINCT关键字,使用TOP关键字,排序 优酷超清地址,为了冲优酷的访问量,所以这里只放优酷的地址了,其实其他网站还 ...

  9. 三进制状态压缩DP(旅行商问题TSP)HDU3001

    http://acm.hdu.edu.cn/showproblem.php?pid=3001 Travelling Time Limit: 6000/3000 MS (Java/Others)     ...

随机推荐

  1. [Angular & Unit Testing] Testing Component with Store

    When using Ngrx, we need to know how to test the component which has Router injected. Component: imp ...

  2. actionmode-ActionMode以及它的menu使用

    下图左边效果为Context Menu右边效果为ActionMode. ActionMode 其实就是替换在actionbar的位置上显示的一个控件.它跟actionbar一样,也是一种导航作用.只不 ...

  3. 8.Maven之(八)约定优于配置

    转自:“https://blog.csdn.net/qq_25460531/article/details/79423961” maven的配置文件看似很复杂,其实只需要根据项目的实际背景,设置个别的 ...

  4. 1.19 Python基础知识 - 软件目录开发规范及不同模块之间的调用

    一个软件项目的开发,除了需要很厉害的开发能力,同时在软件开发项目时,也需要对项目结构有良好的组织能力,将功能进行拆分,不同的功能放在不同的目录或文件中,方便日后的维护,升级等操作.比如核心代码的目录, ...

  5. C#打印日志的小技巧(转)

    https://www.cnblogs.com/jqg-aliang/p/5234206.html 打印日志的函数 开发中输出日志必不可少,在C#中输出多个不同类型参数的时候,需要连接符累加输出,很是 ...

  6. BZOJ5137: [Usaco2017 Dec]Standing Out from the Herd(广义后缀自动机,Parent树)

    Description Just like humans, cows often appreciate feeling they are unique in some way. Since Farme ...

  7. 关于java中String的一点理解

      String类是java的最基本类之中的一个,非常好的掌握它的原理非常是必要的!   1.String的Final类型的.是不可继承 的.final类默认的方法都为final类型,保证了方法不能被 ...

  8. Windows环境下ARM集成开发环境的搭建与使用

    Windows环境下能够使用Eclipse IDE for C/C++ Developers来搭建ARM开发环境 本文地址:http://blog.csdn.net/u011833609/articl ...

  9. textview-调节字体间距跟行距

    直接进行代码验证 1)当没有添加字体间距属性的时候 <TextView android:id="@+id/text_view" android:layout_width=&q ...

  10. iterm恢复默认设置

    命令行执行以下命令即可: defaults delete com.googlecode.iterm2