我正在寻找一种我必须已经研究过的算法,但我对图论并不熟悉,甚至不知道要搜索的正确术语。
在摘要中,我正在寻找一种算法来确定可到达顶点[x1,x2,xn]和某个起始顶点之间的路由集,当每条边具有权重并且每条路径只能有给定的最大总重量x。
在更实际的术语中,我有道路网络和每个路段的长度和最大行驶速度。我需要确定从网络上任何起点开始的某个时间跨度内可以到达的区域。如果我能找到在那段时间内可以到达的最远的点,那么我将使用凸壳算法来确定该区域(这对于我的用例来说足够近似。)
所以我的问题是,如何找到这些终点?我的第一个直觉是使用Dijkstra的算法,并在我消费后立即停止。一定的预算'时间,从每个路段的预算中减去;但是当算法应该回溯但是已经使用了它的预算时,我会陷入困境。这个问题是否有已知的名称?
答案 0 :(得分:3)
如果我正确理解了问题,那么您最初的猜测是正确的。 Dijkstra的算法,或者找到从顶点到所有其他顶点(如A *)的最短路径的任何其他算法都适合。
在最简单的情况下,您可以构建图表,其中边的权重代表通过此路段所需的最短时间。如果你有它的长度和最大允许速度,我假设你知道它。从起点运行算法,选择最短路径小于x
的顶点。就这么简单。
如果你想优化事物,请注意在Dijkstra算法的工作中,当前已知的到顶点的最短路径随着每次迭代而单调增加。当你处理具有非负权重的图时,这是预期的。现在,在每一步中,您将选择一个具有最小当前最短路径的未使用顶点。如果此路径大于x
,您可以停止。从现在开始,您不可能有任何最短路径小于x
的顶点。
如果您需要精确确定顶点之间的点,车辆可以在给定时间内到达,它只是上述算法的一个小扩展。下一步,请考虑所有(u, v)
边,其中u
可以及时到达x
,而v
则不能。即如果我们将最短路径w
定义为t(w)
,我们会t(u) <= x
和t(v) > x
。现在使用一些基本数学来在u
和v
之间插入系数为(x - t(u)) / (t(v) - t(u))
的点。
答案 1 :(得分:2)
从起始节点使用广度优先搜索似乎是解决O(V + E)时间复杂度问题的好方法。这就是Dijkstra所做的事情,但是在找到最小的路径之后就停止了。但是,在您的情况下,您必须继续为您的路线集合收集路线,直到无法延长路线,使其重量小于或等于最大总重量。
我不认为Dijkstra算法有任何回溯。