带约束的矩形包装

And*_*nck 12 algorithm optimization packing mathematical-optimization

我想打包一组矩形(例子):

在此输入图像描述

因此总高度尽可能低,矩形必须在它们开始的同一列中结束. 矩形允许彼此"移动"以达到最终状态,只要它们不' t在末尾相交.

我们当前的算法是处理从最大高度到最小高度的矩形,并将它们放在可用的最低y位置.有更优化的算法吗?

编辑:我不一定需要最优解决方案,任何生成比当前解决方案更好的解决方案的算法都很有趣.此外,矩形的数量约为50.

Tim*_*lds 6

假设你有N矩形.对于每个矩形i,[a_i, b_i]设为水平跨度,h_i设为高度.

您的解决方案空间看起来像y_i, i = 1, ..., N,其中矩形的纵向跨度i[y_i, y_i + h_i].

不失一般性,我们可以约束y_i >= 0.然后我们想要最小化目标函数max{y_i + h_i | i}.

您对非重叠矩形的约束是:

y_i + h_i <= y_j
   OR
y_j + h_j <= y_i

for all i != j such that `[a_i, b_i]` and `[a_j, b_j]` intersect
Run Code Online (Sandbox Code Playgroud)

确定哪些[a_i, b_i]相互交叉很容易,因此找出形成这些约束的矩形对应该是直截了当的.

为了摆脱约束中的OR,我们可以z_k为每个约束创建二进制虚拟变量,kM为足够大的"Big M" 创建并重写:

y_i + h_i <= y_j + (z_k)M
y_j + h_j <= y_i + (1-z_k)M

for all i != j such that `[a_i, b_i]` and `[a_j, b_j]` intersect
Run Code Online (Sandbox Code Playgroud)

我们可以引入一个虚拟变量H并添加约束,y_i + h_i <= H以便我们可以将目标函数重写为最小化H.

由此产生的优化问题是:

minimize H
with respect to: y_i, z_k, H
subject to:

 (1) y_i + h_i <= y_j + (z_k)M    for all i != j such that [a_i, b_i]
     y_j + h_j <= y_i + (1-z_k)M  and [a_j, b_j] intersect

 (2) y_i + h_i <= H               for all i

 (3) y_i >= 0                     for all i

 (4) z_k in {0, 1}                for all constraints of type (1) k
Run Code Online (Sandbox Code Playgroud)

这是一个混合整数线性优化问题.您可以直接应用此类问题的常规解算器.

通常情况下,他们将执行的技巧,比如放宽对二元约束z_k的约束z_k[0,1]算法,它变成了这个过程中的线性规划问题,这可以解决非常有效.

建议尝试重塑这些解决方案.