启发算法也是一大类算法,本文注重算法本身,对应用领域不多赘述;

先看下 启发算法 的大体分类

智能优化算法汇总:https://mp.weixin.qq.com/s/ANKWZsJba6upC3bhequHsg

 

邻域搜索算法-总体

邻域搜索

NS,Neighborhood Search,邻域搜索算法,也称局部搜索算法,其衍生了各种各样的搜索算法,是一类应用广泛的改进算法,其

核心思想:在每次迭代中,搜索当前解的邻域得到更多的解集合,并根据一定的策略选择一个更优的解;

关键步骤:通过设计合理高效的邻域动作,生成更好的邻域结构,得到更好的邻域

 

邻域动作

邻域动作是一个函数,通过这个函数,对当前解s,产生其相应的邻居解集合。

例如:对于一个bool型问题,其当前解为:s = 1001,当将邻域动作定义为翻转其中一个bit时,得到的邻居解的集合N(s)={0001,1101,1011,1000},其中N(s) ∈ S。

同理,当将邻域动作定义为互换相邻bit时,得到的邻居解的集合N(s)={0101,1001,1010}

 

邻域搜索算法比较分析

局部邻域搜索,局部搜索,会陷入局部最优;

解决局部最优的思想有

1.以可控概率接受 劣解,如 模拟退火算法;

2.扩大邻域搜索结构,如 变邻域搜索算法;

3.以一种固定的策略避免迂回搜索,循环搜索,如 禁忌搜索算法、大规模邻域搜索算法;

模拟退火算法,一种邻域搜索算法,但是他只使用了 一种邻域,因此他仅仅搜索了解空间的很小一部分,这样快,但是找到全局最优的概率较低,他的优势是 避免陷入局部最优

变邻域搜索算法,采用了 多种邻域 或者 变化的邻域,大大提高了搜索范围,这样更有利于找到最优解,但是 盲目地扩大范围 会导致计算量过大;

禁忌搜索算法,采用 禁忌策略 来 避免盲目搜素 和 迂回搜索;

自适应大邻域搜索算法,也弥补了 盲目扩大的不足,他根据算子的 历史表现与使用次数 选择下一次迭代使用的算子,通过算子间的相互竞争来生成当前解的邻域结构,而在这种结构中有很大概率能够找到更好的解;

 

局部邻域搜索

LS,Local Search, 

基于贪婪思想 持续在当前解的 邻域中 寻找更优解;

算法通俗易懂,容易实现;但会陷入局部最优;

 

变邻域搜索

VNS,Variable Neighborhood Search,一种局部搜索算法,顾名思义,通过 变化 的邻域结构 来 寻找更优解 的过程,也可以理解为 多邻域搜索,

 

VNS 基于两个事实

一个邻居结构的局部最优解不一定是另一个邻域结构的局部最优解;

全局最优解是所有可能邻域的局部最优解;

 

VNS算法由两部分组成

VARIABLE NEIGHBORHOOD DESCENT (VND)

SHAKING PROCEDURE

 

VARIABLE NEIGHBORHOOD DESCENT (VND)

VND 其实是一个算法框架,伪代码如下

下图来解释一下伪代码

 

SHAKING PROCEDURE

就是一个扰动算子,类似于邻域动作的这么一个东西。通过这个算子,可以产生不同的邻居解。

虽然名词很多看起来很高大上,扰动、抖动、邻域动作这几个本质上还是没有什么区别的。都是通过一定的规则,将一个解变换到另一个解而已。

 

VNS 伪代码

伪代码中N_k和N_l代表的邻域集合,分别是给Shaking和VND使用的,这两点希望大家要格外注意,区分开来哈。

这两个邻域集合可以是一样的,也可以不一样。 

 

下图来解释一下伪代码

 

大规模邻域搜索

LNS,Large Neighborhood Search,

大多数邻域搜索算法都 明确 定义了邻域,但 LNS 中邻域靠 destroy破坏 和 repair修复 算子 来 隐式定义,

destroy 算子 会 破坏当前解,而 repair 算子 会进行修复,以生成更多的解集合,

LNS 就是 反复进行 destroy 和 repair,重点在于如何设计 destroy 和 repair 算子。

 

通俗解释 - 摘自参考文献

小编以5个城市的TSP问题为例讲解,假设初始解是12345。

第一步,我们对这个初始解使用destroy方法,小编使用最基本的随机选择几个城市的方法对初始解进行破坏,例如选择2和5,那么就把2和5这俩个城市从初始解拿掉,剩下的城市按照初始顺序依次排列,则变成134;
第二步,我们使用repair方法对destroy后的解进行修复,即对134这个解进行修复,也就是将2和5这两个城市重新安排进134当中,这里可以从2和5种随机选择一个城市插入到134中,
比如说我们选择2插入到134中,一共有3种可能:
2134、1234、1324(1342和2134效果相同,故不重复),从这3个可能解中选择一个最好的,比如说1324最好,那我们就选择1324,
然后再将5插入到1324中,则有4种可能:51324、15324、13524、13254,然后从这4个解中选择一个最好的解。
当然小编讲解的都是最最最基本的destroy和repair思想。

 

过程大致如下图

 

伪代码如下

 

自适应大规模邻域算法

ALNS,Adaptive Large Neighborhood Search,是由 Ropke与Pisinger 在2006年提出的一种启发式方法,

其在邻域搜索的基础上增加了对算子的作用效果的衡量,使算法能够自动选择好的算子对解进行破坏与修复,从而有一定几率得到更好的解。

 

禁忌搜索算法

TS,Tabu Search or Taboo Search,最早由美国工程院院士Glover教授于1986年提出,并在1989年和1990年对该方法做出了进一步的定义和发展;

禁忌搜索算法以其灵活的存储结构和相应的禁忌准则来避免迂回搜索

基本思想:TS 模仿人类的记忆功能,对于不久前进行的操作、求解过程、找到的局部最优解会记下来,接下来会避免这些“热门”操作,执行那些“冷门”操作,防止循环执行“同一操作”陷入“反复”或者局部最优;

 

主要构成

1.评价函数:

2.邻域动作:

3.停止规则:

4.禁忌表重点关注

禁忌表由 禁忌对象禁忌长度组成;

禁忌对象可人为设定,一般为 邻域动作算子 或者 移动操作;禁忌对象代表 接下来的 搜索将 避开这些对象;

禁忌长度代表 禁忌对象的 禁忌时长 或者 迭代次数,禁忌长度短,容易陷入局部最优,禁忌长度长,搜索时间变长;

禁忌表的更新涉及 步长更新策略 两个概念;

禁忌表是禁忌搜索算法的核心,禁忌表的对象、步长及更新策略在很大程度上影响着搜索速度和解的质量。

若禁忌对象不准确或者步长过小,算法避免陷入局部最优的能力会大打折扣;若禁忌表步长过大,搜索区域将会限制,好的解就可能被跳过

5.破禁准则:也叫 特赦准则,对于禁忌表的适度放松。

当某个被禁忌的 移动(禁忌对象) 可得到优于 未被禁忌的移动 得到的最优邻域解 和 历史所得到的最优解 时,算法应接受该移动,不受禁忌表的限制。

通俗讲就是 我牛逼,不受禁忌表的限制;
 
有人实验得出如下结论
禁忌策略大大加强了算法的搜索能力
问题规模较小时,禁忌搜索能得到最优解;
问题规模较大时,禁忌搜索能在规定时间内输出满意解。
禁忌对象的选择对算法效果存在较大影响

 

算法流程

下面的流程图 是 以 移动 作为 禁忌对象的

 

贪婪随机自适应搜索算法

待完善 

 

 

 

其他摘录

《_基于深度强化学习的无人物流车队配送路径规划研究》

 

 

 

 

参考资料:

https://blog.51cto.com/u_15057852/2672268  大规模邻域搜索算法(LNS)通俗讲解    这篇博客下方有很多 邻域搜索算法 的解释,可供参考

https://blog.51cto.com/u_15057852/2672269  变邻域搜索算法通俗讲解

https://blog.51cto.com/u_15057852/2672270  禁忌搜索算法通俗讲解版

https://blog.51cto.com/u_13294304/2955392  10分钟彻底理解自适应大邻域搜索算法

 

https://www.jianshu.com/p/2108fecf7d69  变邻域搜索(VNS)  简书

https://blog.csdn.net/u011005745/article/details/108051760  局部搜索:变邻域搜索(Variable Neighbourhood Search, VNS)解决TSP问题的python案例

 

http://blog.sina.com.cn/s/blog_4c03d89d010007mr.html  禁忌搜索算法  理论较强

https://www.jianshu.com/p/77b754532de4        禁忌搜索算法(Tabe Search,TS))  简书

https://zhuanlan.zhihu.com/p/158773735          禁忌搜索算法             知乎 理论

https://blog.csdn.net/qq_44384577/article/details/105190912  禁忌搜索算法(Tabu Search)的基本原理与算法流程总结  【这篇貌似有更多理论,可以看看

 

https://blog.csdn.net/Rivalsx/article/details/88765527?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-3.no_search_link&utm_relevant_index=6  干货 | 自适应大邻域搜索(Adaptive Large Neighborhood Search)入门到精通超详细解析-概念篇

https://blog.csdn.net/zll_hust/article/details/105006607   干货|自适应大邻域搜索(ALNS)算法求解带时间窗的车辆路径规划问题(附java代码)

 

https://blog.csdn.net/Xiao13Yu14/article/details/45490579  GRASP:Greedy Randomized Adaptive Search Procedures 贪心随机自适应搜索算法的基本思想

https://www.jianshu.com/p/d2dd96e620ff  基本同上个

https://www.zhihu.com/people/qu-qian-ying-95-14/posts  一个博士的知乎,讲得一般般,可以看看