📌  相关文章
📜  通过将小盒子放在大盒子中来最大程度地减少盒子数量(1)

📅  最后修改于: 2023-12-03 15:12:24.795000             🧑  作者: Mango

通过将小盒子放在大盒子中来最大程度地减少盒子数量

简介

在计算机科学中,我们需要解决各种实际问题,并开发相应的算法以确保得到最优解决方案。其中之一是处理包裹/物品的问题,该问题通常需要将物品放入不同大小的盒子中。如何有效地将物品放入尽可能少的盒子中?

一个常见的解决方案是使用所谓的装箱算法。乍一看,这似乎是一件非常简单的事情:将物品排列在一起,并在空间耗尽之前尝试将它们放入盒子中。但是,实际上,这个问题是一个复杂的NP难问题,因此必须使用高效的算法来解决它。

装箱方法

一种简单而直接的解决方案是在放置物品时使用启发式方法,例如将最大的物品放入相应的盒子中并尝试填充空间。但是,这种方法并不一定会生成最优解决方案。

一个更有效的装箱算法是使用递归方法,称为递归最佳适应算法:该算法维护一个可用容量的空间 and smaller boxes are put into a larger box. When the larger box is full, a new larger box is added. The process continues until all items have been packed. The fewer boxes, the better the packing.

def recursive_best_fit(items, bin_size):
    def recursive_best_fit_aux(items, bins, bin_size):
        if not items:
            return bins
        item = items.pop()
        if item <= bin_size:
            mem_cost = float("inf")
            best_bin = None
            for i, bin in enumerate(bins):
                if bin + item <= bin_size:
                    new_bins = list(bins)
                    new_bins[i] += item
                    res = recursive_best_fit_aux(list(items), new_bins, bin_size)
                    if len(res) < mem_cost:
                        mem_cost = len(res)
                        best_bin = new_bins
            if not best_bin:
                best_bin = [item]
                bins.append(item)
            else:
                bins = best_bin
        else:
            res = recursive_best_fit_aux(items, bins, bin_size*2)
            bins = [item] + res
        return bins
    bins = []
    return recursive_best_fit_aux(sorted(items,reverse=True), bins, bin_size)
结论

通过将小盒子放入大盒子中,我们可以最大程度地减少盒子的数量,并使我们的运输更加高效。递归最佳适合算法是一个高效的装箱算法,可以帮助我们在NP难问题领域中获得最优解决方案。