正确的最佳拟合箱包装算法?

时间:2012-09-06 10:14:00

标签: c# bin-packing

我有以下数字 6,8,9,4,3,2,10,7,14,12,6,2,3,1,10,11,13,5

我想知道为这些实现最合适的1D Bin打包算法的正确方法。 因为在这段视频http://www.youtube.com/watch?v=B2P1TzKKWOI&feature=related中,他们的解决方式与我的想法不同,所以我不知道正确答案。

我的解决方案,先到先得,所以:

  • Bin#1:6,8,2
  • Bin#2:9,4,3
  • Bin#3:3,10,1
  • Bin#4:7,6
  • Bin#5:14,2
  • Bin#6:12
  • Bin#7:10
  • Bin#8:11,5
  • Bin#9:13

他们的解决方案,我猜他们将合适的数字“配对”在一起,所以它就像:

  • Bin#1:6,10
  • Bin#2:9,7
  • Bin#3:14,2
  • Bin#4:12,4
  • Bin#5:14,2
  • Bin#6:13,3
  • Bin#7:8,6,2
  • Bin#8:10,5,1
  • Bin#9:11,3

哪一个是正确的?

1 个答案:

答案 0 :(得分:3)

我在评论结束时附上了算法。

@AngelicCore,我认为您的解决方案与视频解决方案之间的根本区别在于您的解决方案是一种“在线”解决方案,而视频中的解决方案则是一种“离线”解决方案。

离线纸箱包装假定包装商拥有关于每件商品的完美信息,并有时间以他或她想要的任何顺序排列。考虑一个带有集结区域的仓库。所有箱子都可以堆叠,托盘化,并根据需要重新订购,直到准备发货。

在线垃圾箱包装通常以先进先出(FIFO)“即时”完成。想象一下,您正在收到从进货卡车到传送带的箱子。物料搬运设备可以快速将所有箱子重新引导至一批出境卡车。

附加说明

箱容量为16.(14 + 13 + 12 + 11 + 10 + 10 + 9 + 8 + 7 + 6 + 6 + 5 + 4 + 3 + 3 + 2 + 2 + 1)/ 16 = 126 / 16~7.87 =>天花板(7.87)=最小8 箱子是下限。

算法

最佳拟合启发式

此启发式尝试在每次分配项目时创建最完整的bin。同样,所有未完成的箱子都保持打开状态。它将下一个项目j放在当前内容最大的bin中,但不要超过Q-qj(因此项目适合)。如果它不适合任何箱子,则打开一个新箱子。

初始化:

给出项目权重列表L = {q1,q2,...,qn}。

将item1放入bin1并从L. Letj = 2中删除,m = 1.

迭代:

  1. 找到剩余容量最小但大于qj的bin i(如果Si是bin i中的项,Q-qk是bin i的剩余容量),则将j放在k∈Sii中。如果j不适合任何箱子,打开一个新箱子并将其编号为m + 1,将j放在箱子m + 1中,让m = m + 1。

  2. 从L中删除项目j。让j = j + 1。

  3. 当项目保留在L中时,请从步骤1开始重复。