LKH(小时)
2.0.10版(2022年11月)

丹麦形象

LKH是Lin-Kernighan启发式算法在求解旅行商问题中的有效实现。

计算实验表明,LKH是高效的。尽管算法是近似的,但最优解的产生频率非常高。LKH为我们能够获得的所有已解决问题提供了最佳解决方案;包括一个109399-city实例(在撰写本文时,最大的非平凡实例已求解为最优)。此外,该算法还改进了一系列最优解未知的大型实例的最佳解,其中包括1904711个城市实例(世界TSP).

这个DIMACS TSP挑战(2000)提供了许多基准实例。它们的规模从1000到10000000个城市不等。LKH目前持有所有具有未知optima的实例的记录。将当前最佳游览的长度制成表格在这里.

David Soler提供了126个非对称实例使用已知的optima。报告LKH在这些实例上的性能在这里..

Stefan Hougardy和Zhongxianghui提供了欧氏旅行商问题的难以求解实例。可以下载此类引用数高达100000次的实例在这里.列出了最佳LKH解决方案在这里.

报告中描述了LKH

K.Helsgaun,
Lin-Kernighan旅行推销员启发式的有效实现.
数据记录器(计算机科学写作)1998年第81号,
罗斯基勒大学。

K.Helsgaun,
Lin-Kernighan TSP启发式中K-opt移动的有效实现.
数据记录器(计算机科学著作)2006年第109号,
罗斯基勒大学(2007年11月修订)。

K.Helsgaun,
约束旅行的Lin-Kernighan-Helsgaun TSP解的推广
销售人员和车辆路线问题
.
《技术报告》,计算机科学,罗斯基勒大学,2017年。

K.Helsgaun,
在Lin-Kernighan-Helsgaun TSP求解器中使用POPMUSIC生成候选集.
《技术报告》,计算机科学,罗斯基勒大学,2018年。

在报纸上

K.Helsgaun,
Lin-Kernighan旅行推销员启发式的有效实现.
《欧洲运筹学杂志》,126(1):106-130 (2000).

K.Helsgaun,
Lin-Kernighan TSP启发式的一般k-opt子运动.
数学规划计算,1(2-3):119-163 (2009).

É. D.Taillard和K.Helsgaun,
针对旅行推销员问题的流行音乐.
欧洲运筹学杂志,In Press(2018)。

R.Tinós、K.Helsgaun和D.Whitley,
Lin-Kernighan-Helsgaun旅行推销员启发式中的高效重组.
PPSN XV,论文集I,第95-107页(2018年)。

可以看到LKH的科学应用列表在这里.

安装

LKH已经用编程语言C实现。该软件完全用ANSI C编写,可在许多计算机平台和C编译器上移植。

可在此处下载代码:LKH-2.0.10.tgz号(压缩的tar文件,大约1.5 MB)。

在Unix/Linux机器上执行以下命令:

焦油xvfz LKH-2.0.10.tgz
光盘LKH-2.0.10
制作

名为LKH的可执行文件现在可在目录LKH-2.0.10中使用。

可以下载Windows机器的独立可执行文件在这里。Visual Studio 2022项目可用在这里。另一种可能性是使用Cygwin公司(用于Windows的类Linux环境)。

该代码用于学术和非商业用途。作者保留本规范的所有权利。

LKH-3型是LKH-2的一个扩展,用于解决受限旅行商和车辆路径问题在这里.

 

2.0.10版的变更:

现在,旅游业可能会被泽维尔·克莱斯特(Xavier Clarist)的重组重组(Clarist)所重组。

通过在参数文件中给出以下规范,可以使用CLARIST重组

重组=克莱斯特

LKH-2.0.9变更:

现在可以通过POPMUSIC在LKH的参数文件中提供以下规范来创建候选集:

CANDIDATE_SET_TYPE=流行音乐

参数的值最大标准值用于修剪候选集。然而,还有一些其他与流行音乐相关的参数。如果未指定,它们将采用默认值。这些参数包括:

流行音乐_样品_尺寸=<整数>
样本大小。
默认值:10

流行音乐_解决方案=<整数>
要生成的解决方案数。
默认值:50

流行音乐_MAX_NEIGHBORS=<整数>
迭代3-opt-for中用作候选的最近邻居的最大数量
流行音乐。
默认值:5

流行歌曲=<整数>
用于POPMUSIC迭代3-opt的试验数量。如果该值为零,则试验次数是要优化的子路径的大小。
默认值:1

流行音乐_INITIAL_TOUR={|}
指定是否将第一个生成的POPMUSIC巡更用作Lin-Kernighan的初始巡更。
违约:

2.0.8版的变更:

旅行现在可以由GPX2(广义分区交叉2)而不是IPT(迭代部分转录)进行重组。

通过在参数文件中给出以下规范来使用GPX2:

重组=GPX2

可能的设置包括:

重组={ IPT公司|GPX2(全球定位系统2)}

默认为IPT。

GPX2代码由Renato Tinós编写,并由Keld Helsgaun改编为LKH。

新边权重类型:

地板_2D
地板_3D
TOR_2D型
TOR_3D型

2.0.7版的变更:

添加了一个近似的K-center聚类算法用于巡回划分(新关键字:K中心)改进了HCP和HPP实例的性能。

2.0.6版的变更:

增加了Lozano、Herrera和Cano提出的在稳态遗传算法中保持有用多样性的替换策略(CD/RW)。

2.0.5版的变更:

Guibas和Stolfi对Delaunay三角剖分的实现已被Geoff Leach更快的实现所取代。

2.0.4版的变更:

增加了子问题的多级压缩(2.0.3版只允许一个级别)。

2.0.3版的变更:

添加了一个简单的遗传算法。新关键字:人口_大小.第一个找到的旅游人口_大小跑步构成了最初的旅游人数。在剩余的每一次运行中,使用边缘重组交叉(ERX)的变体将当前人口中的两个巡更(父巡更)重组为一个新巡更(子巡更)。父母的选择是随机线性偏向于群体中的最佳成员。孩子被用作下次跑步的初始巡视。如果这次跑步产生的巡游比人群中最差的巡游更好,那么最终的巡游将取代最差的巡回游。通过要求人群中的所有旅游都有不同的成本,避免了过早的趋同。

2.0.2版的变更:

解决子问题的代码中的微小更改。增加了基于摩尔空间填充曲线的旅游构造启发式。新关键字:沼泽地.

2.0.1版的变更:

改进的距离缓存和更快的添加/删除测试k个-选择动作。这样可以将执行速度提高5-10%。

版本2.0的变更(2007年11月):

新版本通过数据结构和算法扩展了前一个版本,用于解决非常大的实例,并通过工具获得更高质量的解决方案。已经进行了许多更改。下面简要介绍了这些新功能。

1.一般k-opt移动

LKH-2中获得高质量解决方案的最重要手段之一是使用通用k个-选择动作。在Lin-Kernighan算法的原始版本中,移动被限制为那些可以分解为2-opt或3-opt移动,然后是2-opt移动(可能为空)序列的移动。这种限制简化了实现,但如果要寻求高质量的解决方案,它不一定是最佳的设计选择。LKH-1已经证明了这一点,它使用5选项顺序移动作为基本移动组件。LKH-2将这一想法向前推进了一步。现在k个-opt移动可以用作子移动,其中K(K)是任何大于或等于2且小于城市数的选定整数。每个子移动都是连续的。然而,在搜索此类移动的过程中,也可以检查非连续移动。因此,与Lin-Kernighan算法的原始版本相比,非连续移动不仅仅是作为最后手段尝试,而是集成到普通搜索中。

2.分区

为了降低求解大规模问题实例的复杂性,LKH-2使得将问题划分为更小的子问题成为可能。每个子问题都是单独解决的,其解决方案(如果可能)用于改进给定的总体路线。即使是小问题实例的解决方案有时也可能受益于分区,因为它有助于在搜索过程中集中精力。目前,LKH-2实现了以下五种分区方案:旅游段分区、卡普分区、Delaunay分区、,K(K)-表示分区和Sierpinski分区。

.巡回赛合并

LKH-2提供了一个巡更合并程序,该程序尝试使用包含所有巡更边缘的实例的局部优化,从两个或多个给定巡更中生成尽可能最佳的巡更,其中巡更的公共边缘是固定的。接近最佳的巡更通常共享许多公共边。因此,此实例的输入图通常非常稀疏,这使得使用k个-选择移动较大的值k个.

4.迭代部分转录

迭代部分描述是提高基于局部搜索的启发式算法性能的一般过程。它试图通过将任一解决方案的某些部分替换为另一解决方案的相关部分来改进两个单独的解决方案。该程序可通过搜索两个旅游的子链应用于TSP,这两个旅游包含不同顺序的相同城市,并且具有相同的初始和最终城市。LKH-2在每个局部最优巡更和迄今为止的最佳巡更上使用该程序。实现的算法是由莫比乌斯、弗雷斯勒本、默兹和施赖伯描述的算法的简化版本。

5.后台引导搜索

由固定数量的初始试验产生的巡回的边缘可以用作后续试验中的候选边缘。该算法是Zhang和Looks给出的算法的简化版本,对于VLSI实例.

6.用于解决超大实例的数据结构和算法

Delaunay三角剖分可用于加快确定alpha-nearst候选边的速度,巡更可在内部由三层树表示。

新关键字:

BACKBONE_TRIALS=<整数>
回溯={YES|NO}

CANDIDATE_SET_TYPE={ALPHA|DELAUNAY[纯]|NEAREST-NEIGHBOR|QUADRANT}
EXTRA_CANDIDATES=<整数>[对称]
EXTRA_CANDIDATE_SET_TYPE={NEAREST-NEIGHBOR|QUADRANT}
GAIN_CRITERION={YES|NO}
INITIAL_TOUR_ALGORITHM={波卢夫卡|GREEDY|NEAREST-NEIGHBOR|QUICK-BORUVKA|SIERPINSKI|WALK}
INITIAL_TOUR_FRACTION=<实际值在[0;1]>中
KICKS=<整数>
KICK_TYPE=<整数>
MAX_BREADTH=<整数>
MERGE_TOUR_FILE=<string>
NONSEQUENTIAL_MOVE_TYPE=<整数>
PATCHING_A=<整数>[受限|扩展]
PATCHING_C=<整数>[受限|扩展]
子问题SIZE=<整数>[DELAUNAY | KARP | K-MEANS | ROHE | SIERPINSKI][压缩][边框]
子问题_TOUR_FILE=<string>}
SUBSEQUENT_MOVE_TYPE=<整数>
SUBSEQUENT_PATCHING={YES|NO}
#<字符串>

删除的关键字:

回溯_移动_类型
合并_ OUR_文件_1
合并_ OUR_文件2

可以找到LKH-2.0参数的简短描述在这里.

1.3版的变更:

距离类型GEOM公司已添加(请参见http://www.tsp.gatech.edu/world/).

现在可以通过以下关键字在参数文件中提供其他控制信息:

回溯_移动_类型
候选文件
初始_ OUR_文件
最大_ SWAP
合并_ OUR_文件_1
合并_ OUR_文件2
受限_搜索

1.2版的变更:

如果抓捕功能由系统支持。

版本1.1的变更:

对于非对称问题的解决,代码变得更加健壮。在某些情况下,由于整数溢出,前面的代码可能会出错。

[]