📅  最后修改于: 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
这是最佳解决方案。选择任何不同的项目组合,我们都无法获得更多利润。