论文VARIABLE NEIGHBORHOOD SEARCH
伪代码:
变邻域搜索算法(VNS)就是一种改进型的局部搜索算法。它利用不同的动作构成的邻域结构进行交替搜索,在集中性和疏散性之间达到很好的平衡
- 目标函数:用来判断解的优劣。
- 邻域的定义:根据不同问题,有着不同的邻域定义。
- 初始解的产生方法。
- 新解的产生和接受规则。
- 算法终止条件。
主要由以下两个部分组成: - VARIABLE NEIGHBORHOOD DESCENT (VND) 变邻域下降搜索
- SHAKING PROCEDURE 抖动过程
在组合优化问题中,邻域一般定义为由给定转化规则对给定的问题域上每结点进行转化所得到的问题域上结点的集合,通俗一点:邻域就是指对当前解进行一个操作(可以称之为邻域动作)得到的所有解的集合。不同邻域的本质区别就在于邻域动作的不同。邻域动作是一个函数,通过这个函数,对当前解s,产生其相应的邻居解集合。
VND其实就是一个算法框架,它的过程描述如下: - 给定初始解S; 定义m个邻域,记为N_k(k = 1, 2, 3…m);i = 1。
- 使用邻域结构N_i(即 N_i(S))进行搜索,如果在N_i(S)里找到一个比S更优的解S′,则令S=S′, i=1
- 如果搜遍邻域结构N_i仍找不到比S更优的解,则令i++。
- 如果i≤m ,转步骤2。
- 输出最优解S。
我的理解是:选择m种邻域生成策略,对于解x分别应用,生成m个邻域,从第一个邻域开始进行本地搜索,选择一个解作为全局最优解x’’,将这个邻域中的所有解x‘的集合看做是一个初始种群,利用不同的启发式算法,选择不同的交叉变异算子作为抖动,将种群中找到的最优解代替x’,如果没有比最优解更好的解,就转向下一个邻域进行搜索。
c++的代码在第四个网址中。
第五篇文章是我找到的精华,不同于大流的复制粘贴,其中有部分python代码,难得
变邻域搜索一般应用于单目标搜索,因此可以将多目标处理按照第六篇文章中的方法进行处理
参考
1 https://www.cnblogs.com/dengfaheng/p/10852917.html
2 https://mp.weixin.qq.com/s/Z9-WmHl4hg7vhCyd9WDTOQ
3 https://blog.csdn.net/Rivalsx/article/details/90159859
4https://www.jianshu.com/p/057f01cd181autm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
5 https://blog.csdn.net/u011005745/article/details/108051760
6 https://wenku.baidu.com/view/b730777a0540be1e650e52ea551810a6f524c8fb.html