【问题标题】:Finding points with minimum connectivity distance from room寻找与房间连接距离最小的点
【发布时间】:2013-06-01 20:51:42
【问题描述】:

我正在实施一种算法来查找一组房间中的最小跨度走廊。目前我已经弄清楚了算法,我只是想实现它。其中一部分涉及找到给定房间的所谓“特殊点”。矩形的“特殊点”是与另一个矩形的最远点的距离最小的点。例如:

房间 R1 的特殊点是 v6 或 v7,因为它们到 R1 以外的矩形中最远点的最小距离相同。同样,矩形 R8 的特殊点是 v13 或 v14,因为它们到矩形中除 R8 之外的最远点的最小距离相同。目前我有邻接列表中表示的点,列表中的每个相邻点。此外,我在邻接列表中的每个房间都将其每个边界点作为值。我也对它所属的每个房间都有每一分。

目前我正在通过查看到该点周围每个矩形中最远点的距离来计算特殊点。虽然速度很快,但在以下示例中显然失败了:

当我当前的实现将 V1 和 V2 识别为 R9 的特殊点时,显然 V2 是特殊点(因为从 V2 到 R3 中最远点的距离明显小于从 V1 到R2 中的最远点)。我可以通过计算到图中所有矩形的最远点的距离并选择最小值来实现它,但是我觉得有一种更有效的方法。我的想法是对房间进行排序并只检查一些房间,但是我仍然没有完整的算法。有什么想法吗?

提前致谢。

【问题讨论】:

  • 我不明白你最初的例子; v6 -> v22 比 v7 -> v22 长,哪个(假设您的插图的几何形状适当地显示了距离)是另一个矩形中距离 R1 最远的点,不是吗?
  • @G.Bach 特殊点是“到另一个矩形最远点的距离最小的点”。因此,对于第一个示例,R1 中的特殊点可以是 V6 或 V7,因为两者到另一个矩形中最远点的最小距离相同。所以计算的距离是 V6->V11 和 V7->V10,它们是相同的。我希望澄清!
  • 哦,您的意思是到与您当前所在的矩形相邻的矩形的最小最远距离?
  • @G.Bach 不一定是相邻的矩形。它可以是图表中的任何矩形。我的第二张照片显示了这种情况。
  • @Billiska 最小跨度走廊是从给定原点跨越图表中所有房间的最小走廊(到达图表中的所有房间)。问题本身是 NP Complete,所以我只是在做一个近似值。本文进一步描述了问题 www.cs.ucsb.edu/~teo/papers/CorrNPC.pdf。此外,作者的一篇论文是关于这个问题的(Gonzalez-Gutierrez)。请注意,这篇论文描述了它的两种变体,我正在研究的一种被他们描述为 MLC-R。基本上我的变体只有矩形作为房间。我希望这会有所帮助!

标签: algorithm graph


【解决方案1】:

总之,我建议同时从源矩形上的所有点运行 Dijkstra 算法,并修改停止条件。该算法在搜索过程中跟踪目前找到的当前最低特殊距离,并且不会进一步搜索已经比目前最低特殊距离更远的点。下面是一些伪代码,它使用字典来存储目标点 =>(最佳距离,源点)映射。

enqueue all points on source rectangle
special distance = infinity
while (queue not empty) {
    point = dequeue
    if (distance to point < best distance found to point AND 
        distance to point < special distance) {
        best distance found to point = distance to point
        rect = rectangle of point
        if (all points found in rect) {
            special distance to this rect = max(distances found to this rect)
            if (special distance to this rect < special distance) {
                special distance = special distance to this rect
            }
        } 
    }
}

激励细节如下:

您可以运行Dijkstra's algorithm 来查找从源矩形上的每个源点到一组目标点的所有点。本质上,Dijkstra 的算法是广度优先搜索,如果它满足从源点到该点的最短路径的条件,您只需从队列头部的点进一步搜索。

如果你使用这个条件,你会找到到所有点的最短路径。然后,您可以计算每个目标矩形的最长距离,并取其中的最小值——该源点的“特殊距离”(然后为源矩形上的每个点重新运行并找到最低的特殊距离)。然而,这是太多的工作,因为您将在搜索中包含很多远离源点且您不需要考虑的点。

您可以做的是保持算法运行期间找到的当前最低特殊距离,方法是在找到矩形的所有点时发现并相应地更新当前最低特殊距离(它从某个高数字开始,例如 C 中的 INT_MAX)。然后,您可以通过说它们与源点的距离也必须小于当前的最低特殊距离来增加获取点的条件(显然,如果当前点比当前最低特殊距离更远,那么您将无能为力最好考虑从它引出的路径。)

如果您要为每个矩形寻找特殊点,您可能需要考虑运行Floyd–Warshall algorithm,它将计算每对点之间的最短距离。

【讨论】:

  • 你的答案确实有效,但是我想避免找到到所有点的距离,因为这将是 O(v^3) 的顺序,我将运行我的程序,超过 6000 个点,这意味着在 1GHz 理论机器上大约需要 3 小时。
  • @pretobomba 我不确定我是否明白你在说什么。我的答案没有找到到 all 点的距离,因为一旦我们找到了一个完整的矩形,我们只会查看可以超过与该完整矩形的特殊距离的点。一个问题是我们从源矩形上的所有点进行搜索,但是通过继承在源矩形上搜索先前点时找到的最佳特殊距离,可以显着降低成本。事实上,我们可以做得更好,同时从源矩形上的所有点搜索——我会修改我的帖子。
  • @pretobomba 你得到 O(v^3) 是因为你想找到图中每个矩形的特殊点吗?我不熟悉的 Floyd-Warshall 算法是 O(v^3)。使用我在帖子中讨论的方法,可能值得根据从源矩形到队列上每个点的矩形的欧几里得距离对队列进行优先级排序。此外,如果您同时从源矩形的所有点进行搜索,这应该将每个矩形的最差成本除以其顶点数(这需要考虑更多,但希望您知道我要去哪里)。
【解决方案2】:

这不是一个完整的答案。这是为了确认/制定“特殊点”的定义。

来自 OP 的引述:

矩形的“特殊点”是具有最小值的点 到另一个矩形最远点的距离。

这是我的理解。 房间r的特殊点v*由:

在哪里

  • V_r 是房间 r 周围的顶点集
  • R 是所有房间的集合
  • D(v,v') 是两个给定顶点之间的距离

所以,我们可以看到:

  • 目标顶点v'被选择为尽可能远离v
  • 但v' 必须在目标房间r' 内,选择该房间以最小化距离

如果我对这个定义没有太远, 那么您应该能够通过 3 个嵌套循环蛮力搜索 v*(r)。

当然,您对更有效的方法感兴趣。不过,请先确保我正确理解“特殊点”。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    相关资源
    最近更新 更多