【问题标题】:Compute the shortest distances beetween multiple point计算多个点之间的最短距离
【发布时间】:2015-11-30 20:50:18
【问题描述】:

所以这是我遇到的问题:我需要一个算法,给定一组n 坐标点(x;y) 将所有点连接在一起的最短路径是什么,完全没有限制,这意味着单个点可以链接到任意数量的其他点。

解决问题的第一个想法是针对每个未链接的点,找到最近的点并链接到它,然后从未链接的点列表中删除这两个点并重新开始,直到没有更多不喜欢的点。在这个阶段你已经创建了近点块。然后你链接这些块找到它们之间的最短距离。

这种方法的问题是1.它没有给出最短路径2.看起来效率很低,所以我问你,这种计算是什么类型的算法(我只需要点之间的总距离,我不关心它们实际上是如何关联的)?

【问题讨论】:

  • 听起来像是TSP的变体
  • 不太像想象的那样,因为在这里我可以随心所欲地去“城市”。
  • 有什么限制?图中权重的最佳配置是 NP 完全的,所以也许在 N

标签: algorithm


【解决方案1】:

听起来好像您可以使用生成树算法。在伪代码中:

build_tree(unconnected_nodes):
  connected_nodes = set()
  // pick a random unconnected node
  connected_nodes.add(unconnected_nodes.pop())

  while not empty(unconnected_nodes):
     best_connected_node = None
     best_unconnected_node = None
     shortest_distance = +Infinity

     for node1 in connected_nodes:
       for node2 in unconnected_nodes:
         if distance(node1, node2) < shortest_distance:
           shortest_distance = distance(node1, node2)
           best_unconnected_node = node2
           best_connected_node = node1
     connect(best_connected_node, best_unconnected_node)
     unconnected_nodes.remove(best_unconnected_node)
     connected_nodes(best_unconnected_node)

  return connected_nodes

这是假设您拥有的东西本质上是一个完全连接的图,并且通过“坐标”和“无限制”,我认为这就是您所拥有的。如果没有,则需要遍历从已连接节点到未连接节点的一组顶点。

【讨论】:

    【解决方案2】:

    我认为你可以应用 Prim 的最短路径算法或 Kruskal 最短路径算法。这些算法通常提供网络中两个不同节点之间的最短路径。对于您的问题,您可以将每个坐标对表示为一个顶点,并通过创建边的最小生成树来找到它们之间的最短路径。我正在编写下面的伪代码:

    mst = queue of all the result edges(or co-ordinates)
    p =  queue of all the connected edges
    while p is not empty
      edge e = min of p
      if union-find(both vertices of edge e)
        continue
      else
        union-find.add(both vertices of edge e)
        mst.add(e)
    

    最后你会得到代表所有坐标之间最短路径的“mst”

    【讨论】:

    • p 是例如由三个值组成的元素列表:顶点ab 和距离ab 就这样吗?
    • 部分正确,实际上p表示顶点a和顶点b之间的连接(边),你可以把它想象成距离(ab)或权重(ab)。它只是所有此类边的列表,例如 (a-b, b-c, a-c) 等
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 2014-11-29
    相关资源
    最近更新 更多