近似算法

380114 分钟阅读

对于一个最优化问题的算法,主要有以下三个期望

Note

1.算法需要能找到确切的最优解 2.算法需要能高效(在多项式时间内)运行 3.算法是通用的,需要可以解决一类问题中的所有实例,而不仅仅是单个实例有效

然而,对于某些问腿,我们有可能无法实现以上三个期望,例如NPC问题,所以我们可以退而求其次,做一些妥协;

  • 如果算法舍弃第二个期望,则是用例如回溯等方法在指数时间内解决问题,这对于输入不大的情况是可以接受的;
  • 如果舍弃第三个期望,我们相当于为问题找到一些容易解决的特例;
  • 如果舍弃第一个期望,但我们能保证高效找到的解是和真正的最优解 “相差不大” 的,那么我们称这类算法为近似算法。

基本概念

Definition

假设有某类问题 I\mathcal{I}(例如背包问题),其中的一个具体实例记为 II(当给定问题的参数定义的时候即为一个实例),且有一个复杂度为多项式的近似算法 AA。定义:

  • A(I)A(I) 为算法 AA 在实例 II 上得到的解;
  • OPT(I)\mathbf{OPT}(I) 为实例 II 的最优解。

考虑 II 是最小化问题,若存在 r>1r > 1,对任意的 II 都有:

A(I)rOPT(I),A(I) \leqslant r \cdot \mathbf{OPT}(I),

那么称 AA 为该问题的 rr-近似算法(即对于任何可能的问题实例,AA 给出的解都不会比最优解的 rr 倍大)。我们特别关心其中可以取到的最小 rr,称:

ρ=inf{r:A(I)rOPT(I),I}\rho = \inf\{r : A(I) \leqslant r \cdot \mathbf{OPT}(I), \forall I\}

近似比(approximation ratio),即算法 AA 最紧的近似界。它可以等价定义为:

ρ=supIA(I)OPT(I)\rho = \sup_{\mathcal{I}} \frac{A(I)}{\mathbf{OPT}(I)}

即这个比值在多实例中的比值是最紧的界。反之,如果是最大化问题,那么上述公式改为:

ρ=supIOPT(I)A(I)\rho = \sup_{\mathcal{I}} \frac{\mathbf{OPT}(I)}{A(I)}

将两者合并起来,可以统一写作:

ρ=supI{OPT(I)A(I),A(I)OPT(I)}.\rho = \sup_{\mathcal{I}} \left\{ \frac{\mathbf{OPT}(I)}{A(I)}, \frac{A(I)}{\mathbf{OPT}(I)} \right\}.

由于OPTOPT算法一般是难以确定的,所以确定近似比一般有以下两个步骤

  1. 首先寻找到一个 r>1r > 1,对于任何实例 II,都有 A(I)rOPT(I)A(I) \leqslant r \cdot \text{OPT}(I)(可以首先找到 OPT(I)\text{OPT}(I) 的一个下界 LB(I)OPT(I)\text{LB}(I) \leqslant \text{OPT}(I),然后让 A(I)rLB(I)A(I) \leqslant r \cdot \text{LB}(I) 即可);

  2. 接下来证明 rr 是不可改进的,即对于任意的 ϵ>0\epsilon > 0,都存在在一个实例 IϵI_\epsilon,使得 A(Iϵ)(rϵ)OPT(Iϵ)A(I_\epsilon) \geqslant (r-\epsilon) \cdot \text{OPT}(I_\epsilon)

PTAS

PTAS(多项式时间近似方案,Polynomial time approximation scheme):存在算法 A,使得对每一个固定的 ε>0\varepsilon > 0,对任意的实例 II 都有

A(I)(1+ε)OPT(I) A(I) \leqslant (1+\varepsilon) \cdot \text{OPT}(I)

且算法 AA 的运行时间可以被问题规模 I|I| 的多项式上界所限制。则称 AA 是该问题的一个 PTAS。

理论上,算法 AA 在多项式时间内可以近似:不过不同的 ε\varepsilonAA 的运行时间也可能不可能。例如,如果算法可以给出一个复杂度为 O(I1/ϵ)O(|I|^{1/\epsilon}) 的解,这样算法的表现就会很糟糕,因为指数很大。一般可以将 PTAS 的复杂度记为 O(I(1/ϵ))O(|I|^{(1/\epsilon)})

EPTAS和FPTAS

{==EPTAS (Efficient PTAS)==}: 在 PTAS 的基础上,要求算法 AA 的复杂度是 O(Ic)O(|I|^c),其中 c>0c > 0 是与ε\varepsilon无关的常数。可以将 EPTS 的复杂度记为 IO(1)f(1/ε |I^{O(1)}| f(1/\varepsilon)

{==FPTAS (Fully PTAS)==}: 在 PTAS 的基础上,要求算法 AA 的运行时间关于 I|I|ε\varepsilon 都是多项式项, 即可以将 FPTAS 的复杂度记为 IO(1)(1/ε)O(1)|I|^{O(1)} (1/\varepsilon)^{O(1)}

装箱问题(一维)

问题描述

nn 个物品,每个物品的大小为 sis_i,有若干个箱子,每个箱子的大小为 CC,要求将所有物品放入箱子中,使得每个箱子的大小不超过 CC,并且使得所需的箱子数目尽可能少。

{==给定若干个物品,判断它们是否可由两个箱子装下是 NP 完全的==}

接下来我们默认C=1C=1,即箱子的大小为1,方便讨论。

关于一维装箱问题,除非 P=NPP=NP,否则不存在多项式时间的算法满足

A(I)αOPT(I) A(I) \leqslant \alpha \cdot \text{OPT}(I)

其中 α<32\alpha < \frac{3}{2}

Proof

使用反证法,如果存在近似比小于 32\frac{3}{2} 的算法,那么可以用这个算法AA来解决NPC的判断物品是否可以由两个箱子装下的问题。

  • 如果物品可以由两个箱子装下,那么OPT=2OPT=2,则A(I)<322=3A(I) < \frac{3}{2} \cdot 2 = 3,即A(I)<3A(I) < 3;此时A(I)=2A(I)=2,那么AA可以判断;

  • 如果物品不可以由两个箱子装下,那么OPT3OPT \geqslant 3,则A(I)A(I)至少为33,即A(I)3A(I) \geqslant 3;但是由于近似比小于32\frac{3}{2},所以由A(I)A(I)可以判断此时OPT不可能是22。此时这个近似算法AA就可以判断物品是否可以由两个箱子装下。

综上,我们用多项式算法AA来解决NPC问题,所以只可能有P=NP。

在装箱问题中,我们一般不关心全部的实例,而关心 OPT(I)OPT(I) 较大的那些实例。因此定义 “渐近近似比(asymptotic approximation ratio)” 如下:

Definition

对于一维装箱问题,定义渐近近似比为,对于任意常数 α1\alpha \geqslant 1,对于任意实例 II,存在常数 kk,使得

A(I)αOPT(I)+k A(I) \leqslant \alpha \cdot OPT(I) + k

则称所有满足上式的 α\alpha 的下确界为AA渐近近似比。

kk可以是一个常数,也可以是OPT(I)OPT(I)的一个高阶无穷小。

Quote

装箱问题中,若所有的物品信息在开始装箱前已知,则它是离线(offline)问 题;若初始时物品信息并不全部给出,例如物品在传送带上逐个到达,需要我们即时安排,而我们对未到达物品信息一无所知,同时做出的决定无法更改,此时称为在线(online)问题。“近似比” 通常用来描述离线问题近似算法的性能。而对于在线问题,一般用 “竞争比(competitive ratio)” 的概念。

Next Fit

Next Fit 算法是一种简单的装箱算法,其思想是:对于每个物品,尝试将其放入当前箱子,如果放不下,则{==关闭当前箱子==},并开出一个新箱子,将其放入;

Next Fit 算法有一个性质:相邻两个箱子的大小之和肯定大于1,否则就不需要开新箱子;

根据这个,我们可以证明:

NF(I)2OPT(I)1 NF(I) \leqslant 2 \cdot OPT(I) - 1

OPT(I)NF(I)+12 OPT(I) \geqslant \frac{NF(I) + 1}{2}

换句话说,如果我们的算法的箱子数目用了2M2M个,那么最优解至少要用M+1M+1个箱子。

Proof

S(Bi)S(B_i) 为箱子 BiB_i 中物品的大小之和,那么有:

{S(B1)+S(B2)>1S(B3)+S(B4)>1S(B2M1)+S(B2M)>1\begin{cases} S(B_1) + S(B_2) > 1 \\ S(B_3) + S(B_4) > 1 \\ \ldots \\ S(B_{2M-1}) + S(B_{2M}) > 1 \end{cases}

将所有不等式相加,得到:

i=12MS(Bi)>M\sum_{i=1}^{2M} S(B_i) > M

所以总的大小严格大于 MM,即最优解箱子数目至少为 M+1M+1

事实上NFNF装箱的近似比就是22,不会再有比这个小的了;

下确界的例子

考虑MM组物品,每组物品的大小为12,ε\dfrac{1}{2},\varepsilon,最后再加一个12\dfrac{1}{2},且满足Mε<1M\varepsilon < 1,此时NFNF算法需要M+1M+1个箱子,而最优解需要M/2+1M/2+1个箱子,所以NFNF算法的下确界为22

Any Fit

这是一类的Fit方案,满足: 当物品到达时,除非所有目前打开的箱子都无法装下该物品,才允许打开一个新箱子

主要包括:

  • (FF)First Fit: 按箱子打开的顺序从早到晚检查,将物品放入第一个能放下的箱子中;
  • (BF)Best Fit: 将物品放入剩余空间最小的箱子中,最大化利用箱子空间;
  • (WF)Worst Fit: 将物品放入剩余空间最大的箱子中;

前面的所有 Fit 算法都是在线算法。此外,Any Fit 的三种算法都满足相邻两个箱子物品尺寸之和大于1,因此它们都不会比 NF 差。而前面 NF 的下界实例也适用于 WF,因此 WF 和 NF 一样差。

FF VS BF

从定义上来看,BF最大化利用了空间,似乎表现会比FF好,但是实际上并不能很好判断两者的优劣:

  • 0.5、0.7、0.1、0.4、0.3,FF=2;BF=3;
  • 0.5、0.7、0.3、0.5,FF=3;BF=2;

从上面的例子可以看出,BF并不一定比FF好,FF也不一定比BF好;

FF和BF的近似比都是1.7;

0-1背包问题

基础的2-近似算法

在贪心算法中,如果是解决分数背包问题,那么可以使用贪心算法,是让背包的每一单位重量的价值最大化;但是如果是整数的0-1背包问题,那么有以下反例:

有两个物品,第一个物品的价值为 1,重量为 1,第二个物品的价值为 2,重量为 3,背包的容量为 3。我们的贪心策略是让每单位重量的价值最大化,因此贪心算法的选择结果是选择第一个物品,但实际上最优解显然是选择第二个物品,这样背包的价值为 2,而贪心算法的解为 1。因此贪心算法并不是最优的。

为了得到近似比,我们需要进一步改进我们的贪心算法:我们有两个贪心策略,其一是根据这里的单位重量的价值(profit density),其二是直接贪心选择最大价值的物品,我们运行两个算法选择最优解,我们可以证明,这样结合后的近似比为 2

  • PfracP_{frac} 为分数背包问题的最优解;
  • POPTP_{OPT} 为0-1背包问题的最优解;
  • PgreedyP_{greedy} 为贪心算法的解;
  • pmaxp_{max} 为装得下的物品中价值最大的物品的价值;

那么有

PfracPOPTPgreedypmax P_{frac} \geqslant P_{OPT} \geqslant P_{greedy} \geqslant p_{max}

所以

POPTPgreedyPfracPgreedyPgreedy+pmaxPgreedy2 \dfrac{P_{OPT}}{P_{greedy}} \leqslant \dfrac{P_{frac}}{P_{greedy}} \leqslant \dfrac{P_{greedy}+p_{max}}{P_{greedy}} \leqslant 2

其中的PfracPgreedy+pmaxP_{frac} \leqslant P_{greedy}+p_{max}是因为按照贪心策略,我们选择了最大的物品,在即将满的时候,PfracP_{frac}PgreedyP_{greedy}的基础上将pmaxp_{max}的截取了一部分装进去了;

Summary

如果已知最优解中价值最大的前k个,那么可以设计出近似比为k+1k\dfrac{k+1}{k}的算法

0-1背包的FPTAS算法

现在我们讨论一个更美好的算法,即一个可以无限近似的算法。利用动态规划一讲的算法我们知道 0-1背包问题是有伪多项式算法的,即其复杂度是 O(nC)O(nC) 的,其中 nn 是物品的数量,CC 是背包的容量。但我们可以换个角度进行动态规划,我们的数组第二个维度不再是背包的容量,而是价值,即我们原先的数组是 A[i][c]表达的是前 i 个物品放入容量为 c 的背包的最大价值,现在我们的数组是 A[i][v] 表达的是前 i 个物品放入价值为 v 的背包的最小重量。转移方程为:

Note

Let Wi,pW_{i,p} be the minimum weight of a collection from {1,,i}\{1, \ldots, i\} with total profit being exactly pp.

  1. Take ii:
Wi,p=wi+Wi1,ppi W_{i,p} = w_i + W_{i-1,p - p_i}
  1. Skip ii:
Wi,p=Wi1,p W_{i,p} = W_{i-1,p} Wi,p={if i=0Wi1,pif pi>pmin{Wi1,p,wi+Wi1,ppi}otherwiseW_{i,p} = \begin{cases} \infty & \text{if } i = 0 \\ W_{i-1,p} & \text{if } p_i > p \\ \min \{ W_{i-1,p}, w_i + W_{i-1,p - p_i} \} & \text{otherwise} \end{cases}

显然,这一动态规划的复杂度是 O(nV)O(nV) 的,其中 VV 是所有物品的价值之和。我们做个简单的变换,设 vmaxvmax 是所有物品的价值的最大值,那么显然有 VnvmaxV \leqslant nvmax因此我们的复杂度是 O(n2vmax)O(n^2 vmax) 的。

如果发现 vmaxvmax 的大小是 nn 的多项式级别的,那么我们将得到一个多项式时间的算法。然而并非所有实例都能满足这一条件,因此我们需要对输入的价值做一些技术性的处理,即对输入的所有价值做同比例的缩小,使得 vmaxvmax 能缩小到 nn 的多项式 级别

Key Point

给定想要的比例ε\varepsilon,取b=εvmaxnb=\dfrac{\varepsilon v_{max}}{n} 将输入的全体价值同时缩放一个比例bb,使得最大价值为nn的多项式级别,做向上(或者向下)取整,然后使用动态规划做法,得到最优解vv;最后再将结果放大回来,我们相信放大回来的价值和原价值是接近的,即bvbv是一个近似解。

可以证明上述算法是 0-1 背包的一个FPTAS算法

首先时间复杂度是显然的,我们缩小价值后的的动态规划算法是

b=εvmaxn b=\dfrac{\varepsilon v_{max}}{n} O(n2vmaxb)=O(n2nε)=O(n3ε) O(n^2 \cdot \dfrac{v_{max}}{b})=O(n^2 \cdot \dfrac{n}{\varepsilon})=O(\dfrac{n^3}{\varepsilon})

满足多项式时间的要求;

我们用多项式算法解决了viv_i'价值下的问题:

我们还需要关注经过缩放再放大之后,原本价值的变化是怎么样的即 vi=vi/bbv_i' = \lceil v_i / b \rceil bviv_i 是接近的。事实上因为在向上取整时最多只会加上 1,因此我们有:

vivivi+b.v_i \leqslant v_i' \leqslant v_i + b.

设对于 v1,,vnv_1, \ldots, v_n 而言的最优物品集合为 SS^*,而对于 v1,,vnv_1', \ldots, v_n' 而言的最优物品集合为 SS,那么我们有:

iSviiSvi.\sum_{i \in S} v_i' \geqslant \sum_{i \in S^*} v_i'.

这是因为 SSv1,,vnv_1', \ldots, v_n' 的最优解,而 SS^* 是一个可行解。然后结合上述含入的不等式我们有如下等式链:

iSviiSviiS(vi+b)iSvi+nb=iSvi+εvmax\sum_{i \in S^*} v_i \leqslant \sum_{i \in S^*} v_i' \leqslant \sum_{i \in S} (v_i + b) \leqslant \sum_{i \in S} v_i + nb = \sum_{i \in S} v_i + \varepsilon v_{\max}

比较首尾,只要能估计出 vmaxv_{\max}iSvi\sum_{i \in S} v_i 的关系,我们就能得到近似化的上界。显然vmaxiSviv_{max} \leqslant \sum_{i \in S^*} v_i

(1ε)iSvi=(1ε)OPTiSvi(1 - \varepsilon) \sum_{i \in S^*} v_i = (1 - \varepsilon) OPT \leqslant \sum_{i \in S} v_i。

因此我们的近似化满足 FPTAS 的要求。

K-Center问题

Greedy-KCenter问题的的解不大于最优解的两倍,即

A(I)2OPT(I) A(I) \leqslant 2 \cdot OPT(I)

证明:如果该算法的K个中心刚好在最优解的圆里面,证毕;如果不在,那么其至少有两个在同一个最优解的圆里面,由于每次选的都是最远的,所以这两个点(u,v)的距离大于其解。

2OPT(I)d(u,v)A(I) 2OPT(I) \geqslant d(u,v) \geqslant A(I)

也证毕。