给定2D坐标平面上的一些矩形,我想找到一种算法来查找由非重叠矩形形成的最大区域。
我的第一个念头是:
检查矩形Ri,Rj是否对所有i,j重叠
矩形Ri是一个节点。我们在任何不重叠的矩形Ri,Rj对之间构造一条边
然后我们有了一个无向图
查找所有子图,它们是完整的图。
对节点的权重求和,找到最大的节点
但是,这种暴力方式已经是NP完整的了。我也看不到一种简单的贪婪算法,该算法也不起作用。我想知道是否有任何多项式时间方法来解决这个问题。谢谢!
答案 0 :(得分:0)
整数编程将非常适合此问题。使用求解器库,设置以下整数程序。
maximize sum_{rectangles R} area(R) x_R
subject to
for each pair of overlapping rectangles R1, R2:
x_R1 + x_R2 <= 1
variables x_R in {0, 1} for each rectangle R
变量的解释是,x_R = 1
如果最优集合中包含矩形R
。
如果您的求解器很聪明,并且在其预求解过程中添加了集团切割,那么此公式就可以了。否则,您应该在重叠图中检测最大的集团(节点是矩形,边是重叠的矩形),并写出一个约束,即每个集团中最多只能有一个矩形。 (如果此步骤太慢,则还可以使用扫掠线算法来查找重叠矩形的最大集合。)