[英]Knapsack with multiple bags and items having only weight
我正在嘗試解決此問題,我想知道是否存在已知的算法/解決方案來解決此問題。
問題:
我有n個袋子和n個物品(相等或不同的重量)可裝入這些袋子。 這些袋子中的每個袋子都有一定的重量限制,因此需要將n個物品放入這些袋子中,這樣我才能在每個袋子中使用最大的空間。
袋子大小相等。 也將想知道如何解決尺寸不等的袋子。
我讀過的大多數解決方案都在嘗試解決具有重量和價值的0/1背包。 我應該認為重量和價值相同嗎? 我在正確的軌道上嗎?
這不是作業問題。
這被稱為垃圾箱包裝問題 (NP難題)。
通過簡單地按其大小對降序進行排序,然后將每個項目插入具有足夠剩余空間的列表中的第一個箱中,我們得到11/9 OPT + 6/9
箱(其中OPT
是最優中使用的箱數解)。 通過有效的實現,這很容易獲得O(n²)
或O(n log n)
。
就最佳解決方案而言,沒有一個背包問題眾所周知的動態編程解決方案。 該資源有一個選項-基本思想是:
D[{set}] = the minimum number of bags using each of the items in {set} Then: D[{set1}] = the minimum of all D[{set1} - {set2}] where set2 fits into 1 bag and is a subset of set1
上面的數組索引實際上是一個集合-可以將其視為集合到值的映射,位圖或多維數組,其中每個索引為1或0以指示我們是否包括與該維度相對應的項。
鏈接的資源實際上考慮了多種類型,這些類型可以多次出現-我從中得出了上述解決方案。
運行時間將在很大程度上取決於可放入袋子的物品數-它將是
O(minimumBagsUsed.2 maxItemsPerBag )
。
在1袋的情況下,這本質上是子集和問題 。 為此,您可以將重量與值視為相同,並使用背包算法求解,但是對於多個袋子來說,這實際上效果不佳。
為什么不? 考慮袋大小為16
物品5,5,5,9,9,9
。 如果僅求解子集總和,則每個袋子剩下5,5,5
,每個袋子剩下9
個(總共4
袋子),而不是3個袋子中的每個5,9
。
子集總和/背包的問題已經很棘手-如果使用它不能為您提供最佳解決方案,那么您也可以使用上面的排序/貪婪方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.