我的问题非常类似于2D背包问题,或切割股票有一个例外......适合容器的矩形可以调整大小和裁剪。但是不允许轮换。
挑战是尽可能减少作物并填满整个容器(无任何间隙)。
有没有人遇到过会做类似事情的算法。任何链接,伪代码都非常赞赏。
保持问题的通用性,但我想应用它来整理固定尺寸页面上的照片。
非常感谢
答案 0 :(得分:5)
首先从确定性最适合减少算法开始:
根据尺寸将矩形从大到小排序
取第一个矩形并将其放入容器(如果适合
取下一个矩形并将其放置在容器中最佳的剩余位置,而不进行裁剪(如果它适合它)。如果有多个选项,请选择离开具有最少边数的剩余区域的选项。重复此步骤,直到容器已满或已使用所有矩形。
如果容器尚未装满,请按相同的顺序浏览未使用的矩形,但这次尝试裁剪。
现在,这不会是完美的。您可以进入类似于此图像中左侧2个解决方案的情况,即使不需要也可以裁剪“无空间”项目:
因此,其次,在第一个结果上抛出一个元启发式算法,例如禁忌搜索或模拟退火。如果您正在寻找一个开源库来帮助您,请查看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的区域。
这是一个想法:
不确定它会怎样,但要尝试一下。