寻找最少的矩形以覆盖一组矩形而不重叠的算法


75

我有一组矩形,我想“减少”该矩形,所以我用最少的矩形来描述与原始矩形相同的区域。如果可能的话,我希望它也很快,但是我更关心的是使矩形的数量越少越好。我现在有一种方法在大多数时间都有效。

目前,我从最左上角的矩形开始,看看是否可以在保持矩形的同时向右和向下扩展它。我这样做直到它无法再扩展,然后删除并拆分所有相交的矩形,然后将扩展的矩形添加回列表中。然后,我使用最左上角的下一个矩形再次开始该过程,依此类推。但是在某些情况下,它不起作用。例如: 在此处输入图片说明

使用这组三个矩形,正确的解决方案将以两个矩形结束,如下所示: 在此处输入图片说明

但是,在这种情况下,我的算法从处理蓝色矩形开始。这会向下扩展并分裂黄色矩形(正确)。但是,当处理完黄色矩形的其余部分时,它没有向下扩展,而是先向右扩展,然后取回先前拆分的部分。然后处理最后一个矩形,它不能向右或向下扩展,因此保留了原来的矩形集。我可以调整算法,使其首先向下扩展,然后再向右扩展。这样可以解决这种情况,但是在翻转的类似情况下会导致相同的问题。

编辑:只是为了澄清,原始的矩形集不重叠,也不必连接。如果连接了矩形的子集,则完全覆盖矩形的多边形可能会在其中带有孔。



Answers:


131

尽管有问题的标题,但我认为您实际上是在寻找将最小剖切成直线多边形的矩形的方法。(Jason的链接是关于矩形的最小覆盖,这是一个完全不同的问题。)

David Eppstein在他的2010年调查文章“计算几何问题的图论解决方案”的第3节中讨论了这个问题,他在mathoverflow.net上给出了一个很好的总结:

这个想法是找到具有两个凹顶点作为端点的不相交的平行于轴的对角线的最大数量,沿着它们分裂,然后为每个剩余的凹顶点再形成一个分裂。要找到不相交的轴平行对角线的最大数量,请形成对角线的交点图;该图是二分图,因此可以通过图匹配技术在多项式时间内找到其最大独立集。

这是我对这个令人敬佩的简短描述的掩饰,使用了Eppstein文章中的图2。假设我们有一个直线多边形,可能带有孔。

当多边形被切成矩形时,每个凹形顶点必须至少与切线的一个边相交。因此,如果这些边缘中有尽可能多的边缘具有双重作用,则它们将得到最小的解剖,即它们连接了两个凹形顶点。

因此,让我们在完全包含在多边形内的两个凹顶点之间绘制与轴平行的对角线。(“平行轴”在这里表示“水平或垂直”,多边形对角线是连接两个不相邻顶点的线。)我们希望在剖析中使用尽可能多的这些线,只要它们不不相交。

(如果没有平行于轴线的对角线,则剖析是微不足道的-只需从每个凹形顶点进行切割即可。或者,如果在平行于轴线的对角线之间没有相交,则我们将其全部使用,再加上从每个剩余的凹入顶点上进行的切割。否则,请继续阅读。)

一组线段的相交图对每个线段都有一个节点,如果线相交,则一条边会连接两个节点。这是平行轴对角线的交点图:

它是部分的,一部分是垂直对角线,另一部分是水平对角线。现在,我们希望选择尽可能多的对角线,只要它们不相交即可。这对应于在相交图中找到最大独立集

在一般图中找到最大独立集是一个NP难题,但是在二部图的特殊情况下,柯尼格定理表明,这等效于找到最大匹配的问题,可以在多项式时间内解决该问题。Hopcroft-Karp算法的示例。一个给定的图可以具有多个最大匹配项,但是它们中的任何一个都可以,因为它们都具有相同的大小。在该示例中,所有最大匹配都具有三对顶点,例如{(2,4),(6,3),(7,8)}:

(此图中的其他最大匹配项包括{(1、3),(2、5),(7、8)}; {(2、4),(3、6),(5、7)};和{ (1、3),(2、4),(7、8)}。

为了从最大匹配到对应的最小顶点覆盖,请应用柯尼格定理证明。在上面显示的匹配中,左集合为L  = {1,2,6,7},右集合为R  = {3,4,5,8},L中不匹配的顶点集合为U  = { 1}。U中只有一个交替路径,即1–3–6,因此交替路径中的一组顶点为Z  = { 1、3、6 },因此最小顶点覆盖为K =(L  \  Z)∪ (- [R  ∩  ž)= {2,3,7},下面以红色显示,最大独立设置为绿色:

将其转换回解剖问题,这意味着我们可以在解剖中使用五个与轴平行的对角线:

最后,从每个剩余的凹形顶点进行切割以完成解剖:


2
谢谢Gareth,在将其标记为答案之前,我一直在等待尝试实现它,但是我已经有一段时间没有回过头了。我只需要在该区域中进行错误修复,所以我仔细研究了一下,您的解决方案看起来确实可行,因此我将其标记为答案,但是由于时间限制,我无法实现它马上。再次感谢。
Mike Dour 2012年

1
@SamWashburn:使用柯尼格定理
加雷斯·里斯2015年

2
@MichaelPeddicord:最大匹配不一定是唯一的-在这种情况下,有几个。您找到的是(1、3),(2、4),(5、7),但也有(1、3),(2、5),(7、8)和(2、4), (3,6),(5,7)和(1,3),(2,4),(7,8)也许还有其他我没有发现的东西。他们中的任何一个都会为了找到最大的独立集合而做。
加雷斯·里斯

1
Javascript中的另一个似乎也做类似的事情:github.com/mikolalysenko/rectangle-decomposition希望它能对某人有所帮助。
ChristophMeißner'18

1
@JSmith:(i)当没有更多的自由顶点时,就没有更多的扩充路径,因此Hopcroft-Karp算法终止。(ii)如果没有任何与轴平行的对角线相交,则交点图中的最大匹配为空,因此最大独立集包含所有对角线,因此您可以在解剖中全部使用它们。
加雷斯·里斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.