变领域搜索算法
变邻域搜索算法(Variable Neighborhood Search,VNS)
作者福建农林大学在读计算机科学与技术研究生,研究方向智能计算与机器学习。微信公众号 小平讲算法
由于最近项目中需要用到变邻域搜索算法,但是网上关于 VNS 的介绍太少,所以我打算自己写一个关于变领域搜素算法(VNS)的博客.
1. 什么是变邻域搜索算法(VNS)
VNS是局部搜索算法的一种,局部搜索算法可以用来求解一些函数的极小值,但不一定能求到该函数的最小值。那为什么我们要用局部搜索算法呢,因为有些函数它的计算量可能很大,是维数灾难型 的,即在涉及到向量的计算的问题中,随着维数的增加,计算量呈指数倍增长的一种现象。而局部算法目的就是在尽可能短的时间内求一个近似最优解的极小值。话不多说,接下来介绍文章中的正角。
Markdown编辑器
2. VNS的结构
VNS主要由以下两个部分组成:
- 变邻域下降(variable neighborhood descent (VND)) ;
- 邻域扰动(shaking procedure)产生新的邻域结构 ;
2.1 VND
这个VND和VNS到底有什么区别,我搞了好久才弄明白,它的算法框架是这样的:
- 定义初始解s,定义邻域范围(即邻域解个数M),记作Nk(k=1,2,3,…,M);
- 用初始解(当前解)开始搜索,直到陷入局部最优解N1(或Nk);
- 如果N1优于s(或者Nk优于s),令s=N1(或s=Nk)。否则k++;
- 如果k<M,转步骤2;
- 输出最优解。
借用网上的图
2.2 shaking procedure
就是用一个扰动算子进行扰动操作,产生不同的领域解结构,其实和VND中的第二步一样。VND其实可以理解成一个爬山算法操作,我是这样理解的。
比如有一个s领域结构(1,2,3,4)你要进行爬山算法,只能在该序列基础上进行两两交换则有6种情况 (2,1,3,4),(3,2,1,4),(4,2,3,1),(1,3,2,4),(1,4,3,2),(1,2,3,4) 。然后你可以对s领域结构产生一个扰动,比如(2,3,1,4),接着你在用爬山算法。这个爬山算法可以理解为那个VND操作。
2.3 VNS
在前面讲述了VDN和shaking procedure过程之后,VNS可以描述为以下步骤:
- 产生初始解S;
- 对初始解进行shaking procedure,得到邻域解S1;
- 对S1进行VND操作,得到邻域解S2;
- 如果达到停止条件,则结束算法,否则跳回第二步。
伪代码
3. 小结
对于闭环设施布局,h,v可以当作当作VDN的领域个数,然后针对每个h,v的排列采用爬山算法,就是一个VDN算法了