干货 | 自适应大邻域搜索(ALNS)和禁忌搜索(TS)实验对比附代码

简介: 干货 | 自适应大邻域搜索(ALNS)和禁忌搜索(TS)实验对比附代码

前言


大家好呀,你们帅气的小编又回来啦!

微信图片_20220423101252.png

公众号的老观众们应该会记得,在去年这个时候我们公众号发布了有关自适应大领域搜索算法(adaptive large neighborhood search)的相关系列教程,有关传送门如下:

1. 干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇2. 代码 | 自适应大邻域搜索系列之(1) - 使用ALNS代码框架求解TSP问题3. 代码 | 自适应大邻域搜索系列之(2) - ALNS算法主逻辑结构解析

4. 代码 | 自适应大邻域搜索系列之(3) - Destroy和Repair方法代码实现解析5. 代码 | 自适应大邻域搜索系列之(4) - Solution定义和管理的代码实现解析

6. 代码 | 自适应大邻域搜索系列之(5) - ALNS_Iteration_Status和ALNS_Parameters的代码解析

7. 代码 | 自适应大邻域搜索系列之(6) - 判断接受准则SimulatedAnnealing的代码解析

8. 代码 | 自适应大邻域搜索系列之(7) - 局部搜索LocalSearch的代码解

9. 自适应大邻域 | 用ALNS框架求解一个TSP问题 - 代码详解


当时,为了调用MinGW库,我们还特地做了一份安装教程。但教程中安装库的过程比较繁琐,尤其是对平时习惯使用VS而不是dev C++的观众来说,又要动手下载dev C++,不太方便。


对于有点编程基础的同学还好,照着葫芦总能画出一个瓢来:


微信图片_20220423101254.jpg


emmm……而对于不熟悉编程的同学而言,一顿操作猛如虎:


微信图片_20220423101256.jpg


为了造福人类,这次小编为大家带来了VS版本的ALNS框架,只需要下载处理好的项目文件导入VS中就可以直接运行啦!

代码运行


习惯使用dev C++的同学,可以直接参考过去的推文,安装MinGW库,再在dev C++上运行。
对使用VS的同学,直接从公众号中下载代码,用VS打开.sin文件就行啦在公众号内输入【ALNSTSPVS】不带【】即可下载相关代码!如图:


微信图片_20220423101259.png微信图片_20220423101301.png


怎样,是不是跟在床上翻一个身一样简单呢?不过你的VS版本要>=2015哦。
微信图片_20220423101303.gif

这次提供给大家的代码中,除了已经搭建好的ALNS的框架(来自Github,一个法国的PHD写的,原地址:https://github.com/biblik/alns-framework),还有编写的利用ALNS框架求解TSP的代码(代码经过小舟同学修改),并包含几个TSP算例:
微信图片_20220423101305.jpg

图中箭头标注的.xml文件用于参数修改。箭头指向的是几个重要参数,用于设置搜索停止条件,分别代表迭代次数、运行时间、未能优化当前解的最大迭代次数。任意一项指标超过设置参数时,程序停止运行:
微信图片_20220423101308.jpg

算例在main.cpp中输入,在图示位置输入算例名称:
微信图片_20220423101311.jpg

如果要导入自己的算例,将算例放置到工程文件目录下,保证算例格式与所给算例一样,就可以运行啦!

简单实验


关于ALNS的介绍,过去已经有相关推文做了详细解读。这里我们对ALNS求解TSP的结果进行简单实验,看一看算法的实际运行效果。


测试算例采用TSPLIB提供的TSP算例,可以在公众号菜单【资源下载-算例下载】一栏进行下载。
我们先将ALNSTabu Search进行简单对比,关于Tabu Search的传送门:
干货|十分钟快速复习禁忌搜索(c++版)
对比结果如下:
微信图片_20220423101313.jpg

经过简单的测试发现,ALNS代码运行的时间比禁忌搜索算法更长一些。并且两种算法得出的满意解与最优解都有一些差距,所以我们增加最大迭代次数,看一看两种算法能更精确到什么程度:
微信图片_20220423101316.jpg

可以看到,增加迭代次数,ALNS会得到更优的满意解,而TS可能早就陷入了局部最优,已经无法继续得到更优的解了。们选择算例rd400,进一步测试ALNS的运行情况:
微信图片_20220423101319.jpg

从上面的结果可以看出:ALNS通过增加迭代次数,是能更好的逼近最优解的。不过所需要的时间也相应会增加。


经过比较可以看出,ALNS收敛的速度较慢,因为其搜索的邻域是非常大的,其达到满意解所需的搜索时间要更久。但正是由于其搜索的邻域巨大,在此过程中不容易过早陷入局部最优,增加搜索时间是有更大概率找到更好的解。
而TS搜索的邻域相对ALNS较小(和测试代码的邻域结构有关),不过,这里说的邻域相对较小,并不一定指TS搜索邻域一定比ALNS小,你也可以通过邻域结构的设计,搞得很大很大。
但一般而言,ALNS的邻域规模都大一些,毕竟他就是以大规模邻域著称的。在本那次代码中,由于TS只设计了一个邻域算子,因此收敛的速度非常快,但也过早陷入了局部最优。


当然,以上测试非常简单,反应出两种算法的不同特点还不够准确,因为实际运行过程建立在代码的基础上,比如对禁忌搜索而言,算子设计的个数、优劣会影响解的精确度;是否进行去重优化会影响搜索速度。对ALNS,代码中设计了local search,因此搜索速度会略慢一些,但优化程度会有所提升。
微信图片_20220423101322.gif

写在后面


ALNS相对比较复杂,尤其是我们提供的代码框架非常完善,综合了模拟退火、变邻域搜索的一些特点,要弄清楚并不容易。在接下来的一段时间里,小编也会和大家一起进一步研究ALNS,为大家带来一些ALNS相关的文章,希望大家多多关注~

相关文章
|
供应链 数据可视化 搜索推荐
商业模式画布BMC入门指南:模块、实操与工具
2分钟了解什么是商业模式画布BMC,哪些工具可以绘制。
2114 11
商业模式画布BMC入门指南:模块、实操与工具
|
11月前
|
SQL 人工智能 自然语言处理
别让你的大模型被忽悠了,聊聊prompt注入攻击
本文探讨了Prompt工程中的隐私与安全问题,重点分析了“奶奶漏洞”及更广泛的Prompt攻击现象,特别是Prompt注入的原理与防御手段。Prompt注入通过构造恶意输入突破模型限制,使LLM执行非预期操作。文章介绍了直接注入和间接注入类型,并提供了多种防御方案,如输入过滤、强化系统指令、接入第三方校验库及多模型协作防御。此外,还讨论了Prompt逆向工程及其正负影响,以及恶意MCP服务投毒的实际案例,如GitHub Copilot漏洞。最后提出了动态权限控制和持续安全监测等解决策略。
|
8月前
|
算法 数据挖掘 异构计算
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
710 0
【多目标优化算法比较】MOFPA、MOFA、MOCS、MOBA、MOHHO五种多目标优化算法性能对比研究(Matlab代码实现)
|
资源调度 JavaScript 编译器
Vite中如何更好的使用TS
【8月更文挑战第4天】Vite中如何更好的使用TS
995 4
Vite中如何更好的使用TS
|
11月前
|
数据采集 并行计算 算法
基于蚁群算法求解带时间窗的车辆路径问题
基于蚁群算法求解带时间窗的车辆路径问题
319 0
|
人工智能 Linux Docker
一文详解几种常见本地大模型个人知识库工具部署、微调及对比选型(1)
近年来,大模型在AI领域崭露头角,成为技术创新的重要驱动力。从AlphaGo的胜利到GPT系列的推出,大模型展现出了强大的语言生成、理解和多任务处理能力,预示着智能化转型的新阶段。然而,要将大模型的潜力转化为实际生产力,需要克服理论到实践的鸿沟,实现从实验室到现实世界的落地应用。阿里云去年在云栖大会上发布了一系列基于通义大模型的创新应用,标志着大模型技术开始走向大规模商业化和产业化。这些应用展示了大模型在交通、电力、金融、政务、教育等多个行业的广阔应用前景,并揭示了构建具有行业特色的“行业大模型”这一趋势,大模型知识库概念随之诞生。
160354 30
|
弹性计算
2023阿里云服务器带宽收费标准价格表
阿里云服务器带宽收费标准价格表,阿里云服务器公网带宽计费模式按固定带宽和按使用流量哪个划算?按固定带宽计费1M带宽一个月23元,按使用流量计费1GB流量0.8元,如果云服务器带宽使用率低于10%,那么首选按使用流量计费,如果带宽实际利用率较高的话,按固定带宽计费更划算一些。云服务器吧来详细说下阿里云服务器带宽不同计费模式下收费价格、费用计算方法及如何选择更合适说明:
2157 0
2023阿里云服务器带宽收费标准价格表