自适应大邻域搜索代码系列之(1) - 使用ALNS代码框架求解TSP问题
前言
上次出了邻域搜索的各种概念科普,尤其是LNS和ALNS的具体过程更是描述得一清二楚。不知道你萌都懂了吗?小编相信大家早就get到啦。不过有个别不愿意透露姓名的热心网友表示上次没有代码,遂不过瘾啊~哎,大家先别急,代码有得你们酸爽的……
不过由于ALNS的代码量实在太大,小编打算把这个做成一个系列来一一为大家讲解,好让小伙伴们彻底把这个算法框架的代码吃透。今天暂时还是先不对代码进行讲解,先来教大家怎么使用ALNS的框架求解一个TSP问题吧~
环境准备
小编的演示是基于Windows 10 x64位环境的(Linux党就更简单了),其他Windows 环境也类似。在此之前我们需要配置几个东西。
2.1 安装MinGW
这玩意单独装比较麻烦,但是安装devC++会自带这玩意儿,特别方便。没有安装devC++的小伙伴戳下面链接(https://pan.baidu.com/s/1PJ5uxGKmkWzl_3s4GQM88g)去下一个安装上。然后在电脑上找到devC++的安装位置,把其目录下的MinGW64\bin文件添加环境变量。如下图所示:
打开cmd命令行,输入下面命令:
mingw32-make
出现下面提示就成功了。
下载源代码
欲获取代码,请关注我们的微信公众号【程序猿声】,在后台回复:ALNS代码。即可下载。
把源代码下载下来,然后解压到某个位置(路径不要有中文)。
修改源码
找到\trunk\src\alns下的OperatorManager.cpp:
打开,在头文件位置加入下面这句话,把调试模式给禁用掉:
编译
在命令行下进入\trunk\Release目录,首先输入mingw32-make clean,清理以前编译的中间文件。
然后输入:mingw32-make。进行编译。
得到我们的目标文件:libALNS-framework.so。这是ALNS框架的动态链接库,稍后我们要使用到的。
在命令下进入\trunk\examples\tsp,把main.cpp替换为小编修改好的main.cpp(点击这里下载:https://pan.baidu.com/s/1Z2RcUnGIeKITimcUyGypdA)。然后照例:首先输入mingw32-make clean,清理以前编译的中间文件。然后输入:mingw32-make。进行编译。
最终得到我们的程序TSP.exe。这里还有一步,把刚刚编译好的libALNS-framework.so文件复制到当前目录,TSP程序运行需要用到它。
最后可以在命令行下输入TSP,运行我们的程序:
至此,已经完成了。最后说一下,修改的代码为求解Berlin52问题的代码。最优解是7542,至于这里的解为什么比7542少,原因是代码算总距离的时候没有加上第一个和最后一个city的距离。
最后再多说两句,上述求解的代码是根据ALNS框架定制而来的。其实,大家想用ALNS算法求解任何问题,只需要把框架内容做相应的定制就可以啦。在下面的几篇推文里,小编将详细解析ALNS代码框架的内容,然后把上面求解TSP例子的代码定制内容也给大家讲解一下。期待我们后面的文章吧~
自适应大邻域搜索代码系列之(1) - 使用ALNS代码框架求解TSP问题的更多相关文章
- 代码 | 自适应大邻域搜索系列之(7) - 局部搜索LocalSearch的代码解析
前言 好了小伙伴们我们又见面了,咳咳没错还是我.不知道你萌接连被这么多篇代码文章刷屏是什么感受,不过,酸爽归酸爽.今天咱们依然讲代码哈~不过今天讲的依然很简单,关于局部搜索LocalSearch的代码 ...
- 代码 | 自适应大邻域搜索系列之(3) - Destroy和Repair方法代码实现解析
前言 上一篇文章中我们具体解剖了ALNS类的具体代码实现过程,不过也留下了很多大坑.接下来的文章基本都是"填坑"了,把各个模块一一展现解析给大家.不过碍于文章篇幅等原因呢,也不会每 ...
- 代码 | 自适应大邻域搜索系列之(4) - Solution定义和管理的代码实现解析
前言 上一篇讲解了destroy和repair方法的具体实现代码,好多读者都在喊酸爽和得劲儿--今天这篇就讲点简单的,关于solution的定义和管理的代码实现,让大家回回神吧--哈哈. 01 总体概 ...
- 干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇
01 首先来区分几个概念 关于neighborhood serach,这里有好多种衍生和变种出来的胡里花俏的算法.大家在上网搜索的过程中可能看到什么Large Neighborhood Serach, ...
- 代码 | 自适应大邻域搜索系列之(2) - ALNS算法主逻辑结构解析
00 前言 在上一篇推文中,教大家利用了ALNS的lib库求解了一个TSP问题作为实例.不知道你萌把代码跑起来了没有.那么,今天咱们再接再厉.跑完代码以后,小编再给大家深入讲解具体的代码内容.大家快去 ...
- 代码 | 自适应大邻域搜索系列之(5) - ALNS_Iteration_Status和ALNS_Parameters的代码解析
前言 上一篇推文说了,后面的代码难度直线下降,各位小伙伴可以放去n的100次方心了.今天讲讲一些细枝末节,就是前面一直有提到的参数和一些状态的记录代码.这个简单啦,小编也不作过多解释了.大家直接看代码 ...
- 代码 | 自适应大邻域搜索系列之(6) - 判断接受准则SimulatedAnnealing的代码解析
前言 前面三篇文章对大家来说应该很简单吧?不过轻松了这么久,今天再来看点刺激的.关于判断接受准则的代码.其实,判断接受准则有很多种,效果也因代码而异.今天介绍的是模拟退火的判断接受准则.那么,相关的原 ...
- 【优化算法】变邻域搜索算法(VNS)求解TSP(附C++详细代码及注释)
00 前言 上次变邻域搜索的推文发出来以后,看过的小伙伴纷纷叫好.小编大受鼓舞,连夜赶工,总算是完成了手头上的一份关于变邻域搜索算法解TSP问题的代码.今天,就在此给大家双手奉上啦,希望大家能ENJO ...
- 一统江湖的大前端(5)editorconfig + eslint——你的代码里藏着你的优雅
<一统江湖的大前端>系列是自己的前端学习笔记,旨在介绍javascript在非网页开发领域的应用案例和发现各类好玩的js库,不定期更新.如果你对前端的理解还是写写页面绑绑事件,那你真的是有 ...
随机推荐
- Django基础学习七之如何配置django+mysql
很久没有更新博客了,也有段时间没有持续性的学习了,感觉堕落了,今天继续开始学习吧 今天主要来学习一下在django下配置mysql的数据库和使用admin用户管理数据库 1.在project中的set ...
- 23-吝啬的国度(vector+深搜)
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市, ...
- Java字符串split分割星号*等特殊字符问题(转)
Java的split()方法分割字符串比较常用(见[Java]字符串以某特殊字符分割处理 ),但在有的时候,会遇到星号*等正则表达式中的特殊字符而无法分割的问题. 比如某需求,用户输入产品规格:厚*宽 ...
- 服务器上创建git仓库
1. 在服务器上 su - git ,切换用户 2. 创建一个目录 mkdir test.git ,请注意带上 .git 扩展 3. 切换进入此目录,git init --bare ,初始化裸 ...
- JQuery中button提交表单报TypeError: elem[type] is not a function jquery
错误: TypeError: elem[type] is not a function jquery 解决: 出现这种现象的原因是,提交的表单中,有标签的name,有以submit命名的 name中不 ...
- linux相关文章链接
薄荷开元网 http://www.mintos.org/
- 用word2016 写CSDN 博客
目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...
- ui-router 之 $state.go
Ui-router 之 $state.go $state.go(arg1,arg2,arg3),有三个参数:第一个参数是你需要跳转的完整路由:第二个参数是query,当然不需要query,直接写{ ...
- Spring 框架简介
Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架. 在这篇由三部 ...
- PipelineDB On Kafka
PipelineDB 安装yum install https://s3-us-west-2.amazonaws.com/download.pipelinedb.com/pipelinedb-0.9.8 ...