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

时间:2015-03-08 09:52:53

标签: algorithm dijkstra shortest-path traveling-salesman

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

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

提前致谢!

2 个答案:

答案 0 :(得分:3)

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

  1. 使用Floyd-Warshall算法查找所有顶点对u,vu的距离v
  2. 创建一个新图表,仅包含"所需"顶点,并设置两个这样的顶点uv之间的权重,作为Floyd-Warshall找到的距离。
  3. 在修改后的图形上运行TSP Solver以获取修改后的图形中的路径,并使用原始图形中的最短路径切换修改后的图形中的每条边。

  4. 以上是最优的,因为假设路径较短。

    D0=u->...D1->...->D2->...->Dk->...->t=D{k+1}
    

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

    因此,根据您的TSP-Solver的正确性,通过使用D0->D1->...->Dk->D{k+1},您获得的路径至少与候选最佳路径一样好。

答案 1 :(得分:1)

您可能还想查看广义旅行商问题(GTSP):节点被划分为子集,问题是找到每个子集中只访问一个节点的最小长度路由。允许模型从每个子集中选择它想要的任何节点。如果有必须访问的节点,您可以将它们全部放入子集中。