本文发布于公众号【数据魔术师】同名文章。欢迎给我们留言、私信进行交流
01前言
我们的标题相信大家已经看到了,至于这是什么东西呢?咳咳,这可不是一起去你邻居家找茬的啊……
言归正传,关于大邻域搜索这一块的启发式算法,国内还算比较少的了。那么,今天我们一起来一步一个脚印来了解这个神秘的算法吧。
01 概念科普篇
关于neighborhood serach,这里有好多种衍生和变种出来的胡里花俏的算法。大家在上网搜索的过程中可能看到什么Large Neighborhood Serach,也可能看到Very Large Scale Neighborhood Search或者今天介绍的Adaptive Large Neighborhood Search。
对于这种名字相近,实则大有不同的概念,很是让新手头疼。不过为了防止大家混淆这些相近的概念,今天这里一并介绍了吧。
总体关系可以看下图
当一个邻域搜索算法搜索的邻域规模随着算例规模的增大而呈指数增长,或者邻域太大而不能在实际中明确搜索时,我们把这类邻域搜索算法归类为Very Large-Scale Neighborhood Search(VLSN)。
VLSN又可以分为三类:[1]
- Variable-depth methods
- Network-flows based improvement algorithms
- Efficiently solvable special cases
而Large Neighborhood Search(LNS) 则不属于以上三种类型,但它确实是属于VLSN这种类型的,因为它搜索的是一个非常大的邻域。
最后呢,是Adaptive Large Neighborhood Search(ALNS),它是根据Large Neighborhood Search(LNS) 算法扩展和延伸而来(嗯,相当于爸爸和儿子的关系……)。
由于文章篇幅呢,这里就不给大家一一介绍了。具体内容可以看文章后面给出的参考文献。下面给大家科普几个必要的概念。
1.0 什么是Neighborhood Search(NS)
邻域搜索算法(或称为局部搜索算法)是一类非常常见的改进算法,其在每次迭代时通过搜索当前解的“邻域”找到更优的解。 邻域搜索算法设计中的关键是邻域结构的选择,即邻域定义的方式。 根据以往的经验,邻域越大,局部最优解就越好,这样获得的全局最优解就越好。 但是,与此同时,邻域越大,每次迭代搜索邻域所需的时间也越长。出于这个原因,除非能够以非常有效的方式搜索较大的邻域,否则启发式搜索也得不到很好的效果。[2]
什么又是邻域呢?
这里不得不再次带大家回顾一下以前的知识:
官方