📜  DAA-小背包

📅  最后修改于: 2021-01-12 03:33:23             🧑  作者: Mango


使用称为背包问题的众所周知的问题,可以很好地理解贪婪算法。尽管可以通过采用其他算法方法来解决相同的问题,但贪婪方法可以在适当的时间内合理地解决分数阶背包问题。让我们详细讨论背包问题。

背包问题

给定一组项目,每个项目都有一个权重和一个值,请确定要包含在集合中的项目子集,以使总权重小于或等于给定的限制,并且总值尽可能大。

背包问题在组合优化问题中。在现实世界中许多更复杂的数学模型中,它似乎是一个子问题。解决难题的一种通用方法是:确定最严格的约束条件,忽略其他约束条件,解决背包问题,并以某种方式调整解决方案以满足被忽略的约束条件。

应用领域

在资源分配的许多情况下,加上一些约束,可以以类似背包问题的方式得出该问题。以下是一组示例。

  • 寻找最浪费的方式来削减原材料
  • 投资组合优化
  • 减少库存问题

问题场景

小偷正在抢劫商店,并且可以在背包中携带最大重量的W。有可用的n个项目在商店和重量第i项为w i和它的利润是P I。小偷应该带些什么?

在这种情况下,物品的选择应使小偷携带那些他将获得最大利润的物品。因此,小偷的目的是使利润最大化。

根据项目的性质,背包问题被分类为

  • 小背包
  • 背包

小背包

在这种情况下,物品可以分成较小的碎片,因此小偷可以选择物品的一部分。

根据问题陈述,

  • 店里有n件商品

  • i商品的重量$ w_ {i}> 0 $

  • i项目$ p_ {i}> 0 $的利润,以及

  • 背包容量为W

在此版本的背包问题中,项目可以分解成较小的部分。因此,小偷可能只占i项目的分数x i

$$ 0 \ leqslant x_ {i} \ leqslant 1 $$

i项目贡献的权重$ X_ {I} {.w_ I} $在背包和利润$ X_ {I} {.p_ I} $利润总额的总重量。

因此,该算法的目的是

$$ maximize \:\ displaystyle \ sum \ limits_ {n = 1} ^ n(x_ {i} .p _ {} i)$$

受约束,

$$ \ displaystyle \ sum \ limits_ {n = 1} ^ n(x_ {i} .w _ {} i)\ leqslant W $$

显然,最佳解决方案必须准确地填充背包,否则我们可以添加剩余项目之一的一部分,从而增加整体利润。

因此,通过

$$ \ displaystyle \ sum \ limits_ {n = 1} ^ n(x_ {i} .w _ {} i)= W $$

在这种情况下,首先我们需要根据$ \ frac {p_ {i}} {w_ {i}} $的值对这些项目进行排序,以便$ \ frac {p_ {i} +1} {w_ {i } +1} $≤$ \ frac {p_ {i}} {w_ {i}} $。在此, x是用于存储项目分数的数组。

Algorithm: Greedy-Fractional-Knapsack (w[1..n], p[1..n], W) 
for i = 1 to n 
   do x[i] = 0 
weight = 0 
for i = 1 to n 
   if weight + w[i] ≤ W then  
      x[i] = 1 
      weight = weight + w[i] 
   else 
      x[i] = (W - weight) / w[i] 
      weight = W 
      break 
return x

分析

如果提供的项目已经按照$ \ mathbf {\ frac {p_ {i}} {w_ {i}}} $$的降序进行排序,则while循环将花费O(n)的时间;因此,包括排序在内的总时间为O(n logn)

让我们考虑一下背包W的容量= 60和所提供物品的列表如下表所示-

Item A B C D
Profit 280 100 120 120
Weight 40 10 20 24
Ratio $(\frac{p_{i}}{w_{i}})$ 7 10 6 5

由于所提供的项目未基于$ \ mathbf {\ frac {p_ {i}} {w_ {i}}} $进行排序。排序后,各项如下表所示。

Item B A C D
Profit 100 280 120 120
Weight 10 40 20 24
Ratio $(\frac{p_{i}}{w_{i}})$ 10 7 6 5

根据$ \ frac {p_ {i}} {w_ {i}} $对所有项目进行排序之后。首先,选择所有B ,因为B的重量小于背包的容量。接下来,选择项目A ,因为背包的可用容量大于A的重量。现在,选择C作为下一项。但是,由于背包的剩余容量小于C的重量,因此无法选择整个项目。

因此,选择C的分数(即(60-50)/ 20)。

现在,背包的容量等于所选项目。因此,无法选择更多项目。

所选项目的总重量为10 + 40 + 20* (10/20)= 60

而总利润为100 + 280 + 120* (10/20)= 380 + 60 = 440

这是最佳解决方案。选择任何不同的项目组合,我们都无法获得更多利润。