背包问题及其对偶问题
文章目录
背包问题回顾
背包问题是一个经典的组合优化问题,通常分为 0-1 背包问题和分数背包问题两种类型。这类问题涉及到在有限的背包容量内,选择一组物品放入背包,以达到某种最优目标,例如最大化价值或最小化重量。
0-1 背包问题(0/1 Knapsack Problem)
描述: 给定一组物品,每个物品都有重量和价值,以及一个固定的背包容量。每个物品要么完全放入背包(选择),要么完全不放入背包(不选择)。目标是在不超过背包容量的前提下,选择物品放入背包,使得放入的物品总价值最大。
数学表达:
M
a
x
i
m
i
z
e
∑
i
=
1
n
v
i
x
i
{\rm{Max}}imize\sum\limits_{i = 1}^n {{v_i}{x_i}}
Maximizei=1∑nvixi
S
u
b
j
e
c
t
t
o
∑
i
=
1
n
w
i
x
i
≤
W
,
0
≤
x
i
≤
1
Subject to \sum\limits_{i = 1}^n {{w_i}{x_i}} \le W,0 \le {x_i} \le 1
Subjecttoi=1∑nwixi≤W,0≤xi≤1
一、对偶问题
对偶问题是与原始问题相关联的一个问题,在优化理论中常常通过引入拉格朗日乘子(Lagrange multipliers)或对偶变量(dual variables)来得到。对偶问题的出现主要是为了从另一个角度对原始问题进行建模,通常通过对原始问题的约束条件引入额外的变量或乘子,以形成对偶问题。
一般来说,对偶问题有助于理解原始问题的结构、性质以及解的特征。通过对原始问题引入对偶问题,我们可以得到关于原始问题的一些信息,例如在何种条件下原始问题是有解的、什么样的解是可能的等等。
在最优化问题中,对偶问题的引入是基于拉格朗日对偶理论。这个理论基于拉格朗日函数的概念,通过引入拉格朗日乘子,将原问题的约束条件转化为对偶问题的目标函数。对于线性规划问题,对偶问题的引入也与线性规划的对偶性质有关。
通常,对偶问题和原始问题之间存在一些关系,包括弱对偶性和强对偶性。这些性质用来描述对偶问题和原始问题解之间的关系,强对偶性意味着原始问题和对偶问题的最优解是相同的。
对于0-1背包的原始问题描述如下:有n件物品,物品i的重量为
w
i
w_i
wi,价值为
v
i
v_i
vi,
1
≤
i
≤
n
1 \le i\le n
1≤i≤n ,背包的重量限制为B,其中涉及到的数值均为整数。求解把哪些物品装入背包才能在不超重的情况下使得价值最大,即——求子集
S
∗
⊆
{
1
,
2
,
3
,
…
,
n
}
{{S^*} \subseteq \left\{ {1,2,3, \ldots ,n} \right\}}
S∗⊆{1,2,3,…,n}使得下式成立。
∑
i
∈
S
∗
v
i
=
max
{
∑
i
∈
S
v
i
∣
∑
i
∈
S
w
i
≤
B
,
S
⊆
{
1
,
2
,
3
,
…
,
n
}
}
\sum\limits_{i \in {S^*}} {{v_i}} = \max \left\{ {\sum\limits_{i \in S} {{v_i}} |\sum\limits_{i \in S} {{w_i} \le B,S \subseteq \left\{ {1,2,3, \ldots ,n} \right\}} } \right\}
i∈S∗∑vi=max{i∈S∑vi∣i∈S∑wi≤B,S⊆{1,2,3,…,n}}对于所有的装法中,
S
∗
S_*
S∗是价值最大的装法。
0-1背包的对偶问题描述:n个物品,物品i的重量是 w i w_i wi,价值 v i i = 1 , 2 , 3 , . . . , n v_i \ i=1,2,3,...,n vi i=1,2,3,...,n,背包预期价值为V,如何选择物品,使得背包达到价值V且重量最轻。
二、0-1背包问题的动态规划算法
1. 0-1 背包对偶问题的动态规划算法
动态规划算法:考虑前k件物品,价值不小于d,至少要装的物品重量
G
k
(
d
)
{G_k}(d)
Gk(d),在装入背包的价值大于等于d的条件下继续装入物品,使其重量最轻即为所求的目标函数。
G
k
(
d
)
=
min
{
∑
i
=
1
k
w
i
x
i
∣
∑
i
=
1
k
w
i
x
i
≥
d
,
x
i
=
0
o
r
1
,
1
≤
i
≤
k
}
,
0
≤
k
≤
n
,
0
≤
d
≤
D
,
D
=
v
1
+
v
2
+
⋯
+
v
n
\begin{array}{l} {G_k}(d) = \min \left\{ {\sum\limits_{i = 1}^k {{w_i}{x_i}} |\sum\limits_{i = 1}^k {{w_i}{x_i}} \ge d,{x_i} = 0 {\rm{ \ or \ }} 1,1 \le i \le k} \right\},\\ 0 \le k \le n,0 \le d \le D,D = {v_1} + {v_2} + \cdots + {v_n} \end{array}
Gk(d)=min{i=1∑kwixi∣i=1∑kwixi≥d,xi=0 or 1,1≤i≤k},0≤k≤n,0≤d≤D,D=v1+v2+⋯+vn
约定:若集合为空集,则没有该重量的装法,赋其函数值为
+
∞
+ \infty
+∞,原问题的解与对偶问题的解存在以下关系:对偶问题的解中,在装入背包的重量小于B的情况下获得的价值最大的解,就是原问题的解。
m
i
n
∅
=
+
∞
,
O
P
T
(
I
)
=
max
{
d
∣
G
n
(
d
)
≤
B
}
min \emptyset = + \infty ,OPT(I) = \max \{ d|{{\rm{G}}_n}(d) \le B\}
min∅=+∞,OPT(I)=max{d∣Gn(d)≤B}
2.0-1背包问题的对偶问题的动态规划算法的递推公式:
G
0
(
d
)
=
{
0
,
i
f
d
=
0
+
∞
,
i
f
d
>
0
{G_0}(d) = \left\{ \begin{array}{l} 0, \ if \ d = 0\\ + \infty \ ,if \ d > 0 \end{array} \right.
G0(d)={0, if d=0+∞ ,if d>0
G
k
+
1
(
d
)
=
{
min
{
G
k
(
d
)
,
w
k
+
1
}
,
i
f
d
≤
v
k
+
1
,
min
{
G
k
(
d
)
,
G
k
(
d
−
v
k
+
1
)
+
v
k
+
1
}
,
i
f
d
≥
v
k
+
1
,
0
≤
k
≤
n
−
1
,
0
≤
d
≤
D
.
\begin{array}{l} {G_{k + 1}}(d) = \left\{ \begin{array}{l} \min \{ {G_k}(d),{w_{k + 1}}\} \ , \ if \ d \le {v_{k + 1}},\\ \min \{ {G_k}(d),{G_k}(d - {v_{k + 1}}) + {v_{k + 1}}\} \ , \ if \ d \ge {v_{k + 1}}, \end{array} \right.\\ 0 \le k \le n - 1,0 \le d \le D. \end{array}
Gk+1(d)={min{Gk(d),wk+1} , if d≤vk+1,min{Gk(d),Gk(d−vk+1)+vk+1} , if d≥vk+1,0≤k≤n−1,0≤d≤D.
3.算法描述
伪码描述:
三、0-1背包问题对偶问题的近似算法
完全多项式时间近似方案:以 ε \varepsilon ε (误差)和问题的实例 I 作为输入,时间复杂为二元多项式时间复杂为二元多项式p( ∣ I ∣ \left| I \right| ∣I∣, 1 / ε 1 / \varepsilon 1/ε),且对每一个固定的 ε > 0 \varepsilon>0 ε>0,算法的近似比为1+ ε \varepsilon ε。
1、算法的基本思想:
输入
ε
\varepsilon
ε和实例I:
1.计算比例b:b =
max
{
⌊
v
max
(
1
+
(
1
/
ε
)
)
⌋
,
1
}
\max \left\{ {\left\lfloor {\frac{{{v_{\max }}}}{{(1 + (1/\varepsilon ))}}} \right\rfloor ,1} \right\}
max{⌊(1+(1/ε))vmax⌋,1}
2.价值缩小b倍:令 v i ′ = ⌈ v i / b ⌉ {v'_i} = \left\lceil {{v_i}/b} \right\rceil vi′=⌈vi/b⌉, 1 ≤ i ≤ n 1 \le i \le n 1≤i≤n。把所有 v i v_i vi换成 v ′ i {{v'}_i} v′i,记作新的实例 I ′ {I'} I′。
3.对 I ′ {I'} I′应用算法1得到解S,把S取作实例I的解。
算法设计思想总结:将0-1背包问题转换为对偶问题,以物品项数、价值作为参数,用动态规划自底向上迭代计算;将物品价值等比例缩小,相当于每组取一个近似价值作为代表,以加快对偶问题动态规划算法的运行。
2、算法描述
伪码如下:
四、对比
算法的性能比较
0-1背包问题的对偶问题的动态规划算法的递推公式(7)(8),可推出时间复杂度为
O
(
n
D
)
=
O
(
n
2
v
max
)
O(nD) = O({n^2}{v_{\max }})
O(nD)=O(n2vmax),是伪多项式时间算法。
0-1背包对偶问题的近似算法FPTAS采用的是1+ ε \varepsilon ε–近似算法:算法时间复杂度为 O ( n 3 ( 1 + 1 / ε ) ) O({n^3}(1 + 1/\varepsilon )) O(n3(1+1/ε))
性能结果对比:
伪多项式时间算法的时间复杂度是关于问题规模 n 和背包总价值D的多项式,因此对于较小的问题规模n和背包总价值D,它的性能可能更好。
近似算法FPTAS的时间复杂度包含了问题规模 n n n和误差的倒数 1 / ε {1 / \varepsilon } 1/ε。当误差要求 ε \varepsilon ε较小时,算法的性能较好,但随着 ε \varepsilon ε的增大,时间复杂度会相应的增加。这个算法是近似算法,它在寻找接近最优解的解时具有较好的性能,但不保证找到最优解。
选择动态规划算法还是伪多项式时间算法取决于具体的问题规模和对解的精确性的要求。如果问题规模较小且需要确切的最优解,动态规划算法可能更为适用。但如果问题规模很大,而对精确解的要求相对较低,伪多项式时间算法可能更具优势。在实际应用中,需要根据具体情况权衡时间、空间和解的质量。