定义:变邻域搜索算法(VNS)就是一种改进型的局部搜索算法。它利用不同的动作构成的邻域结构进行交替搜索,在集中性和疏散性之间达到很好的平衡。其思想可以概括为“变则通”。
变邻域搜索算法依赖于以下事实:
1)一个邻域结构的局部最优解不一定是另一个邻域结构的局部最优解。
2)全局最优解是所有可能邻域的局部最优解。
变邻域搜索算法主要由以下两个部分组成:
邻域:邻域就是指对当前解进行一个操作(这个操作可以称之为邻域动作)可以得到的所有解的集合。那么不同邻域的本质区别就在于邻域动作的不同了。
邻域动作:邻域动作是一个函数,通过这个函数,对当前解s,产生其相应的邻居解集合。例如:对于一个bool型问题,其当前解为:s = 1001,当将邻域动作定义为翻转其中一个bit时,得到的邻居解的集合N(s)={0001,1101,1011,1000},其中N(s) ∈ S。同理,当将邻域动作定义为互换相邻bit时,得到的邻居解的集合N(s)={0101,1001,1010}。
VARIABLE NEIGHBORHOOD DESCENT (VND):
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。
当在本邻域搜索找不出一个比当前解更优的解的时候,我们就跳到下一个邻域继续进行搜索。如图中虚黑线所示。
当在本邻域搜索找到了一个比当前解更优的解的时候,我们就跳回第一个邻域重新开始搜索。如图中红线所示。
shaking procedure:
是一个扰动算子,类似于邻域动作的这么一个东西。通过这个算子,可以产生不同的邻居解。扰动、抖动、邻域动作这几个本质上还是没有什么区别的。都是通过一定的规则,将一个解变换到另一个解而已。
本文转载自:
https://mp.weixin.qq.com/s?__biz=MzU0NzgyMjgwNg==&mid=2247484621&idx=1&sn=f2e92f44c2306b58034cf158647bc737&chksm=fb49c974cc3e406228737e1a986c73368131bc7f0c0251d82b1e64266220df59134ab0a9def1&mpshare=1&scene=1&srcid=0828EK2xkjxczX8dMch3ud66&sharer_sharetime=1566963711577&sharer_shareid=054592193644de509623829748e83807&key=d4d627468bf29e729a37d96e9420f75ae8ee07d92976b165df3762d4a0bf2e01a06e3591d4793592a5980676c1d1668f96fe3e822792af675cd35f1752c460bc5edec3bfc0549fe8ec7273a4243355f3&ascene=1&uin=MjYzMDA1MzAyMQ%3D%3D&devicetype=Windows+10&version=62060834&lang=zh_CN&pass_ticket=mKdxom8osJJZb4ixH2eELB08AKAMdUQR7xMY0nJhEcpBIeHmtdQToh3Nk47Aacno