【问题标题】:efficient algorithm to find the minimum cost path找到最小成本路径的有效算法
【发布时间】:2015-07-21 02:41:48
【问题描述】:

假设有一组给定的城市.. A,B,C,D,E,F,G。问题是找到覆盖城市 A、B、C、F 的最小成本路径。这条路径必须覆盖城市 A、B、C、F。该路径可以(但不是必须)穿过任何其他给定的城市(D、E、G)。允许重复路径。路径应该在 A 开始和结束。 我应该如何处理类似的问题?

【问题讨论】:

  • 我有一个问题图的邻接表表示,现在我正在尝试实现 dijkstra 的算法,以按照@Kolmar 的建议找到“有趣城市”的最低成本路径。

标签: algorithm graph minimum


【解决方案1】:

这是Travelling Salesman Problem (TSP) 的变体。

如果您将每个城市标记为“需要覆盖”,您就会看到这一点(我以后将这些城市称为“有趣的”)。 TSP 的变体,允许您多次访问一个节点,仍然是 NP 完全的。

因此,知道您的问题的每个精确解决方案的复杂性都会随着有趣城市的数量成倍增加,您可以按以下步骤进行:

首先,预先计算有趣城市之间的最短路径。这可以通过Dijkstra's algorithm 从每个有趣的城市运行或Floyd-Warshall algorithm 来完成。然后要么尝试访问有趣城市的顺序的每一个排列;或使用一些现有的 TSP 求解器或启发式算法。

所以最简单的实现是这样的:

  1. 将 Floyd-Warshall 应用于城市图表。它比 Dijkstra 的实现要简单得多。通过他们的比较,我发现了一个不错的 PDF。它为您提供 AB、AC、AF、BC、BF 和 CF 的所有最短路径的矩阵。如果您需要获取城市序列中的实际路径,请查看维基百科中的Path reconstruction section
  2. 尝试访问除 A 之外的有趣城市的所有排列顺序(即仅 B、C 和 F)。如果您使用 C++、Python 或 Ruby,它们在标准库中有置换函数。对于其他语言,您可能需要使用第三方库或在 Stack Overflow 上搜索算法。
  3. 找到路径总成本最低的排列。例如,对于排列 C-F-B,总成本是 AC+CF+FB+BA。您已经从 Floyd-Warshall 获得了所有这些值,因此您可以简单地将它们相加。

如果你有V个城市和N个有趣的城市,这个实现的运行时间大约是O(V3 + N!·N)

【讨论】:

  • 感谢您的回答,能否详细说明最后的要点?
  • @user269952 对不起,我认为这将是一个比第二个更复杂的解决方案,但它是指数时间而不是阶乘。但现在我想多了,它似乎也给了指数记忆。所以我把它删除了。如果您需要为小案例快速实现一些解决方案,那么排列方法会更简单,因为许多现代语言(例如 C++、Python、Ruby)都具有在标准库中生成排列的功能。为了最大限度地提高效率,最好使用启发式算法(例如模拟退火)或第三方求解器。
  • 通过“预先计算有趣城市之间的最短路径”,你的意思是我找到了上例中城市 A、B、C、F 的所有可能组合的最短路径吗?这将是 A-B , A-C, A-F, B-C, B-F, C,F 的最短路径
  • @user269952 是的,Floyd-Warshall 算法就是这样做的:找到任意 2 个节点之间的最短路径,而 Dijkstra 找到从 1 个节点到所有其他节点的最短路径,因此您必须从每个有趣的城市。
  • @user269952 查看我的编辑与可能的实现
猜你喜欢
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2020-04-07
  • 2021-12-14
  • 2011-07-15
相关资源
最近更新 更多