【发布时间】:2013-09-10 21:56:21
【问题描述】:
所以我一直在寻找关于旅行商问题的 2-opt 改进的解释,我明白了它的要点,但我不明白一件事。
我知道如果生成路径的两条边相互交叉,我可以只切换两个点,它们将不再交叉。但是 - 我不明白如何确定两条边是否交叉。
为了让我的问题更清楚,这是我到目前为止所做的:(我在 java 中做了)
- 我有一个名为
Point的对象,它代表一个城市,具有 x 和 y 坐标。 - 我有一个
PointSet,它有一组Points,包含在List中。 - 我有一个
PointSet的方法,称为computeByNN(),它通过最近邻算法以相当短的方式排列 PointSet。
所以现在我有一个排序的 PointSet(不是最优的,但仍然很短),我想对其进行 2-opt。但是,我不知道从哪里开始。我是否应该检查每个线段以查看它们是否相交,如果相交,则切换两个点?我觉得这违背了启发式的目的,它变成了一种蛮力解决方案。有没有一种有效的方法来确定游览的两个部分是否交叉?
如果我的问题不清楚,我很抱歉。如果有人需要,我会尝试对其进行编辑以使其更清晰。
【问题讨论】:
-
检查每条边的每一条只有
O(n²)。逼近 NP 完全问题时的完全合理的运行时间(显然没有已知的多项式时间精确解)。
标签: java algorithm optimization nearest-neighbor traveling-salesman