0

我正在尝试解决以下问题。给定 192 件具有指定长度和宽度的物品,我想找到一个最小化总表面积的包装订单。这些项目都具有相同的高度(未指定)。每个包裹不能包含超过 12 件物品,并且由于物品的尺寸,同一层中不能存放超过 1 件物品。如果一个项目的宽度和长度不超过下方项目的宽度和长度,则该项目只能堆叠在另一个项目的顶部。

目标是最小化总表面积,即最大物体的表面(在底部)。

我找到了大量关于托盘和垃圾箱装载的文献,但我无法弄清楚我到底需要什么。这是我想出的:

1)选择具有最大表面(宽度*长度)的项目i并将其放在堆栈j的底部。

2)选择具有第二大表面的项目i

a) 如果它的宽度和高度不超过堆栈 j 的底部项目的宽度和高度,则将其放在堆栈 j=1 中的底部项目的顶部

b) 如果它的宽度和高度确实超过了堆栈 j 的底部项目的宽度和高度,则旋转该项目。如果合适,将其放在堆栈 j=1 的底部项目的顶部。

c) 如果旋转后的item的宽度和高度超过stack j的底部item的宽度和高度,将它放在stack j+1 = 2的底部

3)选择具有第三大表面的项目并重复步骤a,b和c

等等...

有什么意见或提示吗?我不知道这是否会产生(最佳)解决方案。

4

1 回答 1

1

只是一个思考的提示:“可以堆叠在顶部”约束定义了项目的部分排序。偏序可以通过拓扑排序表示为图。

现在您可以考虑从每个项目开始的路径,长度不超过 12。可以通过迭代地从图中删除这些路径来尝试尝试性解决方案,直到图耗尽。(当您删除一条路径时,您将不得不修复与它有共同项目的其他路径。)

用路径表示的问题可能比用节点表示的问题更容易解决。

必须解决一个问题:删除路径时,它是否总是具有最大长度,或者较短的路径能否产生更好的全局解决方案?

于 2012-07-21T11:04:46.490 回答