优化在矩形中包含相同大小的正方形

Posted

技术标签:

【中文标题】优化在矩形中包含相同大小的正方形【英文标题】:Optimized containing of same-size squares in rectangles 【发布时间】:2016-06-16 09:05:18 【问题描述】:

假设我们有几个相同大小的正方形。我们要绘制n 矩形(此处为红色和黄色矩形)来包含这些正方形。

目标是尽可能减少浪费的空间。

在下面的示例中,首选n = 2 和右侧的解决方案,因为它只会浪费一个空间。

是否有任何已知的算法可以解决这类问题?

更新: 正方形的排列是任意的,它们总是在 X 轴上方!

更新 2: 为了使问题更简单,让我们假设所谓的容器矩形彼此重叠! (此处为红色和黄色矩形)

稍微复杂一点的情况: 让我们假设这个也使用了两个矩形。可以看出,第 3 种解决方案的空间浪费最少。

【问题讨论】:

第一个:你可以蛮力解决这个问题,第二个:使用贪心算法,第三个:构建一棵树并切割有太多浪费空间的子树 红色/黄色框重叠是怎么回事?允许还是不允许? @Thomas Brute force 似乎很慢。因为这是最简单形式的问题,所以我可能有很多矩形。 这些框是否总是从 y = 0 位置开始?或者他们能站在空中吗? @Thomas 红色和黄色矩形用于包含尽可能多的矩形。 【参考方案1】:

这个问题几乎与 ITA Software 提出的招聘难题相同,称为 "Strawberry Fields"(向下滚动查看 Strawberry Fields;将温室成本从 10 更改为 0)。我可以确认整数编程,特别是branch and price,其中高级决策是是否将两个正方形放在同一个矩形中,非常非常适合这个问题。这是我的 custom solver,用 C 语言编写。您需要将 strawberry_fields.h 中的温室成本从 10 更改为 0。

【讨论】:

谢谢大卫。我需要深入阅读您的解决方案,了解如何将其应用于此。【参考方案2】:

这种类型的矩形覆盖是困难的(实际上是NP-hard,你可以用它来解决矩形覆盖问题),但是你可以用整数线性规划来解决这个问题,如下:

minimize sum[i] take[i] * area[i]
st
sum[i] take[i] == n
for every filled cell x,y:
    sum[rectangle i covers x,y] take[i] == 1
take[i] in  0, 1 

矩形列表仅包含您可能需要的“合理”矩形。即只有在不发现一些填充单元格的情况下不能变小的矩形,并且您可以跳过某些“内部矩形”,您可以判断它们永远不会成为解决方案的一部分,因为它们会留下更难覆盖的形状。生成这些矩形本身就是一个有趣的练习,但是生成太多并不是一个大问题,只是速度较慢。在解决方案中,任何为 1 的take[i] 对应于您所取的一个矩形。

您可以将其放入任何可用的求解器中,例如 GLPK(免费)或 Gurobi(提供商业和学术许可)。

这一般应该比蛮力要快,因为可以使用线性松弛(与上面相同的模型,但最后一个约束转换为0 <= take[i] <= 1)来指导搜索,并且可以应用各种平面切割技巧。

更多高级技巧可以在this paper 中找到,例如使用线性松弛的分数解的技巧。

【讨论】:

谢谢哈罗德。我想知道假设有n 容器矩形数量和Nr 正方形行数的情况下的数量是多少。并且还假设每一行只有一个容器! @Vahid 你所说的“案例”是什么意思? 例如,假设手头有 7 行正方形和 3 个矩形来包含这些。我们知道每一行只能放置一个容器。 1-1-5、1-2-4、1-3-3、1-4-2、1-5-1、2-1-4、2-2-3、2-3-2、2- 4-1, 3-1-3, ... by 1-1-5 我的意思是,如果我们将第一个高度为 1 方格的容器放在第一行,第二个高度为 1 方格的容器放在第二行,则第三个需要将高度为 5 方格的容器放在它们上方以覆盖所有方格。 @Vahid 为什么每行只能有 1 个?

以上是关于优化在矩形中包含相同大小的正方形的主要内容,如果未能解决你的问题,请参考以下文章

codeforces 713D Animals and Puzzle

在Android中以给定的正方形大小裁剪图像?

以最佳方式将矩形组合在一起

将矩形图像调整为正方形,保持比例并用黑色填充背景

填充正方形

如何跟踪具有特定颜色的矩形