Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 查找给定源和一组目标之间的最短路径_Algorithm_Dijkstra_Shortest Path_Traveling Salesman - Fatal编程技术网

Algorithm 查找给定源和一组目标之间的最短路径

Algorithm 查找给定源和一组目标之间的最短路径,algorithm,dijkstra,shortest-path,traveling-salesman,Algorithm,Dijkstra,Shortest Path,Traveling Salesman,您将获得一个加权连通图(20个节点),其中所有边都具有正权重。我们有一个机器人从a点开始,它必须在B点、D点和E点通过。其思想是找到连接所有这4个点的最短路径。机器人的电池也很有限,但它可以在某些地方充电 在研究了互联网之后,我想到了两种算法:Dijkstra的和TSPDijkstra的将找到一个节点与其他每个节点之间的最短路径,TSP将找到连接所有点的最短路径。TSP是否存在只在一组节点之间找到最短路径的变体?毕竟,在TSP中,所有节点都标记为“必须通过”。我仍然没有考虑到电池的限制 提前谢谢

您将获得一个加权连通图(20个节点),其中所有边都具有正权重。我们有一个机器人从a点开始,它必须在B点、D点和E点通过。其思想是找到连接所有这4个点的最短路径。机器人的电池也很有限,但它可以在某些地方充电

在研究了互联网之后,我想到了两种算法:Dijkstra的TSPDijkstra的将找到一个节点与其他每个节点之间的最短路径,TSP将找到连接所有点的最短路径。TSP是否存在只在一组节点之间找到最短路径的变体?毕竟,在TSP中,所有节点都标记为“必须通过”。我仍然没有考虑到电池的限制


提前谢谢

您可以将图形简化为TSP,然后在其上调用TSP算法:

  • 使用算法查找所有顶点对
    u
    v
    的距离
    u,v
  • 创建一个仅包含“所需”顶点的新图形,并将两个此类顶点之间的权重设置为Floyd Warshall找到的距离
    u
    v
  • 在修改后的图上运行TSP解算器以获取修改后的图中的路径,并使用原始图中的最短路径切换修改后的图中的每条边

  • 以上是最优的,因为假设有一条较短的路径

    D0=u->...D1->...->D2->...->Dk->...->t=D{k+1}
    
    Di->…->D{i+1}
    至少具有
    FloydWarshall(Di,D{i+1})
    (Floyd-Warshall的正确性)的权重,因此边
    (D0,D1,D2),…,(Dk,D{k+1)
    存在于修改后的图中,其权重小于/等于给定路径中的权重


    因此,根据TSP解算器的正确性,通过使用
    D0->D1->…->Dk->D{k+1}
    ,您可以得到一条至少与候选最优路径一样好的路径。

    您可能还想研究广义旅行商问题(GTSP):节点被划分为子集,问题是找到在每个子集中恰好访问一个节点的最小长度路由。允许模型从每个子集中选择它想要访问的节点。如果有必须访问的节点,您可以将它们自己放在子集中。

    注意TSP是一个问题,而不是一个算法。我一直在关注你的很多答案,这些答案都是非常完整和精确的+1@sasha谢谢你的反馈,感觉很好:)谢谢@amit,这真的帮了我很多忙!:)这在电池限制下仍然适用吗?@多元主义我认为可以,但它的简单/难易程度取决于充电点。例如,如果你可以在任何“必须通过”点充电,您只需从修改后的图表中修剪每个重量高于电池容量的边。对于任意节点,这将更加困难,需要考虑一下,但这似乎有点超出了这个问题的范围(特别要求忽略它)。