【问题标题】:Algorithm for distribute products to boxes将产品分发到盒子的算法
【发布时间】:2020-10-30 18:40:48
【问题描述】:

我有产品和盒子。我想使用最少的包装箱数进行包装。请忽略产品和包装箱尺寸 (WxHxD)。只关注数量。

我需要一种算法来将这些产品放入盒子中。算法必须使用最小数量的盒子和它可以使用的最小盒子。算法可以使用多个相同的框。每个产品只能使用一次。

我试过这个算法

  • 按数量递增订购产品
  • 将最小的产品放入最大的盒子中,然后将下一个产品添加到盒子中。直到没有下一个的空间。重复直到产品完成。

根据这个算法

  • E 产品到 Z-1 盒(可用空间:2900 cm3)
  • B 产品到 Z-1 盒(可用空间:2700 cm3)
  • F 产品到 Z-1 盒(可用空间:2300 cm3)
  • D 产品到 Z-1 盒子(可用空间:1700 cm3)
  • Z-1 Box 的产品(可用空间:700 cm3)
  • B 产品到 Z-2 盒子(可用空间:1500 cm3)

所以算法使用 2 个 Z Box。但是人脑可以适应 (C+A+F+E)= 3000 cm3 (Z box) 和 (B+D) = 800 cm3 (X Box) 感谢所有 cmets 和回复。

【问题讨论】:

  • 总共有多少箱/产品?
  • 无限制。例如产品数量可以是100,盒子类型只能是一个。
  • 请更好地说明问题。例如,一个盒子里可以装多个产品吗?您想要打包的每种产品有多少?
  • 如果您忽略尺寸,那么这只是一个普通的背包问题,afaict。 en.wikipedia.org/wiki/Knapsack_problem#Solving
  • “算法必须使用最少的盒子数量和它可以使用的最小盒子”你的意思是在考虑盒子大小之前盒子的数量必须是最小的吗?因为您需要指定其中一个标准比另一个更重要。如果没有,请考虑您有 1 个项目 A (1000) 和 1 个项目 E (100) 的情况,这些可以将 A 放入 X 并将 E 放入 T 中,用于 2 个总体积为 1100 的盒子,或者将它们都放入一个盒 V,用于 1 个容量为 2000 的盒。

标签: algorithm


【解决方案1】:

我会计算出将盒子放在一起的最佳方式。

  • 一个 Z 等于一个 V 和一个 X。
  • 一个 V 等于两个 X。
  • 一个 X 等于两个 U。
  • 一个 U 最多等于五个 T(必须能够将至少 2 个框合并为 1 个框才能使任何框合并有意义)。

这一步的计算量可能相当大,具体取决于您拥有多少个盒子以及将它们相互匹配的难易程度。 IE:如果你的盒子大小不是公倍数,这将不那么简单和困难。请参阅https://en.wikipedia.org/wiki/Change-making_problem 了解真正“不错”的盒子尺寸组合的示例(您提供的示例非常好)。

将一个盒子中的所有产品移动到其他盒子,目标是尽可能接近 0 剩余空间,理想情况下,首先寻找导致剩余空间正好为 0 的移动(只需将所有产品放在一个盒子中并移动放到另一个盒子里)。

然后根据上述规则尽可能多地合并这些框,只要它将框的数量减少至少一个即可。 IE:CEF=> V(技术上是E => F,然后是EF => C),A => X, DB => X。然后你可以从那里组合它。 ADB = V(将 2X 框合并为一个 V 框)。

另一个有效选项是:DF => X, BCE => V, A => X。在这种情况下,我们仍然将two X 组合成一个V。也有可能有1 V1 Z 的解决方案,但只有有1X1V 才有意义,否则最好使用2X => 1V

【讨论】:

  • 在许多情况下,这可能不会产生最佳结果,但对于挑选(或四舍五入)盒子尺寸(可能还有产品体积尺寸)有一些话要说,这样它可以 i> 产生最佳结果,否则,您可能无法在合理的时间内使用 100 多种产品获得最佳结果。
【解决方案2】:
determineBox(listOfProducts) {
  create an empty list of boxes listOfBoxes
  VS = sum_of_volume(listOfProducts)
  If there is a box which volume is bigger than VS
    add the smallest box bigger than VS to listOfBoxes
  Else
    create an empty list newListOfProducts
    consider the biggest available box B
    add B to listOfBoxes
    until the sum_of_volume(listOfProducts) become smaller than the volume of B
      drop out of listOfProducts the smallest item
      and add it to newListOfProducts
    merge listOfBoxes with the result of the function determineBox(newListOfProducts)
  returns listOfBoxes
}

这个想法是使用递归函数找到最小的盒子来存储产品的最大值。
对于剩下的产品,我们再次使用该函数。

【讨论】:

    【解决方案3】:

    你会为这样的答案支付多少:

    ==========
    
    Found the following best packing into 2 boxes after 10 trials:
      Box z with space 200.0 cm3 left contains product(s):
        D C E B F
      Box x with space 0.0 cm3 left contains product(s):
        A
    
    END.
    

    这个想法是从选项中进行加权选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-22
      相关资源
      最近更新 更多