繁体   English   中英

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

[英]efficient algorithm to find the minimum cost path

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

这是变相旅行商问题 (TSP)的变种。

你可以看到,如果你把每个城市标记为“需要被覆盖”(我将称之为“有趣的”)。 允许您多次访问节点的TSP变体仍然是NP完整的。

因此,知道您的问题的每个确切解决方案的复杂性将在有趣城市的数量中呈指数级,您可以按如下方式进行:

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

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

  1. 将Floyd-Warshall应用于城市图表。 它比Dijkstra更容易实现。 我找到了一个很好的PDF与他们的比较。 它为您提供了AB,AC,AF,BC,BF和CF的所有最短路径的矩阵。 如果您需要获得城市序列中的实际路径,请查看Wikipedia中的路径重建部分
  2. 尝试访问除A之外的有趣城市的顺序的每个排列(即,仅B,C和F)。 如果使用C ++,Python或Ruby,它们在标准库中具有排列功能。 对于其他语言,您可能需要使用第三方库或搜索Stack Overflow算法。
  3. 找到路径总成本最低的排列。 例如,对于置换CFB,总成本是AC + CF + FB + BA。 你已经拥有Floyd-Warshall的所有价值,所以你可以简单地总结它们。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM