所以我一直在寻找关于旅行商问题的 2-opt 改进的解释,我明白了它的要点,但我不明白一件事。
我知道如果生成路径的两条边相互交叉,我可以切换两个点,它们将不再交叉。但是-我不明白如何确定两条边是否交叉。
为了让我的问题更清楚,这就是我到目前为止所做的:(我在 java 中做了)
- 我有一个对象
Point
,它代表一个城市,具有 x 和 y 坐标。 - 我有一个包含在 a 中的
PointSet
一组。Points
List
- 我有一个
PointSet
调用方法,computeByNN()
它通过最近邻算法以相当短的方式排列 PointSet。
所以现在我有一个排序的 PointSet(不是最优的,但仍然很短),我想对它做 2-opt。但是,我不知道从哪里开始。我是否应该检查每个线段以查看它们是否相交,如果相交,则切换两个点?我觉得这违背了启发式的目的,它变成了一种蛮力解决方案。有没有一种有效的方法来确定旅游的两个部分是否交叉?
如果我的问题不清楚,我很抱歉。如果有人需要,我会尝试对其进行编辑以使其更清晰。