问题:我有很多积分。这些点中的每一个都有一个列表,其中包含对已经计算和存储它们之间距离的其他点的引用。我需要确定从原点开始并通过特定数量的点到达任何目的地的最短路线。
前:我正在度假,我住在一个特定的城市。我正在做一个单程旅行,看到任何四个城市,我想尽可能少地旅行。我不能不止一次访问同一个城市。
当前解决方案:现在我只是手动迭代每个可能性并存储最短路径。这有效,但感觉效率低下。此外,这个问题最终将扩展到包括从多个原点搜索到多个目标点,所以我认为这可能会破坏搜索空间。
搜索最短路径的更好方法是什么?
答案 0 :(得分:7)
回答更新的帖子,您检查每种可能性的解决方案是最佳的(至少目前还没有人发现更好的算法)。是的,那是一个旅行推销员,他的本能并不是触及每个城市,而是触及每个城市曾经。如果您不想搜索可能的最佳解决方案,您可能会发现使用更快工作的启发式方法很有用,但允许与理想解决方案存在有限的差异。
对于未来的回答者:Floyd-Warshall algorithm以及所有类似Floyd的变体都不适用于此。
答案 1 :(得分:3)
一般来说,你应该严格的不良变种...... 我认为你应该使用Branch_and_bound方法的一些变体 http://en.wikipedia.org/wiki/Branch_and_bound
答案 2 :(得分:2)
要么首先搜索norheim.se说,或者Dijkstra's algorithm也是我的建议。
答案 3 :(得分:1)
这听起来像是旅行推销员?一种解决方案是使用诸如进化算法的优化技术。目前,您正在进行详尽的搜索,这将非常快速地进行。但我认为这几乎是一个旅行推销员的问题,并且已经解决了几十年甚至几个世纪,并且有几种可能的攻击方式。谷歌是你的朋友。
答案 4 :(得分:1)
也许这就是原始海报的意思是“手动迭代每种可能性并存储最短路径”,但我想我想明确看似什么似乎是一个基线解决方案。
假设您已经有一个两点最短路径算法 - 这有各种图形的经典解决方案。假设所有距离都是非负的并且d(A-> B-> C)= d(A-> B)+ d(B-> C)。
要点是从S开始的路径经过一个中间城市“abcd”并以E结尾:
e.g。 SabcdE,SacbdE等......
只有4个中间城市,您可以列举所有24个排列。对于每个排列,使用最短的两点算法计算从头到尾的路径及其总距离。
然后给出起点和终点,有一种可能性附加到abcd和内部的两种可能性。你已经计算了这些距离,所以你加上从S到头部和尾部到E的距离。选择最小值。因此,一旦你为一组固定的内部城市预先计算了中间距离,你需要为任何一对起点和终点做12个两点最短路径问题。
随着中间城市数量的增加,这显然会缩小。我不清楚除非你对图形结构施加更大的限制,否则它可以做得更好(这是在物理欧几里德空间吗?三角不等式?)。
我的想法示例:假设城市之间的所有中间距离都是O(1)。对图表没有限制,那么从S到任何中间城市的距离可能是1000,除了一个是1.尾部相同。所以你可以强迫第一个城市成为任何东西。现在,去一层,把第一个城市作为“起点”。应用相同的参数:您可以通过操纵图形中的距离来使最佳路径转到以下任何城市。
因此,如果没有其他假设,似乎无法帮助实现复杂性。
答案 5 :(得分:1)
这是任何人都可以参与的非常常见和实时的情况。谷歌地图用户界面以相同的顺序为您提供路径,您可以在目的地列表中添加。虽然他们自己的Google Maps API提供了解决方案,但它并没有为您提供最佳路径。
Google maps API为此提供了解决方案。在查找路径的请求中,您必须提供标记'optimizeWaypoints:true,'。请求看起来像这样。
var request = {
origin: start,
destination: end,
waypoints: waypts,
optimizeWaypoints: true,
travelMode: google.maps.TravelMode.DRIVING
};
您可以在视图源中看到该实用程序的完整代码,因为完整的实用程序是使用javascript和HTML开发的。
我希望它会有所帮助。
答案 6 :(得分:-2)
图表的边缘似乎是双向的。在这种情况下,您要查找的算法是Dijkstra's algorithm。