【问题标题】:minimizing overlap in random rectangles最小化随机矩形中的重叠
【发布时间】:2011-01-15 19:29:33
【问题描述】:

我有许多可能重叠的矩形,它们在固定平面内具有随机大小和位置。由于这些矩形是随机的,有些可能不会重叠:

|----- | | |----| |----| | | |----|

有些可能只重叠一个角:

|-----| | |--|--| |--|--| | |-----|

有些可能包含在另一个矩形内:

|----------------| | | | |-----| | | | | | | |-----| | |----------------|

有些可能会穿过另一个矩形:

|----------------| | | |---|--------------------------------| | | | | |---|--------------------------------| |----------------|

等等

我正在尝试找到一种算法,它可以为我提供一组矩形,这些矩形代表与输入集相同的区域,但不重叠。有些情况很明显 - 包含在较大矩形中的矩形可以被丢弃,重叠在一个角上的矩形可以分成三个矩形,穿过另一个矩形的矩形也可以。我正在寻找的是一种处理所有这些情况的通用算法。我不在乎它是否效率不高 - 输入集相当小(最多 25 个矩形)

找到重叠的矩形很容易,但很快就会变得越来越难,尤其是当您考虑到一个矩形可能与多个其他矩形重叠时。

这让我很头疼。有什么建议吗?

更新:

我又意识到了一件事:

我可以在将矩形添加到集合中时运行此算法,一个接一个,或者在添加所有矩形之后。在添加矩形时这样做可能更容易,因为您只需要考虑一个矩形,但您仍然需要考虑单个矩形与多个其他矩形重叠的情况。

【问题讨论】:

    标签: algorithm language-agnostic ascii-art


    【解决方案1】:

    首先在合成中创建所有“原子”矩形的集合,即由矩形交叉点形成的区域,并且它们本身没有被细分。每个实际矩形覆盖 1 个或多个原子矩形。然后运行组合优化算法,例如SETCOVER 来计算你需要覆盖所有矩形的最小数量。

    这里是该方法的说明。你有三个矩形(A,B,C)。他们创建了 5 个原子区域 (1-5):

     +---------+A
     |       1 |
     |    +----+-----+B
     |    |  2 | 3   |
     |    |  +-+---+C|
     |    |  |4|   | |
     +----+--+-+ 5 | |
          |  +-----+ |
          +--+-------+
    

    根据下表,矩形覆盖原子区域:

     A  {1,2,4}
     B  {2,3,4,5}
     C  {4,5}
    

    SETCOVER 问题现在是选择矩形 {A,B,C} 的最小子集,以便在将矩形覆盖的原子区域放在一起时覆盖所有原子区域。最小的解决方案是(显然)

     A {1,2,4} + B {2,3,4,5} = {1,2,3,4,5}
    

    请注意,这里的区域是非矩形的,例如区域 3 具有复杂的形状。您可以通过以下方法解决此问题:将原始矩形角点的所有不同 X 坐标视为网格的 X 坐标,并对 Y 坐标执行相同的操作;那么每个矩形都覆盖了一组从不细分的网格正方形,即:

     +---------+A       -
     |       1 |
     |    +----+-----+B -
     |    |  2 | 3   |
     |    |  +-+---+C|  -
     |    |  |4|   | | 
     +----+--+-+ 5 | |  -
          |  +-----+ |  -
          +--+-------+  -
    
     |    |  | |   | |
    

    这为您提供了以下 5x5 网格:

     AAA      A = rectangle A only
     A**BB    B = rectangle B only
     A*#CB    * = A and B
      BCCB    C = rectangles C and B
      BBBB    # = All
    

    从中您可以轻松提取 5 个区域;事实上,它们已经被标记了:) (A,B,C,*,#)

    【讨论】:

    • 谢谢你,精彩的回答。我特别喜欢第二种方案,看起来和Moron的方案一样。
    【解决方案2】:

    如果您还没有一组矩形,您可以从另一种方式处理它 - 从一个大矩形开始并细分它,直到您有一个可以使用的集合 - 这将确保您没有重叠。

    从整个矩形开始

    --------
    |      |
    |      |
    |      |
    |      |
    |      |
    --------
    

    在随机点分割并存储两个矩形。

    --------
    |      |
    |------|
    |      |
    |      |
    |      |
    --------
    

    在随机点分割一个随机矩形

    --------
    |      |
    |------|
    | |    |
    | |    |
    | |    |
    --------
    

    重复。 . .

    --------
    |      |
    |------|
    | |    |
    | |----|
    | |    |
    --------
    

    当你有所需数量的矩形时停止。

    您可以通过更仔细地选择每次 etcc 分割的矩形来使其产生您想要的那种“随机性”

    【讨论】:

    • 不,我已经有一组矩形 - 矩形的制作不在我的控制范围内。
    【解决方案3】:

    矩形是否平行于 x&y 轴?我想他们是。

    您可以尝试使用KD-Trees

    或者,如果您想要一些国产的但不一定高效的东西,您可以“矩形化”,然后如果需要合并矩形。

    “矩形化”是指您首先找到一个更大的矩形,所有矩形都适合该矩形(基本上由最小左边缘、最大右边缘、最小底部边缘、最大顶部边缘形成的矩形)。

    现在扩展矩形的所有边缘以切割大矩形。你现在有一个“矩形”。基本上所有这意味着您对垂直边缘和水平边缘进行排序并选择相邻的对以形成一个小矩形。对于每个小矩形,您现在可以检查它是否是感兴趣区域的一部分,如果不是,则拒绝它(它要么在内部要么完全在外部)。

    现在您有一个小矩形列表(可能为 O(n^2),在您的情况下可能约为 2500),它们构成了您感兴趣的区域。如果数量足够小以供您将来处理,您可以只使用它们,或者您可以将它们合并在一起以减少矩形的数量。

    要合并,您可以考虑一个矩形并考虑 4 种可能的合并(右侧或左侧相同高度的相邻矩形,或顶部或底部相同宽度的相邻矩形)。

    您可以通过维护排序的边列表(水平和平行)以及一些哈希表来加速某些处理(不仅仅是在合并期间)。

    【讨论】:

    • 不错的解决方案 - 我认为“矩形化”可能是前进的方向。
    • 谢谢 - 对我来说,突破性的是将问题视为单元格网格 - 一旦你有了它,那么发送仅在网格中的矩形就很容易了。
    【解决方案4】:

    非常有趣的问题 - 我认为最好一次解决一对矩形而不是一次查看 3 个或更多。首先丢弃其他矩形内的那些。现在你只有 3 种交叉点 - 角重叠和通过重叠和部分重叠(矩形没有一直通过)。这些都创建了一组新的矩形,对吧?

    将起始矩形编号从 1 到 N。从矩形 1 开始循环,直到找到相交的矩形。创建新的矩形。删除两个相交的矩形并将 3 个或更多新创建的矩形添加到您的集合中并重新开始。

    结果将是一大堆不重叠的矩形。这会创建最少的矩形吗?可能不是,但您没有指定最小化矩形数量很重要。它会占用 o(n^2) 时间吗?大概吧。

    【讨论】:

      【解决方案5】:

      如果您对算法应该生成的矩形数量没有任何限制,那么您的治疗肯定会轻率!

      1.有史以来最简单的解决方案

      创建一组被输入集的矩形覆盖的所有正方形(区域 1)。一个正方形就是一个长方形……你来了!

      2。极简解决方案?

      好的,这很草率,但是我认为您不必担心输入集。你的问题其实不一样:

      选择一个具有复杂形状的连续区域,并尝试用矩形准确地覆盖它,尽量减少它们的数量,这样它们就不会重叠。

      当然,您的区域可能不是连续的,但这只是意味着您有几个可以独立工作的连续区域。

      现在,我坦率地承认我不知道这个问题的最佳解决方案,我可以设想各种方法,但我不知道它们的性能或结果。 KD-Tree 应该有一个解决方案,不过不知道是不是极简的!

      【讨论】:

      • 是的,矩形的数量没有明确的限制,但我需要合理.. 1x1 矩形不是一个好主意!
      • 我想你会的,特别是如果你打算在之后继续工作的话。这只是第二个提示的开场白:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多