邻域搜索算法(NS)

NS是一类非常常见的改进算法,在每次迭代时通过搜索当前解的“邻域”找到最优的解。邻域搜索算法设计中的关键时邻域结构的选择,即邻域定义的方式。根据以往的经验,邻域越大,局部最优解就越好,这样获得的全局最优解就越好。但是,与此同时,邻域越大,每次迭代搜索邻域所需的时间越长。出于这个原因,除非能够以非常有效的方式搜索较大的邻域,否则启发式搜索也得不到很好的效果。

官方解释:所谓邻域,简单地说即是给定点附近其他点的集合。在距离空间中,邻域一般被定义为以给定点为圆心的一个圆;而在组合优化问题中,邻域一般定义为由给定转化规则对给定的问题域上每结点进行转化所得到的问题域上结点的集合。

通俗讲:邻域就是指对当前解进行一个操作(这个操作可以称之为邻域动作)可以得到的所有解的集合。那么不同邻域的本质区别就在于邻域动作的不同了。

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

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

VLSN

对于一个邻域搜索算法,当其邻域大小随着输入数据的规模大小呈指数增长的时候,那么我们就可以称该邻域搜索算法为超大规模邻域搜索算法(VLSNA)。

一些超大规模的邻域搜索方法已经运用于运筹学之中了,并且取到了不错的成绩。例如,如果将求解线性规划的单纯算法看成邻域搜索算法的话,那么列生成算法就是一种超大规模的邻域算法,

此外,用于解决许多网路流问题的方法也可以归类为超大规模的邻域搜索算法。用于求解最小费用流问题的negative cost cycle canceling algorithm和用于求解分配问题的augmenting path algorithm,就是两个例子。

ALNS

ALNS是从LNS发展扩展而来的,在了解了LNS以后,我们现在来看看ALNSALNS在LSN的基础上,允许在同一个搜索中使用多个destroy和repair方法来获得当前解的邻域。

ALNS会为每个destroy和repair方法分配一个权重,通过该权重从而控制每个destroy和repair方法在搜索期间使用的频率。在搜索的过程中,ALNS和LNS不同的是,ALN通过使用多种destroy和repair方法,然后再根据这些destroy和repair方法生成的解的质量,选择那些表现好的destroy和repair方法,再次生成邻域进行搜索。

你可能感兴趣的:(算法,TSP问题)