【问题标题】: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 红色和黄色矩形用于包含尽可能多的矩形。

标签: optimization mathematical-optimization rectangles knapsack-problem packing


【解决方案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 个?
猜你喜欢
  • 2010-11-15
  • 2019-07-18
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多