📜  多项式时间近似方案

📅  最后修改于: 2021-05-05 02:11:04             🧑  作者: Mango

一个众所周知的事实是,没有关于NP完全问题的多项式时间解,这些问题在现实世界中经常发生(例如,请参见此,此和此)。因此,必须有一种处理它们的方法。我们已经看到了针对这些问题的算法,这些算法为p近似值(例如,旅行推销员的近似值为2)。我们可以做得更好吗?

P olynomial定时pproximation小号cheme(PTAS)是一种类型的,其提供用户到控制精度这是期望的特征的近似算法。这些算法采用了一个附加参数ε> 0,并提供了一个最小化近似(1 +ε)和最大化近似(1 –ε)的解决方案。例如考虑最小化问题,如果ε为0.5,则PTAS算法提供的解为1.5近似值。 PTAS的运行时间必须是n的多项式,但是,它可以是ε的指数。

在PTAS算法中,多项式的指数会随着ε的减小而急剧增加,例如,如果运行时间为O(n (1 /ε)! ),这是一个问题。有更严格的方案,F ully P olynomial定时pproximation小号cheme(FPTAS)。在FPTAS中,算法需要对问题大小n和1 /ε均进行多项式运算。

示例(0-1背包问题):
我们知道0-1背包是NP Complete。为此,有一个基于DP的伪多项式解决方案。但是,如果输入值很高,则解决方案将变得不可行,因此需要近似解决方案。一种近似的解决方案是使用贪婪方法(所有项目的每千克计算值,如果小于W,则将每千克的最高值放在首位),但是贪婪方法不是PTAS,因此我们无法控制准确性。

以下是针对0-1背包问题的FPTAS解决方案:
输入:
W (背包容量)
val [0..n-1] (项目值)
wt [0..n-1] (项目的权重)

  1. 查找最大值的项目,即在val []中查找最大值。将该最大值设为maxVal。
  2. 计算所有值的调整系数k
    k  = (maxVal * ε) / n
  3. 调整所有值,即创建一个新数组val'[],该数组的值除以k。对每个值val [i]进行跟踪。
    val'[i] = floor(val[i] / k)
  4. 运行基于DP的解决方案以减少值,即val'[0..n-1]和所有其他参数相同。

上述解决方案在n和ε的多项式时间内均有效。该FPTAS提供的解决方案约为(1-ε)。想法是将一些值的最低有效位四舍五入,然后将它们限制在多项式和1 /ε的范围内。

例子:

val[] = {12, 16, 4, 8}
wt[]  = {3, 4, 5, 2}
W = 10
ε = 0.5
 
maxVal = 16 [maximum value in val[]]
Adjustment factor, k = (16 * 0.5)/4 = 2.0

Now we apply DP based solution on below modified 
instance of problem.

val'[] = {6, 8, 2, 4}  [ val'[i] = floor(val[i]/k) ]
wt[] = {3, 4, 5, 2}
W = 10

解(1 –ε)* OPT如何?
在此, OPT是最佳值。令S为上述FPTAS算法产生的集合,S的总值为val(S)。我们需要证明

val(S) >= (1 - ε)*OPT 

O为最优解(总值为OPT的解)产生的集合,即val(O)= OPT。

val(O) - k*val'(O) <= n*k 
       [Because val'[i] = floor(val[i]/k) ] 

经过动态编程步骤后,我们得到了一个最适合缩放实例的集合
因此必须至少与选择利润较小的集合O一样好。由此,我们可以得出结论,

val'(S) >= k . val'(O)
              >= val(O) - nk
              >= OPT - ε * maxVal
              >= OPT - ε * OPT [OPT >= maxVal]
              >= (1 - ε) * OPT 

资料来源:
http://math.mit.edu/~goemans/18434S06/knapsack-katherine.pdf
https://zh.wikipedia.org/wiki/多项式时间近似算法