【发布时间】:2014-06-09 02:14:15
【问题描述】:
想象一下,我正在公园里实施 Dijkstra 算法。这些点之间存在点和连接;这些指定了用户可以行走的有效路径(例如人行道)。
现在假设用户在草地上(即不在路径上)并且想要导航到另一个位置。问题不在于 Dijkstra 的算法(工作正常),问题在于确定从哪个顶点开始。
这是问题的图片:(暂时忽略虚线)
黑线表示 Dijkstra 算法中的边缘;同样,紫色圆圈显示顶点。人行道为灰色。草是,你猜对了,绿色。用户位于红星,并希望到达橙色X。
如果我天真地寻找最近的顶点并将其用作起点,则用户通常会被引导到次优路径,这涉及在开始时离目的地更远(即红色实心路径)。
蓝色实心路径是我的算法理想的最佳路径。
注意事项:
- 假设没有路径与其他路径交叉。
- 导航到起点时,用户不应越过路径(例如人行道)。
- 在上图中,从星星出来的第一条线段是动态创建的,只是为了帮助用户。星不是图中的顶点(因为用户可以在草地区域内的任何地方)。只是显示了从星形到顶点的线段,以便用户知道如何到达图中的第一个有效顶点。
我怎样才能有效且正确地实现这一点?
想法 #1:找到封闭的多边形
如果我找到围绕起点的最小多边形,我现在可以为 Dijkstra 算法创建从起点(将临时添加为新顶点)到构成多边形的每个顶点的新路径。在上面的示例中,多边形有 6 条边,因此这意味着为每个顶点创建 6 条新路径(即蓝色虚线)。然后我就可以运行 Dijkstra 的算法,它很容易确定蓝色实线是最佳路径。
这种方法的问题在于确定哪些顶点构成了围绕我的点的最小多边形。我不能为图中的每个顶点创建新路径,否则我最终也会得到 红色虚线,这完全违背了使用 Dijkstra 算法的目的(我不应该被允许跨越人行道)。因此,我必须注意只创建到封闭多边形顶点的路径。有这个算法吗?
此解决方案还有另一个复杂之处:假设用户现在从紫色闪电开始。它没有封闭的多边形,但是通过将其连接到右上角的 3 个点,该算法仍然可以工作。同样,一旦连接到这些点,运行 Dijkstra 就很容易了。
更新:我们想要连接到这 3 个点之一而不是绕过所有东西直接到达橙色 X 的原因是因为我们想尽量减少在未铺砌的小路上行走。 (注意:如果您从多边形外开始,这只是一个约束。如果草地在多边形内,我们不在乎您在草地上行走多长时间。
如果这是正确的解决方案,请发布其算法作为答案。
否则,请发布更好的解决方案。
【问题讨论】:
-
我不太明白。有效路径的限制是什么?如果你从外面开始,为什么你不能从外面走到目标?
-
还有什么是所需的运行时间? O((n+m) * log n),像 Dijkstra?
标签: algorithm dijkstra polygons