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