回到主页

Local Search之自适应大邻域搜索算法

以解决TSP问题为例

一、旅行商问题(Traveling Salesman Problem)介绍

旅行商问题描述如下:假设有若干个城市,且任何两个城市之间的距离是确定的,现有一个旅行商人要拜访这些城市,要求旅行商从某城市出发,必须经过每个城市,且每个城市只能拜访一次,最后要回到出发的城市,问如何确定一条路线使路径长度最短。

详细介绍见blog:LocalSearch之爬山算法

 

二、LNS(Large Neighborhood Search)算法介绍

2.1 什么是LNS(Large Neighborhood Search)

大邻域搜索(Large Neighborhood Search,LNS)是由Shaw提出的元启发式算法,其邻域由破坏和修复方法隐式定义。破坏方法破坏当前解决方案的一部分,而修复方法重新生成已破坏的解决方案。破坏方法通常包含随机性元素,因此每次调用该方法时都会破坏解决方案的不同部分。

2.2 LNS一般过程

算法伪代码如下:

broken image

LNS算法中包含三个变量,变量xb记录目前为止获得的最优解,x则表示当前解,而xt是临时解。其中d(x)表示破坏解x的方法,r(x)则表示对破坏的解进行重新修复。

伪代码基本流程如下:

(1)读取输入的初始解;

(2)初始化全局最优解;

(3)重复以下步骤直到达到终止条件;

(4)用破坏修复算子获得新的解xt

(5)评估新解xt是否应该成为新的当前解;

(6)检查新的当前解是否优于全局最优解;

(7)若找到更好的解则对当前最优解进行更新;

(8)检查是否满足终止条件;

(9)返回找到的全局最优解。

从伪代码中可以看出,LNS元启发式不会搜索解决方案的整个邻域,而只是对该邻域进行采样。

2.3 破坏修复方法的选择

破坏方法是LNS启发式方法的重要组成部分。实现破坏方法时最重要的是选择破坏程度。如果解破坏程度较小,那么起不到大邻域的效果,启发式方法的探索性可能不足。如果解破坏程度较大,那么LNS几乎会退化为重复的重新优化,这可能非常耗时或产生质量差的解决方案,具体取决于修复解的方式。

在选择LNS的修复方法时,首先考虑的是修复方法是否应该采取最优策略。最优修复方法可能会比启发式方法操作慢,但可能在几次迭代中产生高质量的解决方案。然而,从多样化的角度来看,最优修复方法只对现有的可行解进行小部分改进,除非在每次迭代中对大部分解进行破坏。除了最佳修复方法外,还有基于特定问题的启发式修复方法、精确方法、通用混合整数规划或约束规划求解器。

 

三、ALNS(Adaptive Large Neighborhood Search)算法介绍

3.1 什么是ALNS(Adaptive Large Neighborhood Search)

自适应大邻域搜索(Adaptive Large Neighborhood Search,ALNS)是由Ropke与Pisinger在2006年提出的一种启发式方法,它通过允许在同一搜索过程中使用多种破坏和修复方法来扩展LNS启发式。每个破坏/修复方法都分配有一个权重,用于控制在搜索期间尝试该特定方法的频率。权重会随着搜索的进行而动态调整,以便启发式方法适应当前的实例和搜索的状态,使算法能够自动选择好的算子对解进行破坏与修复,从而有一定几率得到更好的解。

3.2 ALNS一般过程

算法伪代码如下:

broken image

相对于LNS的伪代码来说,ALNS的伪代码新增了第4行和第12行,并修改了第2行。Ω-和Ω+分别表示破坏和修复方法的集合。第2行中的ρ-和ρ+分别表示各个破坏和修复方法的权重集合。一开始时,所有的方法都设置相同的权重。

伪代码基本流程如下:

(1)读取输入的初始解;

(2)初始化全局最优解,初始化破坏修复方法的权重;

(3)重复以下步骤直到达到终止条件;

(4)在破坏修复方法的集合中用选取破坏修复方法;

(5)利用破坏修复方法来获得新的解xt

(6)确定该新解xt是否应该成为新的当前解;

(7)检查新的当前解是否优于全局最优解;

(8)若找到更好的解则对当前最优解进行更新;

(9)根据算子的表现调整破坏修复算子的权重;

(10)检查是否满足终止条件;

(11)返回找到的全局最优解。

初始状态下,破坏修复算子的权重初始化都为1,表示各个算子被选中概率相同。随着迭代的进行,算法会对算子的权重进行更新,在下一次循环,各个方法被选中的概率就会发生变化。在破坏和修复方法的集合中挑选破坏修复算子是根据轮盘赌的方式,权重向量ρ-和ρ+用于适用轮盘原理选择破坏和修复方法。该算法计算选择第j次破坏方法如下:

broken image

并且选择修复方法的概率以相同的方式确定。总的来说,权重越大,被选中的可能性越大。

权重大小是根据破坏和修复方法的在搜索过程中的表现进行动态调整的。在ALNS完成一次启发式迭代搜索以后,使用公式计算上次迭代中使用的破坏和修复方法的分数φ:

broken image

其中,ω1≥ω2≥ω3≥ω4≥0。

设a和b是分别是算法上次迭代中使用的破坏和修复方法的索引,ρ-和ρ+向量中所选破坏和修复方法对应的权重使用下列方程更新:

broken image

其中λ是衰减参数,λ∈[0,1],用于控制权重对破坏和修复方法性能变化的敏感程度,当前迭代中未使用的破坏修复方法权重保持不变。自适应权重调整的目的是选择适用于正在求解的实例的权重。

3.3 注意事项

上述例子中,ALNS算法为每种破坏和修复方法都分配了一个单独的权重。如果某一个破坏方法与一种修复方法配合使用对解的质量由较大提升,但该种破坏方法与其他修复方法结合的效果不太理想,此时可以采取将权重分配给组合成对的破坏修复方法。如果破坏方法产生的部分解与某种修复方法不兼容,例如当修复方法对解做出某种假设时,在这种情况下,可以使用耦合邻域。

3.4 ALNS算法设计

前面提到的在 LNS 启发式中选择破坏和修复方法的注意事项也适用于 ALNS 启发式算法。但是,ALNS 框架提供了一些额外的自由度,因为允许多种破坏修复方法。在ALNS启发式算法中,我们可以包括仅适用于某些情况的破坏修复方法,自适应权重调整将确保这些启发式方法很少用于无效的情况。因此,破坏和修复方法的选择可以变成寻找擅长多样化或强化的方法。

3.4.1 破坏算子的设计:

破坏方法的多样化和强化可以按如下方式完成:为了使搜索多样化,可以使用随机破坏法随机选择应破坏的部分。为了加强搜索,可以尝试删除具有较大成本的变量或破坏解决方案当前结构的变量,例如,在欧几里得TSP中相互交叉的边。这被称为最严重破坏或严重破坏。

还可以选择一些易于互换的相关变量,同时保持解决方案的可行性。对于CVRP,可以定义每对客户之间的相关性度量。该度量可以只是客户之间的距离,也可以包括客户需求,其中具有类似需求的客户被视为相关客户。因此,相关破坏方法将选择一组具有高度相互关联度量的客户

最后,可以使用基于历史的破坏,例如,历史信息可以计算给定变量或变量集的设置导致错误解决方案的频率。然后,可以根据历史信息尝试删除当前分配给不正确值的变量。

3.4.2 修复算子的设计:

集合Ω+中的修复方法通常基于给定问题的特定性能良好的启发式方法,这些启发式方法可以是贪婪范式的变体,也可以基于近似算法或精确算法。可以通过松弛精确算法,以牺牲解决方案质量为代价获得更快的求解时间。如前所述,通过惩罚耗时的方法,可以将耗时和快速修复方法混合使用。使用MIP求解器的优点是可以快速实施复杂应用程序的修复方法,一个潜在的缺点是需要额外注意破坏程度,否则修复可能会变得非常缓慢。

 

四、用ALNS算法解决TSP问题

4.1 基于Python库的代码实现

图4-1为ALNS的主函数,分别对应生成初始解、构建破坏修复算子、设置基本参数、运行输出结果。

broken image

图4-1 主程序代码

图4-2为TSP问题的定义类,用节点和边来定义,用各个边长之和构成TSP的目标函数。

broken image

图4-2 定义TSP问题及目标函数

图4-3为ALNS中的三种常见的破坏方法,分别为最差删除、路径删除和随机删除。并引入一个单独的参数作为破坏程度,来控制每个步骤中对解造成的破坏程度。上述例子中的破坏程度为0.1。

broken image

图4-3 ALNS中的三种常见破坏方法

图4-4为ALNS中的修复方法,即贪婪修复。贪婪修复是在当前未访问的节点中,找一个离当前解最近的点做一个修复。

broken image

图4-4 ALNS中的常见修复方法

4.2实验结果如下:

首先初始化生成一个可行的解决方案,如图4-5所示。

broken image

图4-5 初始化一个可行解

运行程序得到的解决方案如图4-6所示。

broken image

图4-6 实验结果

以上代码使用ALNS为TSP实现了一个非常简单的启发式方法。在没有对ALNS中可用的各种超参数进行过多的修改的情况下,也得到了一个非常好的结果,仅比最佳路径差2%。

五、小结

本文对LNS和ALNS进行了深入的描述,简要解释了ALNS的核心概念。并结合实例,在Python中运用ALNS解决TSP问题。

【囿于作者的学术水平,本文的诸多表述或许不够严谨,用途仅限于优化算法入门者的非正式学术交流,不足之处还望各位读者指正。】

 

 

参考文献

[2] ALNS Development Team. (2021). A brief introduction to ALNS. [Online] Available: https://alns.readthedocs.io/en/latest/setup/introduction_to_alns.html [Accessed: 30 September 2021].

[3] ALNS Development Team. (2021). Heuristic solution. [Online] Available: https://alns.readthedocs.io/en/latest/examples/travelling_salesman_problem.html#Heuristic-solution [Accessed: 30 September 2021].

 

作者:张亦迅

校对:丁子千