Java 给定一些可以旋转的矩形,找到一个面积最小的封闭矩形

Java 给定一些可以旋转的矩形,找到一个面积最小的封闭矩形,java,algorithm,packing,Java,Algorithm,Packing,所以,我正在尝试实现一个算法,它将许多矩形作为输入,并尝试将它们打包成一个面积最小的矩形。所有矩形都可以旋转90度 我意识到这类似于装箱问题,但我无法找到一个好的算法来解释旋转。我发现一篇文章详细讨论了这一点,虽然我理解这篇文章本身,但我希望能找到更简单的东西 有什么建议吗 -编辑- 我想我之前把问题说错了。我们有很多矩形,每个都可以旋转90度。我们需要找到一个适合所有给定矩形的矩形,这样就不会有两个矩形重叠,同时最小化封闭矩形的面积 我在这里面临的问题是,我们被要求找到最小值,而不是给定一个封

所以,我正在尝试实现一个算法,它将许多矩形作为输入,并尝试将它们打包成一个面积最小的矩形。所有矩形都可以旋转90度

我意识到这类似于装箱问题,但我无法找到一个好的算法来解释旋转。我发现一篇文章详细讨论了这一点,虽然我理解这篇文章本身,但我希望能找到更简单的东西

有什么建议吗

-编辑-

我想我之前把问题说错了。我们有很多矩形,每个都可以旋转90度。我们需要找到一个适合所有给定矩形的矩形,这样就不会有两个矩形重叠,同时最小化封闭矩形的面积


我在这里面临的问题是,我们被要求找到最小值,而不是给定一个封闭的矩形并检查给定的矩形是否合适或类似的东西

我使用这个算法得到了很好的结果:

编辑:

我提供的链接中描述的算法将为您提供一个“是”或“否”的答案,即给定的一组矩形是否可以打包到一个特定的封闭矩形中。要找到最小封闭矩形,可以重复运行该算法。基本上,计算封闭矩形的下限和上限,然后进行二元搜索以找到在这些边界内的最小解。我假设封闭矩形在一维中是一个固定的大小(即宽度是恒定的,寻找最小长度,反之亦然)。如果封闭矩形的宽度和长度都允许变化,那么就更难了,这可能不起作用

计算下限和上限的简单(但幼稚)方法如下:

下限-最好的情况是,所有矩形都可以完美地填充,而不会浪费任何空间。因此,求所有输入矩形的面积之和,并计算该区域所需的封闭矩形长度

上界-最坏的情况是每个矩形必须打包在单独的“行”上,因此对于每个输入矩形,计算
min(宽度、高度)
并求和(即,假设输入矩形使用每个输入的最小宽度或高度彼此堆叠,以便输入的其他尺寸不超过封闭矩形的宽度)

如果您再努力一点,您可以显著地改进上下限以减少搜索空间,但这应该给您一个起点