Algorithm &引用;松散的;装箱算法

Algorithm &引用;松散的;装箱算法,algorithm,bin-packing,Algorithm,Bin Packing,我想不出该怎么称呼它,所以我的谷歌搜索也出现了问题 我正在做一些类似于基本的事情,但有一些改动让我感到困惑 箱子的数量始终为3个,且所有3个箱子的尺寸始终相同(等于所有物品尺寸总和的1/3) 每件物品都必须放在箱子里 如果物品不能完全放入一个箱子中,则可以将其“分割”成多个连续的箱子将此最小化 有了这三个标准(尤其是3),我不确定这个问题是否是NP难问题,但第四个标准使这个问题成为我所谓的“松散”问题 箱子大小不必严格执行。如果一个物品被“过度填充”到一个箱子中,比如说,超过箱子大小的10%,这

我想不出该怎么称呼它,所以我的谷歌搜索也出现了问题

我正在做一些类似于基本的事情,但有一些改动让我感到困惑

  • 箱子的数量始终为3个,且所有3个箱子的尺寸始终相同(等于所有物品尺寸总和的1/3)
  • 每件物品都必须放在箱子里
  • 如果物品不能完全放入一个箱子中,则可以将其“分割”成多个连续的箱子将此最小化
  • 有了这三个标准(尤其是3),我不确定这个问题是否是NP难问题,但第四个标准使这个问题成为我所谓的“松散”问题

  • 箱子大小不必严格执行。如果一个物品被“过度填充”到一个箱子中,比如说,超过箱子大小的10%,这是可以的,但前提是它可以容纳整个物品(对于零碎的物品不要过度填充)
  • 这仍然是一个结构性问题,还是我把我的标准搞得一团糟,以至于几乎无法解决

    如果你好奇的话,我用这个来呈现3列(箱子),其中包含很多(或很少)类别(项目),包含很多(或很少)链接


    目标语言是PHP,但现在最好使用伪代码。

    为了将来的访问者,我想我应该回答自己的问题

    Loop through items largest to smallest
    Does it fit wholly (overstuffing ok) in the first open bin? ...Yes
        Place it
    ...No
        Does it fit wholly (overstuffing ok) in the next bin? ...Yes
            Place it
        ...No
            Does it fit wholly (overstuffing ok) in the last bin? ...Yes
                Place it
            ...No
                //Place in first open bin, expecting a fragmentation
                Place x "units" of item until bin size reached (no overstuffing)
                Place y "units" of item until bin size reached (no overstuffing), starting at index x into item
                If x+y is still less than item size, place rest in last bin.
    

    如果增加bin导致索引超出范围,它只会将其视为“否”。可能不是最整洁的实现,但到目前为止它对我很好。显然,这种方法对于3个箱子是固定的,但我认为它可以合理地扩展到更多(有限)箱子。

    箱子问题之所以困难,是因为它最小化了箱子的数量。既然你看起来并不是真的在“最小化”任何东西,我怀疑这是NP难的。有没有保证时间总是放在箱子里?如果是这样的话,是否有保证可以在不过度填充的情况下完成?事实上,我怀疑您可能可以使用贪婪算法来处理99%的情况。@MooingDuck是的,箱子大小设置为物品大小总和的1/3,因此所有物品都应该完美匹配,但是可以在一些垃圾箱上进行过度填充,以最小化碎片。您希望如何按照要求“最小化碎片”?如果它的意思是“碎片,但只有在绝对必要的情况下”,那么您必须进行完整的非碎片计算,以证明不存在非碎片解决方案。如果它的意思是“做出合理的努力来避免碎片化”,那么你可以定义“合理的努力”,这样这个问题甚至在理论上都不是NP难问题。但是,如果问题足够小,以至于将输出格式化为三列是有意义的,那么它是否是NP难问题可能并不重要。不要犹豫,因为它非常重要。否则,一个解决方案可能是将每件物品的1/3放入三个箱子中。