具有固定开始和目的地的多目的地最短路线

时间:2013-11-25 23:54:02

标签: c++ algorithm

这个问题已经以类似的方式被问了几次,但我找到的现有答案都没有给我带来实际帮助。

问题: 我有一个固定的起点,一个固定的目的地点,以及它们之间的许多目的地点。 从期望的起点开始,我想计算沿着所有目的地点行进并在给定目的地点结束的最短路线。

对于我必须解决的特定问题,我需要一个非常快速的解决方案。我在考虑Floyd-Warshall算法是否合适,据我所知,我的问题与全对最短路径问题有关。

但是,我不知道这些数据如何与我拥有的数据相比(每条路线有数百个中间目的地可以在智能手机上计算)。

我也在考虑是否可以将其转换为经典的TSP问题(并且再次回归),因此我可以使用据说具有出色性能的Concorde TSP库。

那么:您能否向我推荐一个明确的最佳解决方案来解决我的问题,还有一些C ++代码可以帮助我开始?

3 个答案:

答案 0 :(得分:0)

事实上,您有一个固定的,不同的终点并不会使问题变得更容易。如果我们能找到一个多项式时间算法来解决这个问题,我们可以简单地将每个节点设置为终点,解决所有这些问题,找到最佳解决方案(通过将成本添加回每个节点的起点) ),我们有一个(经典的)TSP问题的多项式时间算法。

允许您多次访问节点似乎以使问题更容易。虽然对于正式证明,需要将TSP降低到此(而不是相反),考虑将任何两个节点之间的边缘成本设置为等于这两个节点之间的最短路径。当你这样做时,你最终必须基本解决TSP问题 - 这个TSP问题的最佳解决方案应该是原始问题的最佳解决方案。

虽然简单地使用最短路径可能偶尔会导致不必要的节点重复,但最佳解决方案并非如此,因为在隐式访问重复节点之前,它总是会导致访问重复节点的成本更低通过最短的路径。


要使用TSP求解器解决此问题,请考虑将每两个节点之间的边的权重设置为等于两者之间的最短路径,并添加从端点到起点的路径,其成本为0.

如果使用您正在使用的解算器无法做到这一点,Wikipedia会列出一些您可以遵循的方法。


效果说明:

是的,我建议运行一对全对最短路径算法来获得上面的最短路径。

请注意,即使对TSP的(合适的)近似算法也应该比解决所有对最短路径问题花费更长的时间,因此首次执行此操作的相对开销应该是最小的。 / p>

如果您认为这可以使用所有对最短路径来解决(但我认为不可能),那就改为 - 它会快得多。

答案 1 :(得分:-1)

您要解决的问题是n-p completeTSP(Travelling Salesman Problem)可以减少到它,而TSP是n-p完成的,所以就是这样。但你可以做比蛮力更好的解决这个问题,这是通过使用动态编程算法Held-Karp为TSP提供稍作修改,在O(2^N)中解决它,这比蛮力{{}}好得多。 1}}。但它也有类似的空间复杂性。如果您在实际应用中这样做,那么您当然可以使用遗传算法,蚁群优化等启发式算法,这些算法可以提供无法证明最优但非常接近的良好解决方案。

答案 2 :(得分:-2)

我不建议将此问题转换为旅行推销员。这会对解决方案施加额外的要求,例如您只能访问每个中间目标点一次,这不是必需的。不仅如此,TSP是NP-Hard,而All-Pairs最短路径问题可以在多项式时间内求解。

如果它确实是全对最短路径问题,那么最好的选择可能是使用Floyd-Warshall算法或Johnson算法,这两种方法都可以在多项式时间内解决问题。

如果问题实际上是旅行商问题并且您正在尝试快速解决问题,则需要获得近似解决方案。根据我使用TSP的经验,使用简单的贪婪搜索会产生非常好的结果,并且编码非常简单。有计算确切答案的方法,但这些都非常昂贵。如果你想要比贪婪方法提供的结果更好的结果,我很幸运使用蚁群优化来计算近似答案。