首页 文章

计算多点之间的最短距离

提问于
浏览
0

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

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

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

2 回答

  • -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
    

    这假设你有一些基本上是完全连接的图形,并且通过“坐标”和“没有限制”,我认为这就是你所拥有的 . 如果不是,则需要遍历从连接到未连接节点的顶点集 .

  • 1

    我认为你可以应用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”

相关问题