所以我一直在寻找关于旅行商问题的2-opt改进的解释,我得到了它的主旨,但我不明白一件事。
据我所知,如果生成的路径的两条边相互交叉,我可以切换两个点,它们将不再交叉。但是 - 我不明白我如何确定两条边是否交叉。
为了使我的问题清楚,这是我到目前为止所做的:(我在java中做过)
Point
的对象,它代表一个城市,有一个x和y坐标。PointSet
,Points
中包含一组List
。 PointSet
的{{1}}方法,它通过最近邻算法以相当短的方式排列PointSet。所以现在我有一个排序的PointSet(不是最佳的,但仍然很短),我想对它做2-opt。但是,我不知道从哪里开始。我应该检查每一个线段以查看它们是否交叉,如果是,则切换两个点?我觉得这会破坏启发式的目的,它成为一种强力解决方案。有没有一种有效的方法来查找巡回赛的两个部分是否交叉?
如果我的问题不明确,我会applog。如果有人需要我,我会尝试编辑它以使其更清晰。
答案 0 :(得分:1)
如果您愿意,可以创建一个查找表来检测交叉边缘。对于n = 1000,订单10 ^ 12条目显然过于奢侈。不过你可能最担心的是短边?假设您的目标是为每个节点包含大约√n的最近邻居。那么你只是在兆字节的空间领域,无论如何都是O(n ^ 2)预处理。从那里它是一个启发式的,祝你好运!
还会提到这可以在飞行中完成。