找到最小成本路径的有效算法

时间:2015-05-10 15:45:58

标签: algorithm graph minimum

有一组给定的城市可以说.. A,B,C,D,E,F,G。问题是找到覆盖城市A,B,C,F的最低成本路径。路径必须覆盖城市A,B,C,F。路径可以(但不必)通过任何其他给定城市(D,E,G)。允许重复路径。路径应该从A开始和结束。 我应该如何解决类似问题?

1 个答案:

答案 0 :(得分:3)

这是伪装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的所有价值观,所以你可以简单地总结它们。
  4. 如果你有V个城市和N个有趣的城市,这个实现的运行时间大约为O(V 3 + N!·N)