目录
在篇1中我们提到,算法很多,但是最经典的有8种,分别是:遗传算法、禁忌搜索算法、模拟退火算法、粒子群算法、蚁群算法、以及邻域搜索中的迭代邻域搜索算法、变邻域搜索算法、自适应大规模邻域搜索算法。前面5种篇1中已有表述,本篇对后面3种做下总结。
这些算法有人叫智能算法,有人叫启发式算法,有人叫元启发式算法等等,其实都可以。
1.种群算法和邻域算法的区别与联系
我之所以分为上下两篇,是因为在我的理解中,前面5种特点比较明确,后面3种本质是邻域,是对邻域的不同动作而产生的算法。当然,我还想补充两点。
(1)可以把禁忌搜索算法拿过来,放在后面3种的邻域类中也完全说的通。
(2)前面几种最醒目的点在于,退火是模拟退温,对劣解以一定的概率接受;遗传是基于自然界遗传交叉变异而产生的;禁忌搜索的本质是设置禁忌表防止陷入局部最优;粒子群是学习全体最优和当前最优;蚁群是仿照蚂蚁信息素的思维。本质上是框架搭建。
但是,解在变换的过程中,也就是产生新解,其实本质都是“邻域”或者说“算子”,这点是相通的,对吗?
邻域就是一个解生成别的解的过程。这点是通用的。具体怎么生成,邻域生成就是我们设计的关键所在。
现在的理解是以上这些,如果之后发现理解有误,我会回来修改。也希望看到自己理解的偏差,这样自己就永远在进步了。
2.算法原理总结
本篇我们对大邻域算法做一个总结。
其实,对于邻域的基础知识在禁忌搜索里有提到,它是后3种算法的基础。而且因为邻域算法的难度涉及到具体的操作,所以相对比之前者稍微难些。
2.1 变邻域搜索算法VNS
变邻域搜索算法是对局部搜索算法的一种改进,是一种改进型的局部搜索算法。和自适应大邻域搜索属于不同的体系,但属于邻域的大家族——完整介绍见这篇。
变邻域搜索算法的主要思想是:采用多个不同的邻域进行系统搜索。首先采用最小的邻域搜索,当无法改进解时,则切换到稍大一点的邻域。如果能继续改进解,则退回到最小的邻域,否则继续切换到更大的邻域。
2.2 自适应大邻域搜索算法ALNS
尽管大型邻域搜索技术中(如变邻域搜索算法)通过在当前解的多个邻域中寻找更满意的解,能够大大提高算法在解空间的搜索范围。但它有一个巨大的问题,那就是:它在使用算子时盲目地将每种算子形成的邻域结构都搜索一遍(发现有改进,就退回到最小的邻域从新搜索),缺少了一些启发式信息的指导且时间成本较高。
这是官方的伪代码,注意,这里并没有出现权重更新——自适应大邻域搜索算法(Adaptive Large Neighborhood Search——ALNS)。
(补充的权重更新)
自适应大邻域搜索算法弥补了这种不足,首先ALNS算法允许在一次搜索中搜索多个邻域,它会根据算子的历史表现与使用次数(会根据表现和使用次数,进行权重更新,同时权重更新的时候,会考虑类似蚁群的挥发系数)选择下一次迭代使用的算子,通过算子间的相互竞争(本质是轮盘赌选择)来生成当前解的邻域结构,而在这种结构中有很大概率能够找到更好的解。
在权重更新的时候,并不是每次选择destroy和repair算子都会更新,而是需要每隔一定迭代次数后(内循环结束后),权重才会更新。如是每次迭代都更新权重,那么对于本身随机性较强的ALNS,每次更新这种操作会放大这种随机性,就可能会出现差的那组算子组合的选择概率会一直被提高,好的算子组合概率迟迟不被提高。
通常的做法是:在迭代中设置有一个内循环和外循环(迭代次数),只有内循环结束时,才会进行权重更新,既降低了这种随机性,也综合多次的选择结果,不会降低算法的总体性能。
这种方法,国内用的人不太多。我在论文中看到有的人设计8种破坏算子和10种修复算子,甚至更多。