登高必自卑,自视太高不能达到成功,因而成功者必须培养泰然心态,凡事专注,这才是成功的要点。

考虑这样一个 Set cover 问题:

给定一个全集UU 和一系列它的子集S1,S2,...,SmUS_1,S_2,...,S_m\subseteq U,每一个子集都有一个权重C(Si)C(S_i)
我们希望求一个权重最小的 cover:即所有满足STS=U\bigcup_{S\in \mathcal{T}}S=U 的集合T{S1,...,Sm}\mathcal{T}\subseteq\{S_1,...,S_m\} 中,STC(S)\sum_{S\in\mathcal{T}} C(S) 最小的那个。
我们一般默认权重是非负的C(S)0C(S)\geq 0

# 贪心做法

考虑一个简单的贪心做法。
我们选择 “能覆盖范围和权重比值最大的集合”:

T1=arg maxS{S1,...,Sm}SC(S),T2=arg maxS{S1,...,Sm}ST1C(S),T3=arg maxS{S1,...,Sm}S(T1T2)C(S),......Tm=arg maxS{S1,...,Sm}S(T1...Tm1)C(S).\begin{aligned} & T_1=\argmax_{S\in \{ S_1,...,S_m \}}\frac{|S|}{C(S)},\\ & T_2=\argmax_{S\in \{ S_1,...,S_m \}}\frac{|S\setminus T_1|}{C(S)},\\ & T_3=\argmax_{S\in \{ S_1,...,S_m \}}\frac{|S\setminus (T_1\cup T_2)|}{C(S)},\\ & ......\\ & T_m=\argmax_{S\in \{S_1,...,S_m\}} \frac{|S\setminus (T_1\cup...\cup T_{m-1})|}{C(S)}. \end{aligned}

这样我们找出了一个集合{T1,...,Tm}\{T_1,...,T_m\} 作为答案。假如说原问题最优解的集合是V={V1,...,Vt}\mathcal{V}=\{V_1,...,V_t\},那么根据贪心算法的过程,我们知道:对于任意1im1\leq i\leq m

Ti(T1...Ti1)C(Ti)V1(T1...Ti1)C(V1)Ti(T1...Ti1)C(Ti)V2(T1...Ti1)C(V2)Ti(T1...Ti1)C(Ti)V3(T1...Ti1)C(V3)......Ti(T1...Ti1)C(Ti)Vt(T1...Ti1)C(Vt).\begin{aligned} & \frac{|T_i\setminus(T_1\cup...\cup T_{i-1})|}{C(T_i)}&\geq \frac{|V_1\setminus(T_1\cup...\cup T_{i-1})|}{C(V_1)}\\ & \frac{|T_i\setminus(T_1\cup...\cup T_{i-1})|}{C(T_i)}&\geq \frac{|V_2\setminus(T_1\cup...\cup T_{i-1})|}{C(V_2)}\\ & \frac{|T_i\setminus(T_1\cup...\cup T_{i-1})|}{C(T_i)}&\geq \frac{|V_3\setminus(T_1\cup...\cup T_{i-1})|}{C(V_3)}\\ & ......\\ & \frac{|T_i\setminus(T_1\cup...\cup T_{i-1})|}{C(T_i)}&\geq \frac{|V_t\setminus(T_1\cup...\cup T_{i-1})|}{C(V_t)}. \end{aligned}

根据不等式:

max{a1b1,...,albl}a1+...+alb1+...+bl,\max\left \{ \frac{a_1}{b_1},...,\frac{a_l}{b_l}\right \}\geq\frac{a_1+...+a_l}{b_1+...+b_l},

我们可以得到

Ti(T1...Ti1)C(Ti)j=1tVj{T1...Ti1}C(V1)+...+C(Vt).\frac{|T_i\setminus(T_1\cup...\cup T_{i-1})|}{C(T_i)}\geq \frac{\sum_{j=1}^t |V_j\setminus\{T_1\cup...\cup T_{i-1}\}|}{C(V_1)+...+C(V_t)}.

注意到因为{V1,...,Vt}\{V_1,...,V_t\} 是个 cover,所以

j=1tVj{T1...Ti1}U{T1...Ti1}=UT1...Ti1.\sum_{j=1}^t |V_j\setminus\{T_1\cup...\cup T_{i-1}\}|\geq |U\setminus \{T_1\cup...\cup T_{i-1}\}|=|U|-|T_1\cup...\cup T_{i-1}|.

我们知道最优解OPT=C(V1)+...+C(Vt)OPT=C(V_1)+...+C(V_t),再结合上述分析,所以有

1im, Ti(T1...Ti1)C(Ti)UT1...Ti1OPT\begin{aligned} \forall 1\leq i\leq m,\ \frac{|T_i\setminus(T_1\cup...\cup T_{i-1})|}{C(T_i)}\geq\frac{|U|-|T_1\cup...\cup T_{i-1}|}{OPT}\\ \end{aligned}

因此我们知道

i=1mC(Ti)OPT(T1U+T2T1UT1+T3(T1T2)UT1T2+...+Tm(T1...Tm1)UT1T2...Tm1).\sum_{i=1}^m C(T_i)\leq OPT\cdot \left (\frac{|T_1|}{|U|}+\frac{|T_2\setminus T_1|}{|U|-|T_1|}+\frac{|T_3\setminus (T_1\cup T_2)|}{|U|-|T_1\cup T_2|}+...+\frac{|T_m\setminus(T_1\cup...\cup T_{m-1})|}{|U|-|T_1\cup T_2\cup...\cup T_{m-1}|}\right ).

实际上仔细观察可以知道右侧式子其实是个调和级数:

\begin{aligned} & \frac{|T_1|}{|U|}=\underbrace{\frac{1}{|U|}+...+\frac{1}{|U|}}_{|T_1|\mbox{个}}\leq \frac{1}{|U|}+\frac{1}{|U|-1}+...+\frac{1}{|U|-|T_1|+1},\\ & \frac{|T_2\setminus T_1|}{|U|-|T_1|}\leq \frac{1}{|U|-|T_1|}+\frac{1}{|U|-|T_1|-1}+...+\frac{1}{|U|-|T_1|-|T_2\setminus T_1|+1},\\ \end{aligned}

其中UT1T2T1=UT1T2|U|-|T_1|-|T_2\setminus T_1|=|U|-|T_1\cup T_2|。以此类推,我们可以得到

i=1mC(Ti)OPTj=1U1j=O(logU).\sum_{i=1}^m C(T_i)\leq OPT\cdot \sum_{j=1}^{|U|}\frac{1}{j}=O(\log |U|).

因此实际上这个贪心算法得到的解之多是O(logU)O(\log |U|) 倍的近似解。

# Vertex Cover 的 layering technique

我们考虑如下 Vertex Cover 问题:

给定一个无向图G=(V,E)G=(V,E),每个点uVu\in V 有一个权重C(u)C(u)
GG 的一个 cover 是VV 的一个子集TVT\subseteq V 使得每条边eEe\in E 都至少有一个与其相关联的点在TT 中。
我们希望找到权重和最小的 cover。

很显然 Vertex Cover 可以归约到 Set Cover,我们只需要令U=EU=E,然后每个点是一个子集:

Su={eE:ue的一个端点}U.S_u=\{e\in E:u\text{是}e\text{的一个端点}\}\subseteq U.

这样 Set Cover 的最优解就是 Vertex Cover 的最优解。

我们考虑另一个近似算法。首先定义一种 Degree-weighted graph:

一个图(V,E)(V,E) 被称为是 degree-weighted 的,如果存在一个常数CC 使得:

uV, C(u)deg(u)=C.\forall u\in V,\ \frac{C(u)}{deg(u)}=C.

我们首先知道一个引理:

一个 degree-weighted 的图的任意 vertex cover 都是 2 - 近似的。

证明:这很简单,我们可以证明一个 degree-weighted 的图的最优 vertex cover \geq 所有点权重和 / 2。
我们可以想象,每个点的权重都被分配到和它相关联的边上,如下图:
1
那么很显然,一个 vertex cover 需要盖住所有边,所以最优 vertex cover 的权重至少\geq 边数 ×C\times C,也就是所有点权和的一半。
\square

因此一个算法就是,我们可以把一个图拆成一个 degree weighted 的图,和一个剩余图的和
我们只需要找出一个图中,C(u)deg(u)\frac{C(u)}{deg(u)} 最小的那个顶点uu。然后呢,我们可以把图拆成两个图的和:
2
在上图中,最小的顶点AA 对应的比值就是1/51/5。不难发现,这样拆分后,剩余图G2G_2AA 的权重就是 0 了,而G1G_1 是一个 degree-weighted 的图。

根据前面的引理,G1G_1 任意的 vertex cover 都是 2 - 近似的,因此我们只需要考虑G2G_2 的 vertex cover 选法。
很显然,G2G_2 中我们可以直接选择权重为 0 的那个点,这样的话G2G_2 就会被化简:把和AA 相关联的边都删掉。

然后重复上述过程,最后就可以得到一个 vertex cover 选法,而且相对于最优解是 2 - 近似的。

# Linear Programming 和 Integer Programming 的近似方法

我们首先回忆一下 linear programming 的 duality 和 slackness 的一些结论。
考虑下面两个 linear programming 问题,左侧的被称为 primary problem,右侧是它的 dual problem。其中,b,yb,ymm 维向量,c,xc,xnn 维向量,AAm×nm\times n 维矩阵。

mincTxs.t.Axbx0maxbTys.t.ATycy0\begin{aligned} &\min && c^Tx\\ & s.t. && Ax\geq b\\ & && x\geq 0 \end{aligned}\qquad\qquad \begin{aligned} &\max && b^Ty\\ & s.t. && A^Ty\leq c\\ & && y\geq 0 \end{aligned}

我们知道,这两个问题的最优解是相等的。而且有两个重要的结论:

(Weak Duality Theorem)
如果x,yx,y 分别是 primary problem 和 dual problem 的 feasible solution(满足约束,但不一定是最优的),那么有cTxbTyc^Tx\geq b^Ty

(Complementary Slackness Conditions)
x,yx,y 分别是 primary problem 和 dual problem 的 feasible solutions。那么x,yx,y 都是 optimal solution 当且仅当以下条件都满足:

  • 对于每个1jn1\leq j\leq n,要么xj=0x_j=0,要么i=1mAi,jyi=cj\sum_{i=1}^m A_{i,j}y_i=c_j
  • 对于每个1im1\leq i\leq m,要么yi=0y_i=0,要么j=1nAi,jxj=bi\sum_{j=1}^n A_{i,j}x_j=b_i

而且互补松弛性还有一个有用的结论:

假设x,yx,y 还是 primary problem 和 dual problem 的 feasible solution。
假设存在常数α,β\alpha,\beta 满足:

1im, j=1nAi,jxjβbi,1jn, i=1mAi,jyicj/α,\forall 1\leq i\leq m,\ \sum_{j=1}^n A_{i,j}x_j\leq \beta\cdot b_i,\qquad \forall 1\leq j\leq n,\ \sum_{i=1}^m A_{i,j}y_i\geq c_j/\alpha,

那么我们知道cTxαβc^Tx\leq \alpha\beta 倍的最优解。

证明:注意到

i=1mj=1nAi,jxjyi=i=1m(j=1nAi,jxj)yiβi=1mbiyi,i=1mj=1nAi,jxjyi=j=1n(i=1mAi,jyi)xj1αj=1ncjxj.\begin{aligned} & \sum_{i=1}^m\sum_{j=1}^n A_{i,j}x_jy_i=\sum_{i=1}^m\left (\sum_{j=1}^n A_{i,j}x_j\right )y_i\leq \beta\sum_{i=1}^m b_iy_i,\\ & \sum_{i=1}^m\sum_{j=1}^n A_{i,j}x_jy_i=\sum_{j=1}^n\left (\sum_{i=1}^m A_{i,j}y_i\right )x_j\geq \frac{1}{\alpha}\sum_{j=1}^n c_jx_j. \end{aligned}

因此

j=1ncjxjαβi=1mbiyiαβOPT.\sum_{j=1}^n c_jx_j\leq \alpha \beta \sum_{i=1}^mb_iy_i\leq \alpha\beta\cdot OPT.

\square

下面我们回到 weighted vertex cover 的问题。并写出它的 linear programming 形式:

minuVC(u)xus.t.xu+xv1, (u,v)Exu0, uV,maxeEyes.t.e:e关联uyeC(u), uVye0, eE\begin{aligned} & \min && \sum_{u\in V}C(u)x_u\\ & s.t. && x_u+x_v\geq 1,\ \forall (u,v)\in E\\ & && x_u\geq 0,\ \forall u\in V \end{aligned},\qquad\qquad \begin{aligned} & \max && \sum_{e\in E}y_{e}\\ & s.t. && \sum_{e:e\textbf{关联}u}y_e\leq C(u),\ \forall u\in V\\ & && y_e\geq 0,\ \forall e\in E \end{aligned}

注意,理论上xux_u 只能选 0,1(即选这个点,或不选这个点)。我们首先把整数规划放松到了线性规划,即把约束xu{0,1}x_u\in\{0,1\} 放松到xu0x_u\geq 0

接下来我们利用互补松弛性手动解这个线性规划!(不依赖其他求解器)
我们希望找到 feasible solution x,yx,y 满足以下条件:

  • uV\forall u\in V,要么xu=0x_u=0,要么C(u)αe关联uyeC(u)\frac{C(u)}{\alpha}\leq \sum_{e\text{关联}u}y_e\leq C(u)
  • e=(u,v)E\forall e=(u,v)\in E,要么ye=0y_e=0,要么1xu+xvβ1\leq x_u+x_v\leq \beta

根据前面的讨论,这样找到的 feasible solution 一定会有cTxαβc^Tx\leq \alpha \beta 倍的最优解,也就是找到了个近似解。

我们取α=1,β=2\alpha=1,\beta=2 为例。即上面的互补松弛性条件变成:

  • uV\forall u\in V,要么xu=0x_u=0,要么e关联uye=C(u)\sum_{e\text{关联}u}y_e= C(u)
  • e=(u,v)E\forall e=(u,v)\in E,要么ye=0y_e=0,要么1xu+xv21\leq x_u+x_v\leq 2

然后求解的算法过程如下。我们以一个例子来阐述这个过程。
3

  1. 初始化地,令所有xu=ye=0x_u=y_e=0。此时它们不是 feasible solution,但平凡地满足互补松弛性条件。
  2. 选择一条未被 cover 的边ee,譬如例子中是e=ABe=AB。我们增长yey_e,直到某一个点uVu\in V 满足了e关联uye=C(u)\sum_{e\text{关联}u}y_e=C(u)。在这个例子中,就会有ye=1y_e=1,此时顶点A,BA,B 都满足了

A:yAB+yAC+yAF+yAG+yAH=C(A)=1,B:yAB+yBD+yBC=C(B)=1.\begin{aligned} & A: y_{AB}+y_{AC}+y_{AF}+y_{AG}+y_{AH}=C(A)=1,\\ & B: y_{AB}+y_{BD}+y_{BC}=C(B)=1. \end{aligned}

  1. 然后我们令那些满足e关联uye=C(u)\sum_{e\text{关联}u}y_e=C(u) 的顶点uVu\in Vxu=1x_u=1
  2. 重复 2-3 这个过程。

不难发现,整个过程下面互补松弛性的子条件都是满足的:

  • uV\forall u\in V,要么xu=0x_u=0,要么e关联uye=C(u)\sum_{e\text{关联}u}y_e= C(u)
  • e=(u,v)E\forall e=(u,v)\in E,要么ye=0y_e=0,要么xu+xv2x_u+x_v\leq 2

因为xu+xv2x_u+x_v\leq 2 是平凡满足的。我们实际上不断寻找未被 cover 的边,重复 2-3 过程,就是为了让xx 成为一个 feasible solution,即满足1xu+xv1\leq x_u+x_v 的部分。

我们可以继续完成上面的例子。第二次重复时,就会选中边DEDE,然后令yDEy_{DE} 增长到C(D)=1C(D)=1。此时顶点D,ED,E 都满足

D:yBD+yDE=C(D)=1E:yDE+yCE=C(E)=1\begin{aligned} & D: y_{BD}+y_{DE}=C(D)=1\\ & E: y_{DE}+y_{CE}=C(E)=1 \end{aligned}

注意,此时只有yAB=yDE=1y_{AB}=y_{DE}=1,其余ye=0y_e=0。然后我们把xD,xEx_D,x_E 都设为 1。

重复 2 轮后,已经没有未被 cover 的边了。此时我们可以得到一个 feasible solution:

xF=xG=xH=xC=0,xA=xB=xD=xE=1.x_F=x_G=x_H=x_C=0,\qquad x_A=x_B=x_D=x_E=1.

然后可以得到一个 2 - 近似的结果,因为这个 feasible solution 是完全符合互补松弛性条件的。