背包问题的多项式时间近似解
一些概念
- ∏ \prod ∏ 是一个NP难问题的优化问题
- f ∏ f_{\prod} f∏ 是这个优化问题的目标函数,也就是我们要优化得到的近似解
- I 是问题实例
- ϵ \epsilon ϵ 是错误参数,我们得到的近似算法,有下面的性质
- 如果 Π Π Π是一个最小化问题,则 f Π f_Π fΠ(I,s)≤(1 +ε)· OPT。
- 如果 Π Π Π是一个最大化问题,则 f Π f_Π fΠ(I,s)≥(1-ε)· OPT。
PTAS:Polynomial-Time Approximation Scheme ,多项式时间的近似模式,对于任意一个整数ε,这个模式的执行时间不超过问题实例规模n的多项式。这个多项式能随着 ϵ \epsilon ϵ的减小而增长得十分迅速。如 O ( n 2 ϵ ) O(n^{\frac{2}{\epsilon}}) O(nϵ2)
FPTAS:Fully Polynomial-Time Approximation Scheme,完全多项式时间的近似模式,由于PTAS中,多项式时间受到 ϵ \epsilon ϵ的约束是任意的,那么,这个多项式可能增长得很快,因此,我们希望多项式受到的约束是 1 ϵ \frac{1}{\epsilon} ϵ1的,这样多项式的增长就不会因为 ϵ \epsilon ϵ的变化而增长得很快。如本文中讲提到的背包问题的近似算法的时间复杂度为 O ( n 3 ϵ ) O(\frac{n^3}{\epsilon}) O(ϵn3)
【下面这部分是来自别的博客,因此放上图片】
【这一部分其实没有特别好的理解】
在下文中,我们能将以
I
I
I来作为实例的输入规模,
I
u
I_u
Iu保存这些二进制数据的一元形式。(
I
u
I_u
Iu will denote instance I with all numbers occurring in it written in unary. The unary size of instance
I
I
I, denoted
∣
I
u
∣
|I_u|
∣Iu∣, is defined as the number of bits needed to write
I
u
I_u
Iu.)
问题Π的算法,在实例
I
I
I的运行时间受|
I
u
I_u
Iu |中的多项式限制 将被称为伪多项式时间算法
背包问题是NP难的问题,没有多项式时间算法,但是有伪多项式时间算法, 这个算法是基于动态规划的。
背包问题的伪多项式时间算法
伪多项式算法大多采用的是动态规划的方式,因此,我们可以通过一个背包问题的例子来了解。
动态规划的主要方式就是采用bellman-fold方程,这个方程的主要思想就是递归。下面是最优子结构的思想。
1.当前的物品是i,容量为j,如果物品的重量
W
i
W_i
Wi>j,那么放不下,f(i,j)=f(i-1,j)。这个式子表示,往回看重量更轻的物品,容量不改变(因为本轮没有放入物品)
2.放得下,那么,是放入这个物品好呢,还是不放,留这个空间好呢?
所以进行递归调用操作,计算两种结果,首先是不放这个物品,留下空间,那么就是f(i-1,j);其次,放下物品,那么对应要加上这个物品的价值,可存放物品数i-1,容量j也要减掉对应物品的重量
W
i
W_i
Wi。也就是式子
v
i
+
f
(
i
−
1
,
j
−
w
i
)
v_i+f(i-1,j-w_i)
vi+f(i−1,j−wi).这两种情况取一个max,要这两种情况下获利最大的。
3.如果可以放入的物品i=0,或者容量为0,那么就无法放入物品了,当前的f(i,j)=0。
递归是自顶向下的构造方式,如果每一次的计算都要递归的话,会重复计算多次,所以,如果我们可以自底向上做。就是,先构造一个表,表里对应着每一个f(i,j)的最优值,那么,做到后面的时候,只需要查前面的表就可以。
构造出来的最优值表是这样的(四个物品,可以承受的总重j为5)
对应的最优子结构是这样的
比如对于f(4,5)来说,就是需要max{f(3,5),13+f(3,1))}.根据f表中元素可知,f(3,5)=22,13+f(3,1)=13+6=19,因此选择了f(3,5)。其余类似。
这个算法需要填的表的大小是n×V,其中V=
∑
i
=
1
n
v
i
∑^n_{i=1}v_i
∑i=1nvi,因此这个算法时间复杂度是O(n×V).
这个动态规划算法中,得到的时间复杂度O(nV)n是顶点数,V为容量。其中只有V不是多项式相关的,那么,如果我们做一个简化,让V变成多项式相关的,这个算法就变成了多项式算法了。
令
v
i
^
=
⌊
v
i
K
⌋
\widehat{v_i}=\lfloor\frac{v_i}{K}\rfloor
vi
=⌊Kvi⌋
其中,K为伪多项式的V转换成多项式算法的
v
i
^
\widehat{v_i}
vi
的关键,下面的主要部分是在求K的表达式
利用动态规划算法求出这个新集合
v
i
^
\widehat{v_i}
vi
的收益最大的集合
S
^
\widehat{S}
S
假设opt最优的集合为
O
O
O[注意这个O是对于背包问题的最优]
有 ∑ i ∈ S ^ v i ^ ≥ ∑ i ∈ O v i ^ \sum_{i\in\widehat{S}}\widehat{v_i}\ge\sum_{i\in O}\widehat{v_i} i∈S ∑vi ≥i∈O∑vi
右式的含义是,在之前经过动态规划可以得到的最优解中的那些物品i,每个i的价值 v i v_i vi都经过运算 v i ^ = ⌊ v i K ⌋ \widehat{v_i}=\lfloor\frac{v_i}{K}\rfloor vi =⌊Kvi⌋然后把这些加起来。
两边乘上K
K
∗
∑
i
∈
S
^
v
i
^
≥
K
∗
∑
i
∈
O
v
i
^
K*\sum_{i\in\widehat{S}}\widehat{v_i}\ge K*\sum_{i\in O}\widehat{v_i}
K∗i∈S
∑vi
≥K∗i∈O∑vi
因为
⌊
v
i
K
⌋
≥
v
i
K
−
1
\lfloor\frac{v_i}{K}\rfloor\ge\frac{v_i}{K}-1
⌊Kvi⌋≥Kvi−1
两边乘上K,有
K
∗
⌊
v
i
K
⌋
≥
v
i
−
K
K*\lfloor\frac{v_i}{K}\rfloor\ge v_i-K
K∗⌊Kvi⌋≥vi−K
有
s
o
l
=
K
∗
∑
i
∈
S
^
v
i
^
=
∑
i
∈
S
^
K
∗
v
i
^
≥
∑
i
∈
O
(
v
i
−
K
)
≥
o
p
t
−
n
K
sol=K*\sum_{i\in\widehat{S}}\widehat{v_i}=\sum_{i\in\widehat{S}}K*\widehat{v_i}\ge\sum_{i\in O}(v_i-K)\ge opt-nK
sol=K∗i∈S
∑vi
=i∈S
∑K∗vi
≥i∈O∑(vi−K)≥opt−nK
最后一个不等式成立的原因,是把
∑
\sum
∑符号打开,
∑
i
∈
O
v
i
=
o
p
t
,
∑
i
∈
O
K
<
=
n
K
\sum_{i\in O}{v_i}=opt,\sum_{i\in O}K<=nK
∑i∈Ovi=opt,∑i∈OK<=nK
如果我们想(下为所需证)(sol我猜是solution的缩写,此处意为多项式时间近似算法)
s
o
l
o
p
t
≥
1
−
ϵ
\frac{sol}{opt}\ge1-\epsilon
optsol≥1−ϵ
然后
o
p
t
−
n
K
o
p
t
≥
1
−
ϵ
\frac{opt-nK}{opt}\ge1-\epsilon
optopt−nK≥1−ϵ
左边有个
o
p
t
o
p
t
\frac{opt}{opt}
optopt,可以化成1和右边抵消,再去掉负号后可以得到下面的式子
然后就有
n
∗
K
o
p
t
≤
ϵ
\frac{n*K}{opt}\le\epsilon
optn∗K≤ϵ
我们只需要找到opt的最小值即可。
那么opt显然是大于能放进这个背包中的物体中最大的那一个价值的。
记为P
那么就可以得到K
K
=
ϵ
∗
p
n
K=\frac{\epsilon*p}{n}
K=nϵ∗p
下面再来分析一下这个多项式时间算法的时间复杂度
∑
i
∈
S
v
i
^
=
∑
i
∈
S
⌊
v
i
K
⌋
<
⌊
∑
i
∈
S
v
i
k
⌋
\sum_{i\in S}\widehat{v_i}=\sum_{i\in S}\lfloor\frac{v_i}{K}\rfloor<\lfloor\sum_{i\in S}\frac{v_i}{k}\rfloor
i∈S∑vi
=i∈S∑⌊Kvi⌋<⌊i∈S∑kvi⌋
⌊
∑
i
∈
S
v
i
k
⌋
=
⌊
∑
i
∈
S
v
i
∗
n
ϵ
∗
p
⌋
\lfloor\sum_{i\in S}\frac{v_i}{k}\rfloor=\lfloor\sum_{i\in S}\frac{v_i*n}{\epsilon*p}\rfloor
⌊i∈S∑kvi⌋=⌊i∈S∑ϵ∗pvi∗n⌋
并且有
∑
i
∈
S
v
i
P
<
n
\sum_{i \in S }\frac{v_i}{P}<n
i∈S∑Pvi<n
然后就有
v
^
<
n
∗
n
ϵ
\widehat{v}<n*\frac{n}{\epsilon}
v
<n∗ϵn
因为伪多项式算法为O(nV),对于V做了处理之后用
v
^
\widehat{v}
v
来代替V,再根据上式,可以得到多项式时间算法为O(
n
3
ϵ
)
\frac{n^3}{\epsilon})
ϵn3)
强NP难问题和FPTAS
强np难问题(Strong NP-hard)
如果NP中的每个问题都可以以一种像是之前背包问题中简化实例中的数字始终以一元形式写入的方式,由多项式简化为Π,那么我们说问题Π是强NP-难的。
A problem Π is strongly
N
P
NP
NP-hard if every problem in
N
P
NP
NP can be polynomially reduced to Π in such a way that numbers in the reduced instance are always written in unary.
大多数已知的NP难问题都是强NP难的,强NP难问题在P≠NP的前提下没有伪多项式时间算法,背包问题不是强NP难的(因为有伪多项式时间算法)
可以用FPTAS近似的算法一定有伪多项式时间算法
设p为多项式,Π为NP难的最小化问题,如:目标函数fΠ是整数值,并且对于任一实例I,由OPT(I)<p(|
I
u
I_u
Iu |)(含|
I
u
I_u
Iu|的多项式)。 如果Π承认FPTAS,则它也承认伪多项式时间算法。
假设有一个Π问题的FPTAS,其实例I上的运行时间和误差参数ε是q(| I |,1/ϵ),其中q是多项式。在实例I上,将错误参数设置为
ϵ
=
1
p
∣
I
u
∣
\epsilon=\frac{1}{p|I_u|}
ϵ=p∣Iu∣1,然后运行FPTAS。 现在,产生的解将的目标函数值小于或等于:
(
1
+
ε
)
O
P
T
(
I
)
<
O
P
T
(
I
)
+
ε
p
(
∣
I
u
∣
)
=
O
P
T
(
I
)
+
1.
(1 + ε)OPT(I) < OPT(I) + εp(|I_u|) = OPT(I)+1.
(1+ε)OPT(I)<OPT(I)+εp(∣Iu∣)=OPT(I)+1.
其中,
O
P
T
(
I
)
<
p
(
∣
I
u
∣
)
OPT(I)<p(|I_u|)
OPT(I)<p(∣Iu∣)这个式子应该是题目给出来前提条件,可以理解为,P是多项式,
I
u
I_u
Iu是点实例I所有数字一元形式,比如背包问题中的价值
v
i
v_i
vi,p(|
I
u
I_u
Iu|)就是一元形式的多项式,[大概类比一下背包问题中的最优解和近似最优解,最优解肯定是小于近似最优解的]
实际上,使用此错误参数,FPTAS将被迫产生最优解。 运行时间将为q(| I |,p(| I u I_u Iu |)),即多项式在| I u I_u Iu |上。 因此,我们获得了针对Π的伪多项式时间算法。以下推论适用于大多数已知的NP难题。推论8.6令Π是满足定理8.5的限制。 如果Π是强NP难的,那么在假设P≠NP的前提下不承认FPTAS算法。
如果Π接受FPTAS,那么根据8.5,它就承认伪多项式时间定理,但他不是强NP-难的,在假设P≠NP,导致矛盾。
总结:强NP难问题没有伪多项式时间算法,根据之前所说伪多项式时间算法大多是采用动态规划而得来的,因此强NP难问题不能采用动态规划得到伪多项式算法。有了伪多项式时间算法,才可以使用FPTAS来进行近似,得到一个近似算法。