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

Posted

技术标签:

【中文标题】在固定矩形容器中组织矩形的算法【英文标题】:Algorithm to organize rectangles in the fixed rectangular container 【发布时间】:2011-07-04 10:24:11 【问题描述】:

我的问题与 2D 背包问题或切割库存非常相似,但有一个例外......适合容器的矩形可以调整大小和裁剪。但不允许旋转。

挑战在于尽可能少地种植作物并填满整个容器(没有任何间隙)。

有没有人遇到过类似的算法。任何链接,伪代码非常感谢。

保持问题的通用性,但我想将其应用于在固定大小的页面上组织照片。

非常感谢

【问题讨论】:

这在***.com/questions/1213394/…之前已经问过了 @beklip - 那么我们需要更好地定义裁剪。这是一个优化问题,我们需要知道我们在优化什么。种植面积?裁剪的图片数量?我最初问是因为如果我们可以任意调整图像的大小,我们只需将矩形分成 n 部分并沿着该网格调整图像的大小。 @beklip:你的意思是每张图像的平均裁剪面积吗?这不是一个很好的标准,因为例如如果您有 2 张 10x10 的照片可以放入 10x12 的矩形中,则它无法区分缩小到 10x6 和缩小到 10x2 和另一个到 10x10(我认为应该被认为更糟)。另外应该如何权衡裁剪与调整大小?在尝试最小化任何事情之前,我们需要一个函数,它接受一个候选解决方案并给出一个数字 @j_random_hacker:我想也许......最小化给定图片中裁剪区域的最大百分比?我认为这接近了公平性,虽然它没有捕捉到一些图片可能被缩小为窄条的问题,这似乎不太好。 @j_random_hacker 我认为这意味着纵横比的变化实际上是一种裁剪,可能是在调整大小之后。 “你不需要保持图像比例”,因为我们有裁剪能力。否则这个问题毫无意义。我们总是可以通过不做任何事情来最小化“裁剪”,而只是“调整大小”以适应,而裁剪是他唯一想要最小化的事情。 【参考方案1】:

首先从确定的最佳拟合递减算法开始:

根据大小从大到小排列矩形

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

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

如果容器未满,请按相同顺序遍历未使用的矩形,但这次尝试裁剪。

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

所以,其次,对第一个的结果抛出一个元启发式算法,例如禁忌搜索模拟退火。如果您正在寻找一个开源库来为您做这件事,请查看this one。

【讨论】:

【参考方案2】:

在我撰写本文时,我们试图优化的确切标准尚未确定。但无论最终确定的标准是什么,以下启发式(即通常不是最佳)方法都可能有用:

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

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

例如,对于 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 张照片的每个子集,并为每个布局确定最佳缩放和裁剪,请记住,生成的矩形可以通过后续步骤放大或缩小。 (最佳性标准的一个好的选择应该具有以下特性:在特定布局下,A、B 和 C 中的每一个的理想缩放和裁剪量不受结果矩形缩放的影响,所以这不应该是问题。)

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

【讨论】:

鉴于我的编程技能和所需的工作量,这是最吸引人的解决方案。谢谢您的意见。我所需要的只是定义足够的布局(我喜欢我对最终结果有一些控制权的事实),包括横向和纵向区域的组合,以最大限度地减少所需的裁剪【参考方案3】:

我根本不会声称这是最佳选择,但这里有一些想法可能会让您尝试。

我将根据 cmets 重新定义问题。我们得到了一个 v x t 大小的矩形 X 和 N 个不同大小的矩形。我们想用 N 个矩形完全覆盖矩形 X。我们可以根据原始尺寸调整图像的大小。我们希望最小化 N 个矩形所覆盖的面积,这些矩形也覆盖矩形 X 的面积。

这里有一个想法:

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

不确定效果如何,但可以尝试一下。

【讨论】:

以上是关于在固定矩形容器中组织矩形的算法的主要内容,如果未能解决你的问题,请参考以下文章

圆形和矩形地理围栏的C逻辑/算法?

模拟--铺地毯

noip2011 总结

P1003 铺地毯

vijos1736-铺地毯

铺地毯(luogu 1003)