变邻域搜索(Variable Neighborhood Search,VNS)

干货 | 变邻域搜索算法(Variable Neighborhood Search,VNS)超详细一看就懂

变邻域搜索

介绍
变邻域搜索算法(VNS)是一种改进型的局部搜索算法。它利用不同的动作构成的邻域结构进行交替搜索,在集中性和疏散性之间达到很好的平衡。

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

  1. 一个邻域结构的局部最优解不一定是另一个邻域结构的局部最优解。
  2. 全局最优解是所有可能邻域的局部最优解。

变邻域搜索算法主要由变邻域下降搜索(VND)和扰动过程两个部分组成

变邻域下降VND
伪代码

VND伪代码

  1. 给定初始解S; 定义m个邻域
  2. 使用邻域结构Ni进行搜索,如果在找到一个比S更优的解S′,则令S=S′, i=1
  3. 如果搜遍邻域结构Ni仍找不到比S更优的解,则令i++。
  4. 如果i≤m ,转步骤2。
  5. 输出最优解S

示意图

VND示意图

  • 当在本邻域搜索找不出一个比当前解更优的解的时候,我们就跳到下一个邻域继续进行搜索。如图中虚黑线所示。
  • 当在本邻域搜索找到了一个比当前解更优的解的时候,我们就跳回第一个邻域重新开始搜索。如图中红线所示
扰动过程

通过一定的规则,将一个解变换到另一个解

VNS过程

伪代码

VNS伪代码
伪代码中Nk和Nl代表的邻域集合,分别是给Shaking和VND使用的

干货 | 变邻域搜索算法解决0-1背包问题(Knapsack Problem)代码实例

  • 邻域动作1:将解决方案selection[n]的第i位取反(i=1,2,3,4……n)
  • 邻域动作2:对于解决方案selection[n],在第i (i=1,2,3,4……n)位取反的情况下,依次将第j (j=i+1,2,3,4……n)位也取反
  • 邻域动作3:交换第i位和第i-3位的数。如果i<3。就交换最后的
  • shaking过程:随机取反一些位

干货 | 变邻域搜索算法(VNS)求解TSP(附C++详细代码及注释)
VND邻域示意图

two-opt-swap

two-h-opt-swap

论文拾萃 | 基于树表示法的变邻域搜索算法求解考虑后进先出的取派货旅行商问题(附C++代码和详细代码注释)
考虑后进先出的取派货旅行商问题问题描述
假设车辆从起点(depot)出发去完成所有任务,每个任务分别对应着一个位于不同地理位置的取货点和派货点,需要制定一条路线来保证总费用最小。其中,从起点出发提供服务的车辆只有一辆;车辆必须先到达取货点获得货物才能去派货点;车辆装卸货时必须服从后进先出原则
使用树表示法的变邻域搜索算法求解考虑后进先出的取派货旅行商问题
伪代码

伪代码
算法大体框架采用变邻域搜索和遗传算法结合

  • 步骤1,设置最大迭代次数max_iter、最大无改进迭代次数max_nonimproving、种群大小pop_size等参数;

  • 步骤2,新建大小为pop_size的种群population(即新建大小为pop_size的数组);

  • 步骤3,初始化当前最好解S_best;

  • 步骤6-8,初始化种群population(即将个体S_best执行pop_size次扰动操作);

  • 步骤10-18,对种群population的每个个体使用局部搜索算子、ATSP算子、交叉算子crossover进行搜索;函数local_search()使用了5种邻域搜索算子,就是前文提到的Variable neighborhood Descent阶段;

  • 步骤19-24,更新当前解S_current和全局最好解S_best;步骤25-27,对种群population使用扰动算子perturbation进行一定的扰动

  • 函数local_search()采用的5种搜索算子

  1. 子树移位算子:随机删除原树中的一棵子树,遍历插入到树中的任意节点下,邻域为所有子树移位可能得到的解的集合。如下图所示,图(a)、(b)分别为初始解和经过子树移位后的解。


    子树移动算子
  2. 子树交换算子:随机选择原树中的两棵子树并交换他们的位置。邻域为子树交换算子完全遍历能得到的解的集合。如下图所示,图(a)、(b)分别为初始解和经过子树交换后的解。


    子树交换算子
  3. 节点移位算子:随机删除原树中的一个节点,遍历插入到树中的任意节点下。邻域为节点移位算子完全遍历能得到的解的集合。如下图所示,图(a)为初始解,删除节点x后将其作为节点0的子节点可以有4种情况,即如图(c),(d),(e)和(f)。


    节点移位算子
  4. 节点交换算子:随机选择原树中的两个节点并交换它们的位置。
  5. 混合移位算子:随机删除原树中的若节点,随机插入到树中的任意位置
  • ATSP算子:随机选择原树中的一个节点,如果此节点的子节点数目小于8,则使用穷举法优化子节点服务顺序;否则使用RAI算法进行搜索(即从此节点的子节点集合中随机踢出若干节点,再使用贪婪算法进行插入)
  • 交叉算子crossover:随机删除原树T1中的一棵子树Ts,然后根据树T2中的父子关系将删除子树Ts中的节点以贪婪的规则插回到原树T1中
  • 扰动算子perturbation:随机删除原树T1中的一棵子树,然后利用贪婪算法将删除子树中的节点插回到原树T1中

干货|变邻域搜索(VNS)算法求解Max-Mean Dispersion Problem(附代码及详细注释)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,002评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,777评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,341评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,085评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,110评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,868评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,528评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,422评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,938评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,067评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,199评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,877评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,540评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,079评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,192评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,514评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,190评论 2 357

推荐阅读更多精彩内容