旅行推销员 - 2-Opt改进

时间:2013-09-06 18:00:54

标签: java algorithm optimization nearest-neighbor traveling-salesman

所以我一直在寻找关于旅行商问题的2-opt改进的解释,我得到了它的主旨,但我不明白一件事。

据我所知,如果生成的路径的两条边相互交叉,我可以切换两个点,它们将不再交叉。但是 - 我不明白我如何确定两条边是否交叉。

为了使我的问题清楚,这是我到目前为止所做的:(我在java中做过)

  1. 我有一个名为Point的对象,它代表一个城市,有一个x和y坐标。
  2. 我有一个PointSetPoints中包含一组List
  3. 我有一个名为PointSet的{​​{1}}方法,它通过最近邻算法以相当短的方式排列PointSet。
  4. 所以现在我有一个排序的PointSet(不是最佳的,但仍然很短),我想对它做2-opt。但是,我不知道从哪里开始。我应该检查每一个线段以查看它们是否交叉,如果是,则切换两个点?我觉得这会破坏启发式的目的,它成为一种强力解决方案。有没有一种有效的方法来查找巡回赛的两个部分是否交叉?

    如果我的问题不明确,我会applog。如果有人需要我,我会尝试编辑它以使其更清晰。

1 个答案:

答案 0 :(得分:1)

如果您愿意,可以创建一个查找表来检测交叉边缘。对于n = 1000,订单10 ^ 12条目显然过于奢侈。不过你可能最担心的是短边?假设您的目标是为每个节点包含大约√n的最近邻居。那么你只是在兆字节的空间领域,无论如何都是O(n ^ 2)预处理。从那里它是一个启发式的,祝你好运!

还会提到这可以在飞行中完成。