【问题标题】:Algorithm for determining largest covered area确定最大覆盖区域的算法
【发布时间】:2015-07-09 21:37:10
【问题描述】:

我正在寻找一种算法,我确信一定已经研究过了,但我对图论还不够熟悉,甚至不知道要搜索的正确术语。

在抽象中,我正在寻找一种算法来确定可达顶点 [x1, x2, xn] 和某个起始顶点之间的路由集,当每条边都有一个权重并且每条路由只能有一个给定的x的最大总重量。

更实际地说,我有道路网络,每个路段都有长度和最大行驶速度。我需要确定从网络上的任何起点在一定时间跨度内可以到达的区域。如果我能找到在那段时间内可以到达的最远点,那么我将使用凸包算法来确定区域(这对于我的用例来说已经足够接近了)。

所以我的问题是,我如何找到这些端点?我的第一个直觉是使用 Dijkstra 的算法,一旦我“消耗”了一定的“预算”时间,就停止,从每个路段的预算中减去;但是当算法应该回溯但已使用其预算时,我会卡住。这个问题有已知的名称吗?

【问题讨论】:

  • 您正在查看maximum flow problem。你想要它的名字还是粗略的分析?
  • @Makoto 是吗?根据我对最大流量的理解,它仅用于找到从给定源到给定目的地的一条路径,具有最大的“吞吐量”?
  • @user1929959 我不确定这与我的问题有什么关系——我不关心访问尽可能多的链接,我只想要与一个给定点的最大距离。但我可能只是没有看到联系。

标签: algorithm graph graph-algorithm


【解决方案1】:

如果我正确理解了这个问题,那么您最初的猜测是正确的。 Dijkstra 算法,或任何其他找到从顶点到所有其他顶点(如 A*)的最短路径的算法都适合。

在最简单的情况下,您可以构建图表,其中边的权重代表通过该路段所需的最短时间。如果你有它的长度和最大允许速度,我想你知道它。从起点运行算法,选择最短路径小于x的顶点。就这么简单。

如果您想优化事物,请注意在 Dijkstra 算法的工作过程中,当前已知的到顶点的最短路径会随着每次迭代而单调增加。当您处理具有非负权重的图形时,这是一种预期。现在,在每一步中,您都在选择一个当前最短路径最小的未使用顶点。如果此路径大于x,您可能会停止。从现在开始,您不可能有任何最短路径小于x 的顶点。

如果您需要准确确定顶点之间的点,即车辆在给定时间内可以到达的点,这只是上述算法的一个小扩展。下一步,考虑所有(u, v) 边,其中u 可以及时到达x,而v 不能。 IE。如果我们将到顶点w 的最短路径定义为t(w),我们就有t(u) <= xt(v) > x。现在使用一些基本数学在uv 之间用系数(x - t(u)) / (t(v) - t(u)) 插入点。

【讨论】:

  • 谢谢,这个答案(结合@div's)让我走上了正确的道路。当我将问题重新表述如下时,我没有意识到的事情变得很明显:'从给定的起始顶点 v1 找到所有至多预算 x 的点。我会让 Dijkstra 在整个图表上运行,而不是在到达给定的端节点时停止,而是在超出预算时停止。那时我的图中所有访问的顶点的预算都低于 x,然后我的凸包算法会剔除边界内的所有点。 (续...)
  • 这样,它甚至可以覆盖一些病态的情况,即路线后面的顶点距离起始节点更近(例如,carthesian 距离更近)(因为道路转弯绕过障碍物)或湖),这会使我的“覆盖区域”比要求的要小。这当然正是你所说的,但直到我按照上面写的方式对自己说这句话时,它才被我点击:)
【解决方案2】:

使用从起始节点开始的广度优先搜索似乎是解决 O(V+E) 时间复杂度问题的好方法。好吧,这就是 Dijkstra 所做的,但它会在找到最小路径后停止。但是,在您的情况下,您必须继续为您的一组路线收集路线,直到无法延长路线,使其重量小于或等于最大总重量。

而且我认为 Dijkstra 的算法没有任何回溯。

【讨论】:

  • 谢谢。你说得对,我对回溯的评论是因为我对我们已经使用的 Dijkstra 的修改版本有误解,很抱歉造成混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-25
相关资源
最近更新 更多