Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 多袋单重背包_Algorithm_Knapsack Problem - Fatal编程技术网

Algorithm 多袋单重背包

Algorithm 多袋单重背包,algorithm,knapsack-problem,Algorithm,Knapsack Problem,我正在尝试解决这个问题,我想知道是否有已知的现有算法/解决方案来解决这个问题 问题: 我有n个袋子和n件物品(重量相等或不同)要装进这些袋子里。每个袋子都有一定的重量限制,n个物品需要放在袋子里,这样我可以使用每个袋子的最大空间 这些袋子大小相等。我也想知道如何解决大小不等的袋子 我读到的大多数解决方案都是试图解决一个0/1背包的重量和价值。我应该考虑重量和价值相同吗?我走对了吗 这不是一个家庭作业问题。这被称为(NP难) 通过简单地按大小按降序排序,然后将每个项目插入列表中具有足够剩余空间的第

我正在尝试解决这个问题,我想知道是否有已知的现有算法/解决方案来解决这个问题

问题:

我有n个袋子和n件物品(重量相等或不同)要装进这些袋子里。每个袋子都有一定的重量限制,n个物品需要放在袋子里,这样我可以使用每个袋子的最大空间

这些袋子大小相等。我也想知道如何解决大小不等的袋子

我读到的大多数解决方案都是试图解决一个0/1背包的重量和价值。我应该考虑重量和价值相同吗?我走对了吗

这不是一个家庭作业问题。

这被称为(NP难)

通过简单地按大小按降序排序,然后将每个项目插入列表中具有足够剩余空间的第一个箱子,我们得到
11/9 OPT+6/9
箱子(其中
OPT
是最佳解决方案中使用的箱子数量)。这很容易就需要
O(n²)
,或者可能需要
O(n log n)
的高效实现

在最优解方面,没有一个动态规划解像背包问题那样广为人知。有一个选择-基本思想是:

上面的数组索引实际上是一个集合-将其视为集合到值、位图或多维数组的映射,其中每个索引为1或0,以指示是否包含对应于该维度的项

链接资源实际上考虑了多种类型,这些类型可能会出现多次——我从中得出了上述解决方案

运行时间将在很大程度上取决于一个袋子可以容纳的物品数量-它将是
O(minimumBagsUsed.2maxItemsPerBag)

对于1个袋子,这基本上是一个问题。为此,您可以考虑与值相同的值,并使用背包算法求解,但这对于多个包来说并不是很好。

为什么不呢?考虑项目>代码> 5、5、5、9、9、9/代码>袋子大小<代码> 16 < /代码>。如果只解子集和,则一个包中的
5,5,5
,每个包中的
9
(总共
4
个包),而不是三个包中的
5,9


子集和/背包已经是一个困难的问题-如果使用它不能给你一个最优的解决方案,你可以使用上面的排序/贪婪方法。

行李大小是否相同?是的,行李大小相同。我也想知道如何解决大小不等的袋子的问题。这难道不等于用装满袋子后剩下的剩余货物装满袋子的问题吗?不等大小(可能)更难。我应该考虑重量和价值是相同的吗?你想用最少的袋子(每个袋子中的最大空间有点不清楚)吗?值得一提的是,尽管精确的解决方案一般很难得到,但是存在一个简单的11/9 OPT + 1近似(可以推广到)。(1+eps)对于常数eps,多项式时间内的OPT+1)@Jonathan setting weight=profit产生了Dukeling提到的子集和问题,这显然不能解决多个问题bin@Jonathan考虑“代码> > 5、5、5、9、9、9/代码>包大小<代码> 16 >代码>如果只求解子集和,则在一个包中留下< >代码> 5、5、5 < /代码>和一个包中的代码> 9 < /代码>ch(对于总共
4个
bags),而不是
3个
bags中的每个
5,9个
。背包已经是一个难题-如果使用它不能给你一个最佳的解决方案,你还可以使用答案中提到的贪婪方法。@Jonathan排序它们(按降序排列)要获得
9,9,9,5,5
。然后将3个9逐个插入单独的袋子中(因为它们不能装入同一个袋子中)。然后插入5个。前5个与9一起放入第一个袋子,因此放入其中。第二个5个不放入第一个袋子,但放入第二个袋子。第三个5个不放入前两个袋子,因此放入第三个袋子。因此,我们在三个袋子中的每一个袋子中都有
5,9
。@用于装箱的排序/贪婪算法Jonathan并不总是产生最佳结果,因此,另一种非最佳算法有时可能会产生更好的结果,这是理所当然的。正如我在回答中提到的,背包是一个困难的问题-为每个袋子找到最佳解决方案将花费非常长的时间来解决中等规模的问题,或者你也可以使用近似算法来解决-在这两种情况下,排序/贪婪算法在大多数情况下都可能是首选。
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