在固定矩形容器中组织矩形的算法

时间:2011-02-25 16:25:10

标签: algorithm packing

我的问题非常类似于2D背包问题,或切割股票有一个例外......适合容器的矩形可以调整大小和裁剪。但是不允许轮换。

挑战是尽可能减少作物并填满整个容器(无任何间隙)。

有没有人遇到过会做类似事情的算法。任何链接,伪代码都非常赞赏。

保持问题的通用性,但我想应用它来整理固定尺寸页面上的照片。

非常感谢

3 个答案:

答案 0 :(得分:5)

首先从确定性最适合减少算法开始:

  • 根据尺寸将矩形从大到小排序

  • 取第一个矩形并将其放入容器(如果适合

  • 取下一个矩形并将其放置在容器中最佳的剩余位置,而不进行裁剪(如果它适合它)。如果有多个选项,请选择离开具有最少边数的剩余区域的选项。重复此步骤,直到容器已满或已使用所有矩形。

  • 如果容器尚未装满,请按相同的顺序浏览未使用的矩形,但这次尝试裁剪。

现在,这不会是完美的。您可以进入类似于此图像中左侧2个解决方案的情况,即使不需要也可以裁剪“无空间”项目:

enter image description here

因此,其次,在第一个结果上抛出一个元启发式算法,例如禁忌搜索模拟退火。如果您正在寻找一个开源库来帮助您,请查看this one

答案 1 :(得分:3)

在我写这篇文章时,我们试图优化的确切标准尚未确定。但无论最终决定什么标准,下面的启发式(即通常次优的)方法可能是有用的:

只考虑少数“布局”,将少量矩形组合成一个较大的矩形。然后递归地查看将这些新矩形组合成更大的矩形的方法,仅使用相同的布局,直到只剩下一个矩形。

这并不能保证最佳解决方案,因为一些照片子集被约束在最终解决方案中形成子矩形。但似乎它可能会提供合理质量的解决方案。

例如,对于3个矩形A,B和C,请考虑以下4种布局:

A
B
C

ABC

AB   (i.e. A appears on the left)
AC

AA   (i.e. A appears on the top)
BC

裁剪只会在第一轮进行,当我们组合3张照片组时。对于此步骤,应在上面4个布局中的每个布局下考虑3张照片的每个子集,并为每个布局确定最佳缩放和裁剪,请记住,生成的矩形可以通过后续步骤放大或缩小< / em>的。 (优化标准的一个很好的选择应该具有以下特性:在特定布局下,A,B和C中的每一个的理想缩放和裁剪量不受所得到的矩形缩放多少的影响,因此这不应该是问题)。

随后的组合轮次将表现相似,但不考虑任何裁剪。对于完整的解决方案,第2轮将涉及尝试组合第1轮产生的所有3个矩形组,其中所有9张照片都是不同的,但是遵循这种方法将导致指数爆炸。应该为每个照片子集保留最好的几个排列就足够了。请注意,每张照片至少出现在每轮产生的一个矩形中,这一点很重要。

答案 2 :(得分:0)

我不会声称这是最优的,但这里有一些想法可能会让你尝试。

我会根据评论重新定义问题。我们给出了一个v尺寸的矩形X和N各种尺寸的矩形。我们想用N个矩形完全覆盖矩形X.我们可以调整与原始尺寸成比例的图像大小。我们希望最小化N矩形覆盖的区域数量,这些矩形也覆盖矩形X的区域。

这是一个想法:

  • 如果我们能找到与原始尺寸成比例的包装,我们可以简单地向上或向下缩放并适合矩形,我们就完成了
  • 给定一些bin打包算法,执行二进制搜索以找到X的最小缩放常量,以便我们可以打包bin中的所有矩形。
  • 展开并裁剪单个矩形,直到填满空格

不确定它会怎样,但要尝试一下。