使用近似算法在所有点之间寻找路径

时间:2013-01-22 14:58:56

标签: algorithm path coordinates approximation

有1< = n< = 1000个城市。我必须找到连接所有城市的路径(每个城市只能访问一次),其开始和结束于城市1号。在这条路径中,2个城市之间的最大长度必须尽可能短。

例如:

enter image description here

输入:

coordinates of cities

输出:

5 1 3 //longest connection is 5 and it is between cities 1 and 3
1 3 6 4 5 2 1 //path

2 个答案:

答案 0 :(得分:2)

这是一种近似算法,平均应该比天真的贪婪算法提供更好的结果:

  1. 考虑图表是完整的 - 每对顶点之间都有一条边,共有n(n-1)/2个边。
  2. 按重量/距离的降序对边缘进行排序。
  3. 从最高距离边缘到最低距离边缘迭代,并且如果在移除该边缘之后将其移除,则其两个端点仍然具有至少度数(n / 2)(Dirac's theorem以确保哈密顿循环存在)。您可以使用更强大的结果(如Ore's theorem)来修剪更多边缘,但计算复杂度会增加。
  4. 在剩下的图表中,使用贪心算法查找哈密顿循环。贪婪算法基本上从1开始,并且一直保持选择与到目前为止尚未构成循环一部分的节点的距离最小的边缘。所以在你的例子中,它将首先选择1 - >然后2-> 4,然后4-> 5,依此类推。然后,最后选择的顶点的路径将返回1.
  5. 您可以直接在输入图表上使用步骤4中给出的贪心算法,但预处理步骤1-3通常会大大改善您在大多数图表上的结果。

答案 1 :(得分:0)

听起来类似于TSP,除了你需要最小化2个城市之间的最大长度而不是总数(这可能会使它根本不同)。

我的想法是这样的:

create edges between each pair of cities
while (true)
  next = nextLongestEdge
  if (graph.canRemove(next)) // this function may be somewhat complicated,
                             // note that it must at the very least check that every node has at least 2 edges
    graph.remove(next)
  else
    return any path starting and ending at 1 from the remaining edges