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

Find the shortest path between a given source and a set of destinations

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

在互联网上研究后,我想到了两个算法:Dijkstra 的TSPDijkstra 的 将找到一个节点与所有其他节点之间的最短路径,而 TSP 将找到连接所有点的最短路径。 TSP 是否有任何变体只能找到一组节点之间的最短路径?毕竟,在 TSP 中,所有节点都被标记为 "must-pass"。我仍然没有考虑电池限制。

提前致谢!

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

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

以上是最优的,因为假设有更短的路径。

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) 存在于修改后的图中,权重为 smaller/equal给定路径中的权重。

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

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