文章目录

  • 1、简介-introduction
  • 2、VNS的基本机制
    • 2.1 变邻域下降方法-Variable Neighborhood Descent
    • 2.2基本变邻域搜索方法-Basic Variable Neighborhood Search
    • 2.3 终止准则
  • 3、VNS的拓展和混杂算法
    • 3.1 VNS的拓展
    • 3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search
    • 3.3 偏变邻域搜索-Skewed VNS
    • 3.4 并行变邻域搜索-Parallel VNS
  • 4、VNS和其他启发式算法的混合使用-hybrids
    • 4.1 VNS 和 TS
    • 4.2 VNS 和 GRASP
  • 5、利用VNS框架求解VRPTW
  • 6、求解代码已经上传值GitHub
  • NOT THE END

1、简介-introduction

\qquad变邻域搜索(Variable Neighborhood Search)是一种求解组合优化和全局优化问题的元启发式算法,它的基本思想是:在局部搜索(LS)算法的框架中系统地变化邻域结构的选择。
\qquad下面本文将介绍以下几部分内容,第二部分本文将介绍VNS的基本机制;第三部分将介绍VNS的相关拓展;第四部分将介绍VNS和其他启发式算法的混杂应用;第五部分将介绍VNS在求解VRPTW中的具体思路,最后将给出使用VNS求解VRPTW问题的代码。

2、VNS的基本机制

\qquad首先定义Nk,(k=1,...,kmax)N_k,(k= 1,...,k_{max})Nk​,(k=1,...,kmax​)表示事先定义好的邻域结构集合,定义Nk(x)N_k(x)Nk​(x)表示第kkk个邻域结构中构造的解的集合。VNS基于三个简单的事实:
①某一个邻域结构的局部最优解不一定是另外一个邻域结构的局部最优解;
②对于所有邻域结构来说,全局最优解均是其局部最优解;
③对于许多问题情境,一个或者多个邻域的局部最优解应该彼此相近。
\qquad最后一个事实,虽然有点经验主义,但是暗示一个局部最优解通常会为全局最优解提供有效信息。

2.1 变邻域下降方法-Variable Neighborhood Descent

\qquad在VND中,事先选定的邻域结构按照一个确定的顺序进行执行,其流程如下图所示:

\qquad首先进行初始化,选择邻域结构Nk,(k=1,...,kmax)N_k,(k= 1,...,k_{max})Nk​,(k=1,...,kmax​),构建一个初始解,选定终止准则;之后循环执行VND,直到达到终止准则。其中VND分为两步,第一步为重置计数变量k=1k=1k=1,第二步为顺序执行邻域结构,直到k=kmaxk=k_{max}k=kmax​。在每一次选定邻域结构进行执行的时候又可以分为两步(a)在第kkk个邻域结构生成的解方案中随机选择一个解方案x′x'x′-shaking;(b)若选择的解方案x′x'x′优于当前解,则使用x′x'x′替换当前解,同时重新从第一个邻域结构开始执行优化;否则选择下一个邻域结构进行解的优化。
\qquad除了上述顺序执行的方法,VND还可以进行一定的改进,使用嵌套策略来执行邻域结构。假设有3个邻域结构,kmax=3k_{max}=3kmax​=3,则嵌套结构执行方法为在外层只使用第3个邻域结构,而对于第3个邻域结构生成的每一个解方案x′x'x′,顺序执行邻域结构1和2组成的VND。
\qquad缩减VNS(Reduced Variable Neighborhood Search)方法同上述VND方法类似,但在shaking之后,不是对x′x'x′执行后续的邻域操作,而是对当前最优解进行后续的邻域操作。

2.2基本变邻域搜索方法-Basic Variable Neighborhood Search

\qquadVNS综合了邻域选择的确定性和随机性因素,其流程如下图所示:

\qquad基本VNS与VND的区别主要在于(2.b)中在执行完邻域操作随机选定一个解x′x'x′之后,VNS不是直接判断解x′x'x′的优劣,而是对其进行进一步的局部搜索(LS)探索,将LS得到的解x′′x''x′′与当前解进行判断,保留较优的解。

2.3 终止准则

\qquad终止准则的选择可以有但不限于以下三种方式:
①规定一个最大的CPU运算时间;
②规定一个总的最大的迭代次数;
③规定一个最大迭代次数maxItemaxItemaxIte,若在maxItemaxItemaxIte之内解没有发生优化,则终止算法。

3、VNS的拓展和混杂算法

3.1 VNS的拓展

\qquad基本的VNS是一种基于descent,first improvement method和randomization的算法。在基本VNS流程的(2.c)中,可以加入一定的概率机制,当解x′′x''x′′次于当前解时,以一定的几率接受退化的解,来实现一种descent-ascent 机制;在选择邻域结构时,也可以加入轮盘赌的机制,优先选择优化效果较好的邻域结构进行执行;在(2.a)中可以选出最优的解x′x'x′来进行后续的优化;还可以规定一个kmink_{min}kmin​和kstepk_{step}kstep​,替换k←1k←1k←1为k←kmink←k_{min}k←kmin​,k←k+1k←k+1k←k+1为k←kstepk←k_{step}k←kstep​。

3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search

\qquadVNDS方法将基本VNS拓展称为一种两级VNS,VNDS的步骤如下所示:

\qquadVNDS相对于基本VNS的主要区别在于(2.b)中,VNDS不是直接对于解x′x'x′进行局部搜索LS操作,而是在(2.a)时选出一个解集合y=x′/xy=x'/\ xy=x′/ x,在新的解空间yyy(全部解空间的子集)中进行局部寻优,记寻找到的最优解为y′y'y′,整个解空间中的最优解记为x′′x''x′′,之后再执行(2.c)更新最优解或者执行下一次邻域结构优化。

3.3 偏变邻域搜索-Skewed VNS

\qquadSVNS用来探索距离当前解较远的另外的求解空间,以求得到不同的解结构,寻找到更优的解,SVNS的流程如下图所示:

\qquad从上述流程可以看出,SVNS相对于基本VNS,主要将(2.c)分解成为了两部分,新的(2.c)用来判断是否进行更新最优解,新的(2.d)用来判断是否进行重新开始邻域搜索还是继续进行邻域搜索,其中利用了函数ρ(x,x′′)\rho(x,x'')ρ(x,x′′)来判断当前解xxx和局部最优解x′′x''x′′之间的距离,(本人理解:两个解之间的差异程度,如在VRPTW中,可以指两个路径方案用的车辆数,访问客户点的顺序差异程度等等),当ρ(x,x′′)\rho(x,x'')ρ(x,x′′)的值较小的时候,参数α\alphaα取值应该较大,来使求解空间转移到差距更大的地方进行寻优。αρ(x,x′′)\alpha\rho(x,x'')αρ(x,x′′)的选取还可以采取学习机制或者自适应的机制进行更新。

3.4 并行变邻域搜索-Parallel VNS

\qquad在(2.b)时采用多线程的编程方式,对于某一个邻域产生的多个解方案来说,给每一个解方案开一个进程进行局部搜索LS,最终保留所有进程中求解结果最好的结果。

4、VNS和其他启发式算法的混合使用-hybrids

4.1 VNS 和 TS

\qquad有两种方式来进行VNS和TS的混合使用,第一种是在TS框架之中使用VNS,第二种是在VNS框架中使用TS。
\qquad在VNS框架中使用TS时,只需要将禁忌表机制加入到VNS搜索的过程即可,为所有的邻域搜索算子建立一个禁忌表,规定解禁步长和宽恕准则,可以有效避免backward搜索。
\qquad在TS框架中使用VNS时,只需要将TS中解的优化步骤中的LS优化变为VNS优化即可。

4.2 VNS 和 GRASP

\qquadGRASP是一种两阶段元启发式算法,在第一阶段使用贪婪随机的思想进行初始解的构建,在第二阶段使用LS或者枚举的思想进行解的优化。所以,一种顺其自然的方式来结合VNS和GRASP是在GRASP的第二阶段使用VNS来进行优化。

5、利用VNS框架求解VRPTW

\qquad首先选定邻域操作算子,本文在实现VNS时使用3种邻域操作算子,分别是2-opt inter-route算子,2-opt intra-route 算子和1-opt inter-route算子;在实现时使用基本VNS框架进行实现;终止准则本文使用了规定最大的迭代次数的终止准则。在基本VNS框架上,本文进行了些许改进,在内循环依次执行邻域操作算子时,本文只使用2-opt inter-route算子和2-opt intra-route 算子两种算子进行当前最优解的优化,在内循环结束之后,使用1-opt inter-route算子进行LS局部搜索优化,寻找更优的解。为了避免陷入局部最优,本文使用了“整条路径”破坏的思想,来跳出局部最优解,以求找到全局最优解。

6、求解代码已经上传值GitHub

https://github.com/Dragon-wang-fei-long/Huristic-code/tree/Dragon-wang-fei-long-Heuristic-VNS

NOT THE END

各位大佬,求点赞,求分享,求关注,嘻嘻嘻~~

变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码相关推荐

  1. 禁忌搜索(Tabu Search)原理梳理和应用细节-附求解VRPTW问题C++代码

    文章目录 1.禁忌搜索(TS)的相关概念 1.1 搜索空间(search space) 1.2 邻域结构(neighborhood structure) 1.3 禁忌表(tabu) 1.4 解禁标准( ...

  2. GRASP优化算法原理梳理和应用细节

    文章目录 1.简介-Introduction 2.算法流程和概念引入 3.RCL的构建细节和技巧 3.1 静态构建RCL 3.2 基于均匀分布构建RCL 3.3 非均匀离散分布构建RCL 3.4 Re ...

  3. 【TSP问题】基于变邻域搜索算法VNS求解旅行商问题附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  4. 局部邻域搜索-爬山法,模拟退火,禁忌,迭代局部搜索,变邻域局部搜索的简单阐释

    原文来源: 局部搜索算法 - JiePro - 博客园 https://www.cnblogs.com/JiePro/p/Metaheuristics_0.html 局部搜索算法 目录: 1.数学定义 ...

  5. vns基本的变邻域搜索算法

    论文VARIABLE NEIGHBORHOOD SEARCH 伪代码: 变邻域搜索算法(VNS)就是一种改进型的局部搜索算法.它利用不同的动作构成的邻域结构进行交替搜索,在集中性和疏散性之间达到很好的 ...

  6. 智能优化算法——篇2(邻域搜索大家族)

    目录 1.种群算法和邻域算法的区别与联系 2.算法原理总结 2.1 变邻域搜索算法VNS 2.2 自适应大邻域搜索算法ALNS 在篇1中我们提到,算法很多,但是最经典的有8种,分别是:遗传算法.禁忌搜 ...

  7. 变邻域搜索算法解决0-1背包问题

    变邻域搜索算法解决0-1背包问题 本文是关于[数据魔术师]:干货 | 变邻域搜索算法解决0-1背包问题(Knapsack Problem)代码实例一文的个人学习笔记,改了一点原文中的代码,仅供个人参考 ...

  8. 【车间调度】变邻域遗传算法求解柔性作业车间调度问题

    本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流. 混合优化算法优化策略 变邻域搜索算法是一种快速和有效的求解复杂组合优化问题的局部搜索算法,通过邻域结构的系统 ...

  9. Google 图片搜索的原理是什么?

    Google 图片搜索的原理是什么? 1 条评论 分享 按投票排序按时间排序 18 个回答 389赞同 反对,不会显示你的姓名 知乎用户,安全行业 XsXs.知乎用户.知乎用户 等人赞同 针对这个问题 ...

  10. 图像相似性搜索的原理

    本文转自: 相似图片搜索的原理 相似图片搜索的原理(二) http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It. ...

最新文章

  1. 简述ospf的工作原理_全方位了解OSPF的工作原理以及涉及到的重要技术
  2. 工商企业管理对计算机水平的要求,对工商企业管理的分析
  3. C++之字节对齐与结构体大小
  4. oracle 数据执行计划,Oracle里常见的执行计划
  5. matlab漂亮图表,漂亮,美观的图表之Matlab强势回归~~~~走你8
  6. 为什么电脑安装不了python_windows电脑安装python教程
  7. Linux面试题附答案
  8. LibFetion v0.2.0版发布
  9. elasticsearch报错org.elasticsearch.discovery.MasterNotDiscoveredException: null
  10. 英语foteball足球
  11. mysql-sql操作
  12. Windows如何查看IIS访问IP记录
  13. apple 西单大悦城维修_如何检查Apple是否已召回MacBook(免费维修)
  14. scrapy框架爬取斗鱼女主播照片,依据颜值排行榜
  15. 计算字符串的相似度/华为机试(C/C++)
  16. 如何更新neovim以及安装指定版本
  17. 项目管理(二)项目阶段与项目生命周期
  18. 压缩png命令cmd_PNG图片文件大小怎么改变
  19. 一道[CSCCTF 2019 Qual]FlaskLight的详解再遇SSTI
  20. 《缠中说禅108课》84:本 ID 理论一些必须注意的问题

热门文章

  1. c语言陈湘骥答案,c语言程序设计实验指导答案陈湘骥
  2. python去掉左边的空格_Python去除字符串左边空格
  3. 转易语言-网页游戏辅助,网络游戏辅助,手游辅助开发技术教程
  4. 面向对象 重写和重载
  5. 根据日期参数查询润乾报表
  6. macos复制粘贴快捷键 快速_mac复制粘贴快捷键
  7. LPVOID和PVOID的区别是什么
  8. python url转码_URL转码,encodeURI,encodeURIComponent — 在线工具
  9. 美智库:马赛克战是人工智能与自主系统支撑的决策中心战
  10. M1芯片的Mac在开发iOS项目时遇到的问题汇总(模拟器无法运行,Cocoapods错误等)