找到给定源和一组目的地之间的最短路径
Find the shortest path between a given source and a set of destinations
给你一个加权连通图(20 个节点),所有边都具有正权重。例如,我们有一个从 A 点开始的机器人,它 必须 通过 B、D 和 E 点。这个想法是找到连接所有这 4 个点的最短路径。机器人的电池也有限,但可以在某些地方充电。
在互联网上研究后,我想到了两个算法:Dijkstra 的 和 TSP。 Dijkstra 的 将找到一个节点与所有其他节点之间的最短路径,而 TSP 将找到连接所有点的最短路径。 TSP 是否有任何变体只能找到一组节点之间的最短路径?毕竟,在 TSP 中,所有节点都被标记为 "must-pass"。我仍然没有考虑电池限制。
提前致谢!
您可以将图形缩减为 TSP,然后对其调用 TSP 算法:
- 使用Floyd-Warshall算法找到所有顶点对
u
和v
的距离u,v
。
- 创建一个新图,仅包含 "desired" 个顶点,并将两个这样的顶点
u
和 v
之间的权重设置为 Floyd-Warshall 找到的距离。
- 运行修改图上的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):将节点划分为子集,问题是找到恰好访问每个子集中一个节点的最小长度路径。允许模型从每个子集中选择它想要的任何节点。如果有必须访问的节点,可以将它们单独放在一个子集中。
给你一个加权连通图(20 个节点),所有边都具有正权重。例如,我们有一个从 A 点开始的机器人,它 必须 通过 B、D 和 E 点。这个想法是找到连接所有这 4 个点的最短路径。机器人的电池也有限,但可以在某些地方充电。
在互联网上研究后,我想到了两个算法:Dijkstra 的 和 TSP。 Dijkstra 的 将找到一个节点与所有其他节点之间的最短路径,而 TSP 将找到连接所有点的最短路径。 TSP 是否有任何变体只能找到一组节点之间的最短路径?毕竟,在 TSP 中,所有节点都被标记为 "must-pass"。我仍然没有考虑电池限制。
提前致谢!
您可以将图形缩减为 TSP,然后对其调用 TSP 算法:
- 使用Floyd-Warshall算法找到所有顶点对
u
和v
的距离u,v
。 - 创建一个新图,仅包含 "desired" 个顶点,并将两个这样的顶点
u
和v
之间的权重设置为 Floyd-Warshall 找到的距离。 - 运行修改图上的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):将节点划分为子集,问题是找到恰好访问每个子集中一个节点的最小长度路径。允许模型从每个子集中选择它想要的任何节点。如果有必须访问的节点,可以将它们单独放在一个子集中。