VNS-变邻域搜索算法

1. 局部搜索简介:

1.1 基础概念:

局部搜索是解决优化问题的一种启发式算法。对于某些计算起来非常复杂的优化问题,比如各种NP-难问题,要找到最优解需要的时间随问题规模呈指数增长,因此诞生了各种启发式算法来退而求其次寻找次优解,是一种近似算法,以时间换精度的思想。局部搜索就是其中的一种方法。

局部搜索算法是对一类算法的统称,符合其框架的算法很多,比如PSO、爬山法、模拟退火算法和禁忌搜索算法都属于局部搜索算法。尽管各个算法在优化过程中的细节存在差异,但在优化流程上呈现出很大的共性。

它的基本原理是在邻近解中迭代,使目标函数逐步优化,直至不能再优化为止。

1.2 局部搜索的过程:

我们可以将局部搜索算法的统一框架描述为:

1) 算法从一个或若干个初始解出发。

2) 在算法参数控制下由当前状态的邻域中产生若干个候选解。

3) 以某种策略在候选解中确定新的当前解。

4) 伴随控制参数的调节,重复执行上述搜索过程,直至满足算法终止条件。

5) 结束搜索过程并输出优化结果。

1.3 局部搜索的几大要素:

局部搜索算法主要包含五大要素:

1) 目标函数:用来判断解的优劣。

2) 邻域的定义:根据不同问题,有着不同的邻域定义。

3) 初始解的产生方法。

4) 新解的产生和接受规则。

5) 算法终止条件。

其中前两个要素的定义和算法要解决的特定问题有关,而且不同的人对同一问题可能有完全不同的定义。

后三个要素定义的不同则会产生各种不同的局部搜索算法,它们的效率和最终解的质量也会有很大的差异。

2. 变邻域搜索算法:

2.1 VNS介绍

变邻域搜索算法(VNS)就是一种改进型的局部搜索算法。它利用不同的动作构成的邻域结构进行交替搜索,在集中性和疏散性之间达到很好的平衡。其思想可以概括为“变则通”。

变邻域搜索算法依赖于以下事实:

1) 一个邻域结构的局部最优解不一定是另一个邻域结构的局部最优解。

2) 全局最优解是所有可能邻域的局部最优解。

变邻域搜索算法主要由以下两个部分组成:

1) VARIABLE NEIGHBORHOOD DESCENT (VND) 变邻域下降

2) SHAKING PROCEDURE 震荡程序

2.2 邻域介绍

邻域,简单的说即是给定点附近其它点的集合。

在距离空间中,邻域一般被定义为以给定点为圆心的一个圆;

在组合优化问题中,邻域一般定义为由给定转化规则对给定的问题域上每结点进行转化所得到的问题域上结点的集合。

通俗一点:邻域就是指对当前解进行一个操作(这个操作可以称之为邻域动作)可以得到的所有解的集合。那么不同邻域的本质区别就在于邻域动作的不同了。

2.3 邻域动作介绍

邻域动作是一个函数,通过这个函数,对当前解s,产生其相应的邻居解集合。例如:对于一个bool型问题,其当前解为:s = 1001,当将邻域动作定义为翻转其中一个bit时,得到的邻居解的集合N(s)={0001,1101,1011,1000},其中N(s) ∈ S。同理,当将邻域动作定义为互换相邻bit时,得到的邻居解的集合N(s)={0101,1001,1010}。

2.4 VND介绍

VND其实就是一个算法框架,它的过程描述如下:

1) 给定初始解S; 定义m个邻域,记为N_k(k = 1, 2, 3......m);i = 1。

2) 使用邻域结构N_i(即 N_i(S))进行搜索,如果在N_i(S)里找到一个比S更优的解S′,则令S=S′, i=1 。

3) 如果搜遍邻域结构N_i仍找不到比S更优的解,则令i++。

4) 如果i≤m ,转步骤2。

5) 输出最优解S。

VND图解如下:

1) 当在本邻域搜索找不出一个比当前解更优的解的时候,我们就跳到下一个邻域继续进行搜索。如图中虚黑线所示。

2) 当在本邻域搜索找到了一个比当前解更优的解的时候,我们就跳回第一个邻域重新开始搜索。如图中红线所示。

之前我们把局部搜索比作爬山的过程,那么每变换一次邻域,也可以理解为切换了搜索的地形(landscape)。效果如下 :

伪代码如下:

第一个红框:当在本邻域搜索找到了一个比当前解更优的解的时候,我们就跳回第一个邻域重新开始搜索。所以令k=1,表示第一个邻域。

第二个红框:当在本邻域搜索找不出一个比当前解更优的解的时候,我们就跳到下一个邻域继续进行搜索。所以令k=k+1,表示下一个邻域。

2.5 震荡程序介绍

一个扰动算子,类似于邻域动作的这么一个东西。通过这个算子,可以产生不同的邻居解。虽然名词很多看起来很高大上,扰动、抖动、邻域动作这几个本质上还是没有什么区别的。都是通过一定的规则,将一个解变换到另一个解而已。

2.6 VNS过程

伪代码如下:

在上面VND伪代码的基础上,套了一层震荡程序,震荡程序遍历所有1 - k_max个邻域,每次随机选出一个解,作为VND的初始解。

伪代码中N_k和N_l代表的邻域集合,分别是给Shaking和VND使用的,这两点要格外注意区分开来。这两个邻域集合可以是一样的,也可以不一样。

参考资料:

变邻域搜索算法:https://mp.weixin.qq.com/s/Z9-WmHl4hg7vhCyd9WDTOQ

变领域搜索算法2:https://zhuanlan.zhihu.com/p/387454457

  • 34
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值