Excel中的二维装箱

时间:2016-06-17 09:12:36

标签: excel vba excel-vba solver

我正在尝试使用Excel(Formulas,Solver,VBA)找到二维打包问题的解决方案。

但除了找到解决方案之外,我想把这个话题作为讨论的基础,因为我在扩展的网络搜索中意识到这个问题(或其变体)给许多人带来了麻烦 - 新手和专业人士用户。

我的问题的解释:

我正在尝试将矩形包装在矩形容器中。通常有一个较大的盒子和2-5个较小的盒子可以运送。 平均而言,容器中仍然有30-50%的容量,所以我想计算在这个可用空间中有多少额外的标准化盒子可以装满容器。

  • 没有约束,只要盒子适合容器。
  • 身高和体重无关紧要。
  • 盒子可以旋转90°。
  • 一个40英尺的容器长1203厘米,宽233厘米。
  • 标准化的盒子是85cm x 70cm
  • 其他方框有不同的尺寸。

我检查了bin-packing算法但是到目前为止我还没能在excel中实现任何解决方案。我更喜欢使用Excel Solver或VBA计算它的方法,但我的VBA编程知识有限。

背包问题在我看来并不适用,尽管在这种背景下多次提到过。

在我的情况下,我会很高兴给出一个解决方案给我一些类似的东西:“你可以在容器中装上至少x个额外的盒子”。一些不准确无关紧要 - 意味着比可能的盒子多25%。另一方面,太多的盒子是禁止的。

现在,你们有没有想过如何在这里开始甚至完成这项工作?也许甚至有一个我不知道的超简单近似?

谢谢!

更新

经过一段时间,我终于找到了一些时间再次解决这个问题。

我阅读了Erwin Kalvelagen的Blogposts和一些关于bin打包算法的论文。 此外,解算器选项不在桌面上。 我决定采用左下算法(BLT),但有一些限制(不仅仅是贪婪)。

BLT算法的快速解释:每个框放置在给定区域(容器)的最底部和最左侧位置。当放置一个盒子时,它会创建两个新的“角落”,其中可以放置其余的盒子。最初,这些框按长度排序(从最长的框开始)并将它们放在一个二维数组中。然后起始点将在一个数组(x,y坐标)中设置 - 当我们从一个空容器开始时,第一个坐标显然是0,0。然后算法会尝试将第一个框放在左下角的坐标0,0处 - 这当然可以完美地工作。然后,起始绳索将由一个新角落的坐标替换,并且另一个角落的坐标将被添加到C.这将循环直到所有非标准盒子被装载。然后,如果可能,算法将添加标准化的框(并计算它们)。如果由于约束而无法再添加更多的框,则循环将结束。

非标准框的尺寸将输入到工作表中 - 每行一个框。容器的尺寸和标准化的盒子也将写在那里。

约束条件是,没有框可以与另一个框重叠,并且所有框都必须在容器内。尽管实际上可以进行旋转,但是我没有必要在代码中实现它,因为我试图沿着容器定向包。

这是我发现的BLT算法的一些伪代码:

**Procedure BLF(width, height,maxWidth)**
begin
initialize the arrays x and y
initialize the list and add the null point
for all rectangles
 initialize choosePoint as impossible
 while choosePoint is impossible and j < length of list
  if the rectangle could be placed in a specific point
   choose the point
  endif
 endwhile
 if choosePoint is possible
  update the arrays x and y
  remove the point from the position choosePoint
  from list
  add the points (xi+width,yi),(xi,yi+height) to the points list
 else
  if (width > maxWidth) the problem has no solution
  else xi = 0 and yi = max(heightk + yk)
  where k 2 {1, . . . , i − 1}
  endif
 endif
endfor
solutions: the arrays x and y with (xi, yi)
the coordinates of rectangle i
end

现在,虽然我对包装算法有很多了解(比如真的很多)但我对VBA仍然不是很有经验。特别是没有实现算法。 所以,我很乐意为你提供任何帮助,让我开始实施。

所以我从这开始(我知道它真的没什么,但我觉得很难):

Sub BLT1()

Dim Boxes As Variant, i As Integer, j As Integer ‘’Boxes dimensions
Dim Cntnr As Variant, a As Integer, b As Integer ‘’Container dimensions
Dim BLPoints As Variant ‘’Array with coordinates of bottom-left corners

Boxes = Range("B11:C15")
Cntnr = Range("D2:E2")

‘’Now I would like to add the first coordinates (0, 0) to the BLPoints
‘’Then I want to pick the first box and fit it in the container at the (0, 0) coordinates
‘’Then I want to update the BLPoints array with the new coordinates
…

End Sub

我期待任何建设性的反馈和建议!

1 个答案:

答案 0 :(得分:1)

这不是一个非常容易的问题。一些可能的方法是:

  • MIP(混合整数规划)模型。最复杂的部分是无重叠约束。对于容器中的每个盒子,我们需要确保它不占用另一个盒子所使用的空间。 MIP方法的优势在于我们可以找到最佳解决方案,或者非常好的解决方案,并指出我们远离可能的最佳解决方案(即解决方案质量的指示)。
  • 约束编程模型。与MIP模型类似,但是一些构造更容易处理(即,构造无重叠约束所需的OR构造)。
  • 启发式或元启发式方法。

我快速实施了MIP模型,结果证明您可以非常快速地获得最佳或接近最优的解决方案。使用商业MIP求解器在不到一分钟的时间内找到了以下解决方案:

enter image description here

黄色框是必需的非标准框,蓝色框是可选的标准框。

有关这些无重叠约束的更多信息,请参阅hereHere是此问题的无重叠约束。