背包问题(英語:Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中,背包的空间有限,但我们需要最大化背包内所装物品的价值。背包问题通常出现在资源分配中,决策者必须分别从一组不可分割的项目或任务中进行选择,而这些项目又有时间或预算的限制。
背包问题的一个例子:应该选择哪些盒子,才能使价格尽可能地大,而保持重量小于或等于15 kg?当然这只是一维的限制条件,还存在多维限制条件的背包问题,比如空间和重量均可设限
背包问题历史悠久,甚至可以追溯到1897年。[1]“背包问题”一词最早出现于数学家托比阿斯·丹齊格的早期研究中,[2]他研究的问题是如何打包行李,要求最大化所选行李的价值且不能超载。
目录
1 应用
2 定义
3 计算复杂度
4 动态规划解法
4.1 无界背包问题
4.2 0-1背包问题
5 二次背包问题
6 参考文献
7 外部链接
应用
编辑
背包问题出现在现实世界很多领域的决策过程中,诸如寻找节约原料的生产方式[3]、选择投资项目及投资组合[4]、选择证券化的资产[5]以及为默克尔-赫尔曼[6]和其他背包密码系统生成密钥。
背包問題的一個早期應用是測驗編製與測驗賦分,受測試者可以選擇他們所需回答的問題。举个例子,受测者需要回答12道题,每道题10分,这时受测者只需要答对10道题就能得到满分100分。但是假如说每道题的赋分不同,问题的选择工作将会变得比较困难。对此,费尔曼和魏斯构建了一个系统,该系统分发给学生一张总分为125分且每道题赋分不等的考卷,学生则去尽力回答所有的问题。利用背包算法,可以算出每个学生可能获得的最高分数。[7]
1999年石溪大学算法库的一项研究表明,在75个算法问题中,背包问题在最受欢迎的问题中排名第19,在最常用的问题中排名第三,仅次于后缀树和集装优化问题。[8]
定义
编辑
我们有n种物品,物品j的重量为wj,价格为pj。
我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。
如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。
可以用公式表示为:
最大化
∑
j
=
1
n
p
j
x
j
{\displaystyle \qquad \sum _{j=1}^{n}p_{j}\,x_{j}}
受限于
∑
j
=
1
n
w
j
x
j
⩽
W
,
x
j
∈
{
0
,
1
}
{\displaystyle \qquad \sum _{j=1}^{n}w_{j}\,x_{j}\ \leqslant \ W,\quad \quad x_{j}\ \in \ \{0,1\}}
如果限定物品j最多只能选择bj个,则问题称为有界背包问题。
可以用公式表示为:
最大化
∑
j
=
1
n
p
j
x
j
{\displaystyle \qquad \sum _{j=1}^{n}p_{j}\,x_{j}}
受限于
∑
j
=
1
n
w
j
x
j
⩽
W
,
x
j
∈
{
0
,
1
,
…
,
b
j
}
{\displaystyle \qquad \sum _{j=1}^{n}w_{j}\,x_{j}\ \leqslant \ W,\quad \quad x_{j}\ \in \ \{0,1,\ldots ,b_{j}\}}
如果不限定每种物品的数量,则问题称为无界背包问题。
各类复杂的背包问题总可以变换为简单的0-1背包问题进行求解。
计算复杂度
编辑
在计算机科学领域,人们对背包问题感兴趣的原因在于:
利用动态规划,背包问题存在一个伪多项式时间算法
把上面算法作为子程序,背包问题存在完全逼近多项式时间方案
作为NP完全问题,背包问题没有一种既准确又快速(多项式时间)的算法
动态规划解法
编辑
无界背包问题
编辑
如果重量w1, ..., wn和W都是非负数,那么用动态规划,可以用伪多项式时间解决背包问题。下面描述了无界背包问题的解法。
简便起见,我们假定重量都是正数(wj > 0)。在总重量不超过W的前提下,我们希望总价格最高。对于Y ≤ W,我们将在总重量不超过Y的前提下,总价格所能达到的最高值定义为A(Y)。A(W)即为问题的答案。
显然,A(Y)满足:
A(0) = 0
A(Y) = max { A(Y - 1), { pj + A(Y - wj) | wj ≤ Y } }
其中,pj为第j种物品的价格。
关于第二个公式的一个解释:总重量为Y时背包的最高价值可能有两种情况,第一种是该重量无法被完全填满,这对应于表达式A(Y - 1)。第二种是刚好填满,这对应于一个包含一系列刚好填满的可能性的集合,其中的可能性是指当最后放进包中的物品恰好是重量为wj的物品时背包填满并达到最高价值。而这时的背包价值等于重量为wj物品的价值pj和当没有放入该物品时背包的最高价值之和。故归纳为表达式pj + A(Y - wj)。最后把所有上述情况中背包价值的最大值求出就得到了A(Y)的值。
如果总重量为0,总价值也为0。然后依次计算A(0), A(1), ..., A(W),并把每一步骤的结果存入表中供后续步骤使用,完成这些步骤后A(W)即为最终结果。由于每次计算A(Y)都需要检查n种物品,并且需要计算W个A(Y)值,因此动态规划解法的时间复杂度为O(nW)。如果把w1, ..., wn, W都除以它们的最大公因数,算法的时间将得到很大的提升。
尽管背包问题的时间复杂度为O(nW),但它仍然是一个NP完全问题。这是因为W同问题的输入大小并不成线性关系。原因在于问题的输入大小仅仅取决于表达输入所需的比特数。事实上,
⌊
l
o
g
2
W
⌋
+
1
{\displaystyle \left\lfloor log_{2}W\right\rfloor +1}
,即表达W所需的比特数,同问题的输入长度成线性关系。
0-1背包问题
编辑
类似的方法可以解决0-1背包问题,算法同样需要伪多项式时间。我们同样假定
w
1
,
w
2
,
…
,
w
n
{\displaystyle w_{1},w_{2},\dots ,w_{n}}
和
W
{\displaystyle W}
都是正整数。我们将在总重量不超过
Y
{\displaystyle Y}
的前提下,前
j
{\displaystyle j}
种物品的总价格所能达到的最高值定义为
A
(
j
,
Y
)
{\displaystyle A(j,Y)}
。
A
(
j
,
Y
)
{\displaystyle A(j,Y)}
的递推关系为:
A
(
0
,
Y
)
=
0
{\displaystyle A(0,Y)=0}
如果
w
j
>
Y
{\displaystyle w_{j}>Y}
,则
A
(
j
,
Y
)
=
A
(
j
−
1
,
Y
)
{\displaystyle A(j,Y)=A(j-1,Y)}
如果
w
j
≤
Y
{\displaystyle w_{j}\leq Y}
,则
A
(
j
,
Y
)
=
max
{
A
(
j
−
1
,
Y
)
,
p
j
+
A
(
j
−
1
,
Y
−
w
j
)
}
{\displaystyle A(j,Y)=\max \lbrace A(j-1,Y),p_{j}+A(j-1,Y-w_{j})\rbrace }
通过计算
A
(
n
,
W
)
{\displaystyle A(n,W)}
即得到最终结果。
为提高算法性能,我们把先前计算的结果存入表中。因此算法需要的时间和空间都为
O
(
n
W
)
{\displaystyle O(nW)}
,通过对算法的改进,空间的消耗可以降至
O
(
W
)
{\displaystyle O(W)}
。
二次背包问题
编辑
推广的背包问题有二次背包问题、多维背包问题、多目标背包问题等。
二次背包问题是背包问题的一种推广形式:
最大化
∑
j
=
1
n
p
j
x
j
+
∑
i
=
1
n
−
1
∑
j
=
i
+
1
n
p
i
j
x
i
x
j
{\displaystyle \sum _{j=1}^{n}p_{j}x_{j}+\sum _{i=1}^{n-1}\sum _{j=i+1}^{n}p_{ij}x_{i}x_{j}}
受限于
∑
j
=
1
n
w
j
x
j
≤
W
,
{\displaystyle \sum _{j=1}^{n}w_{j}x_{j}\leq W,}
x
j
∈
{
0
,
1
}
{\displaystyle x_{j}\in \{0,1\}}
for all
1
≤
j
≤
n
{\displaystyle 1\leq j\leq n}
参考文献
编辑
^ Mathews, G. B. On the partition of numbers (PDF). Proceedings of the London Mathematical Society. 1897-06-25, 28: 486–490 [2022-05-05]. doi:10.1112/plms/s1-28.1.486. (原始内容 (PDF)存档于2012-05-26).
^ Dantzig, Tobias. Number : the language of science The Masterpiece Science. New York: Plume Book. 2007. ISBN 9780452288119.
^ Kellerer, Hans; Pferschy, Ulrich; Pisinger, David. Knapsack problems. Berlin: Springer. 2004: 449 [2022-05-05]. ISBN 978-3-540-40286-2.
^ Kellerer, Hans; Pferschy, Ulrich; Pisinger, David. Knapsack problems. Berlin: Springer. 2004: 461 [2022-05-05]. ISBN 978-3-540-40286-2.
^ Kellerer, Hans; Pferschy, Ulrich; Pisinger, David. Knapsack problems. Berlin: Springer. 2004: 465 [2022-05-05]. ISBN 978-3-540-40286-2.
^ Kellerer, Hans; Pferschy, Ulrich; Pisinger, David. Knapsack problems. Berlin: Springer. 2004: 472 [2022-05-05]. ISBN 978-3-540-40286-2.
^ Feuerman, Martin; Weiss, Harvey. A Mathematical Programming Model for Test Construction and Scoring. Management Science. April 1973, 19 (8): 961–966. JSTOR 2629127. doi:10.1287/mnsc.19.8.961.
^ Skiena, S. S. Who is Interested in Algorithms and Why? Lessons from the Stony Brook Algorithm Repository. ACM SIGACT News. September 1999, 30 (3): 65–74. CiteSeerX 10.1.1.41.8357 . ISSN 0163-5700. S2CID 15619060. doi:10.1145/333623.333627.
外部链接
编辑
二次背包问题源代码链接 (页面存档备份,存于互联网档案馆)
Copyright © 2022 日本世界杯_林高远世界杯 - edenyn.com All Rights Reserved.