旅行推销员建设性启发式

Posted

技术标签:

【中文标题】旅行推销员建设性启发式【英文标题】:Travelling Salesman Constructive Heuristics 【发布时间】:2012-02-04 20:48:11 【问题描述】:

假设,我们有一个代表旅行商问题的解决方案的循环列表。此列表最初为空。

如果允许用户输入一个城市并且它的坐标是一一对应的,那么可以使用什么启发式方法将这些坐标插入到已经存在的游览中?


一个示例使用最近邻启发式:它将新坐标插入到游览中已经存在的最近坐标之后。

还有哪些其他选项(如果可能,请使用伪代码)。

【问题讨论】:

你不需要给我代码。如果是作业,我会要求代码,我不需要任何代码。只想优化我的应用,看看我的选择是什么。 【参考方案1】:

没有其他启发式方法,因为 TSP 总是要找到最近的坐标。至少我不知道可以插入坐标并知道最近坐标的算法,但是有很多算法可以找到一个好的游览。一个好的启发式算法是例如 Christofides 算法,它仅适用于欧克里德空间,但它可以保证解决方案在最优值的 3/2 以内。编码不是很容易。特别是 edmond bloom v 算法是针对专家技能的。保证的重要性还不够高,因为您如何解释您的方法在某些罕见的情况下可以提供无意义的结果?

【讨论】:

没有其他启发式方法吗?我对此表示怀疑。此声明的任何资源? @amit:有很多启发式方法可以找到一个好的游览,但没有一个适用于插入方法,或者我只是不明白他的问题。 还有其他启发式方法,大卫。最远的插入,最便宜的插入。 @Korion:我真的不知道你为什么这么高兴。你的问题真的很模糊。我给你一个答案,也是一个很好的启发式。 Christofides 是一个很好的启发式方法。如果你没有对其他人投反对票,我会投你赞成票。【参考方案2】:

您当然可以概括您提到的想法:

定义k'th_path(v) = minimum weight of a path including maxk,not_visited cities cities

注意计算第k个路径是O(|V|^k)[这个界限不紧]

特殊情况

对于k=1,按照您的建议,您将获得最近的邻居。 对于k=|V|,您将获得最佳解决方案 [注意计算范围非常广泛]。

【讨论】:

谢谢,阿米特!!这正是我正在寻找的答案:没有代码,只是启发式的解释。感激不尽。【参考方案3】:

您可以使用许多构造启发式方法,例如首次拟合、递减递减、最佳拟合、递减最佳拟合和最便宜的插入。 这些构造启发式通常应用于装箱,但它们也可以转换为 TSP。 Documentation about those heuristics is here.

由于您一次只插入 1 个未分配的实体,所有这些基本上都恢复为您所谓的 最近邻启发式(关系略有不同),但请注意,这不是他们通常称之为最近邻。最近邻总是添加到行尾,即所有未分配实体的最近邻。

现在,您真正想要的是一个不错的解决方案,而无需重新启动整个构建启发式方法。这更难:欢迎来到repeated planning and real-time planning(和this documentation)。我正在开发一个用于实时规划的 TSP 和车辆路线的开源示例。

【讨论】:

我认为他(Korion)不明白这一点。 因为你不明白,大卫:D?谢谢,杰弗里!

以上是关于旅行推销员建设性启发式的主要内容,如果未能解决你的问题,请参考以下文章

优化旅行推销员算法(时间旅行者算法)

有多个推销员的旅行推销员,每个推销员的城市数量有限制?

遗传算法 - 旅行推销员

scipy 中的旅行推销员

R语言旅行推销员问题TSP

旅行推销员/车辆路线用例的最佳实现