1、第九章Approximation Algorithm,骆吉洲 计算机科学与工程系,9.1 Introduction 9.2 The Vetex-cover Problem 9.3 The Set-covering Problem 9.4 The Traveling-salesman Problem 9.5 Randomization and Linear Programming 9.6 The Subset-sum Problem,提要,参考资料,Introduction to Algorithms第35章 网站资料第9章,9.1 Introdution,近似算法的基本概念 近似算法的性能分析
2、,近似算法的基本思想 很多实际应用中问题都是NP-完全问题 NP-完全问题的多项式算法是难以得到的 求解NP-完全问题的方法: 如果问题的输入很小, 可以使用指数级算法圆满地解决该问题 否则使用多项式算法求解问题的近似优化解 什么是近似算法 能够给出一个优化问题的近似优化解的算法 近似算法主要解决优化问题,近似算法的基本概念,近似算法的时间复杂性 分析目标和方法与传统算法相同 近似算法解的近似度 本节讨论的问题是优化问题 问题的每一个可能的解都具有一个正的代价 问题的优化解可能具有最大或最小代价 我们希望寻找问题的一个近似优化解 我们需要分析近似解代价与优化解代价的差距 Ratio Bound
3、 相对误差 (1+)-近似,近似算法的性能分析,Ratio Bound 定义1(Ratio Bound) 设A是一个优化问题的近似算法, A具有ratio bound p(n), 如果,其中n是输入大小, C是A产生的解的代价, C*是优化解的代价.,如果问题是最大化问题, maxC/C*, C*/C=C*/C 如果问题是最小化问题, maxC/C*, C*/C=C/C* 由于C/C*1, Ratio Bound不会小于1 Ratio Bound越大, 近似解越坏,相对误差 定义2(相对误差) 对于任意输入, 近似算法的相对 误差定义为|C-C*|/C*, 其中C是近似解的代价, C*是优化解
4、的代价. 定义3(相对误差界) 一个近似算法的相对误差界为(n), 如果|C-C*|/C* (n).,结论1. (n) p(n)-1.证. 对于最小化问题(n)=|C-C*|/C*=(C-C*)/C*=C/C* -1=p(n)-1.对于最大化问题(n)=|C-C*|/C*=(C*-C)/C*= (C*/C -1)/(C*/C)= (p(n)-1)/p(n) p(n)-1.对于某些问题, (n)和p(n)独立于n, 用p和表示之. 某些NP-完全问题的近似算法满足: 当运行时间增加时,Ratio Bound和相对误差将减少. 结论1表示, 只要求出了Ratio Bound就求出了(n),近似模式
5、 定义4 (近似模式) 一个优化问题的近似模式是一个以问题实例I和0为输入的算法. 对于任意固定, 近似模式是一个(1+)-近似算法. 定义5 一个近似模式A(I, )称为一个多项式时间近似模式, 如果对于任意0, A(I, )的运行时间是|I|的多项式. 定义 6 一个近似模式称为完全多项式时间近似模式, 如果它的运行时间是关于1/和输入实例大小n的多项式.,9.2 The Vetex-cover Problem,问题的定义 近似算法的设计 算法的性能分析,问题的定义,输入: 无向图G=(V, E) 输出: CV, 满足(1). (u, v)E, uC或者vC(2). C是满足条件(1)的最
6、小集合。理论上已经证明优化结点覆盖问题是NP-完全问题.,算法的基本思想,近似算法的设计,b,a,c,f,d,e,g,b,c,d,g,e,f,算法解: b, c, e, f, d, g,算法 APPROX-Vertex-Cover (G) 1. C=0 2. E=EG; 3. While E0 DO任取(u, v)E;C=Cu, v;从E中删除所有与u或v相连的边; Roturn C,时间复杂性 T(G)=O(|E|) Ratio Bound定理. Approx-Vertex-Cover的Ratio Bound为2.证. 令A=(u, v) | (u, v)是算法第4步选中的边.若(u,v)A
7、, 则与(u, v)邻接的边皆从E中删除.于是, A中无相邻接边.第5步的每次运行增加两个结点到C, C=2A.设C*是优化解, C*必须覆盖A.由于A中无邻接边, C*至少包含A中每条边的一个结点. 于是, AC*, C=2|A|2C*, 即|C|/|C*|2.,算法的性能分析,9.3 The Set-covering Problem,问题的定义 近似算法的设计 算法的性能分析,输入: 有限集X, X的所有子集族F, X=SF S 输出:CF,满足(1). X=SC S ,(2). C是满足条件(1)的最小集族, 即|C|最小.*最小集合覆盖问题是很多实际问题的抽象. *最小集合覆盖问题是N
8、P-完全问题.,问题的定义,X=12个黑点, F=S1, S2, S3, S4, S5, S6 优化解C=S3, S4, S5,问题的实例,基本思想 贪心选择:选择能覆盖最多未被覆盖元素的子集,近似算法的设计,C=S1,C=S1, S4,C=S1, S4, S5,C=S1, S4, S5, S3,算法 Greedy-Set-Cover(X, F) 1. UX; /* U是X中尚未被覆盖的元素集 */ 2. C; 3. While U DoSelect SF 使得SU最大; /* Greedy选择选择能覆盖最多U元素的子集S */ 5. U U-S; 6. C CS; /* 构造X的覆盖 */
9、7. Return C.,时间复杂性 3-6的循环次数至多为min(X, F) 计算SU需要时间O(X) 第4步需要时间O(FX)T(X,F)=O(FXmin(x,F),算法性能的分析,Ration Bound 定理1. 令H(d)=1id1/I . Greedy-Set-Covers是多项式p(n)-近似算法, p(n)=H(maxS | SF).证. 我们已经算法是多项式算法, 仅需计算Ratio Bound.设C*是优化集合覆盖, C*的代价是C*. 令Si是由Greedy-Set-Cover选中的第i个子集.当把Si加入C时, C的代价加1. 我们把选择Si增加的代价均匀分配到由Si首
10、次覆盖的所有结点. xX, 令cx是分配到x的代价. 若x被Si首次覆盖, 则,显然, 算法给出的解C的代价为C, C平均地分布到X的所 有点. 由于C*也覆盖X, 我们有,注意: 上式的小于成立是因为C*中各子集可能相交, 某些 cx被加了多次, 而左式每个cx只加一次. 如果SF, xS cxH(S)成立, 则C SC* H(|S|)C*H(maxS | SF),即|C|/|C*|H(maxS | SF), 定理成立.下边我们来证明: 对于SF, xS cxH(S).,对于SF和i=1,2,.C, 令ui=S-(S1S2.Si)是S1、S2、.、Si被选中后, S中未被覆盖的点数. Si先
11、于S被选中.令u0=S, k是满足下列条件的最小数: uk=0, 即S中每个元素被S1、S2、.、Sk中至少一个覆盖.显然, ui-1ui, ui-1-ui是S中由Si第一次覆盖的元素数.于是,注意: Si-(S1S2.Si-1)S-(S1S2.Si-1=ui-1, 因为Greed算法保证: S不能覆盖多于Si覆盖的新结点数, 否则S将在Si之前被选中. 于是,推论1. Greedy-Set-Cover是一个多项式ln(x+1)-近似算法.证. 由不等式H(n)ln(n+1)可知H(maxS | SF)H(X)lnX+1.,复杂性分析,9.4 The Traveling-salesman Pr
12、oblem,问题的定义 近似算法设计 算法的性能分析,问题的定义,输入完全无向图G=(V,E);代价函数C: E非负整数集合C满足三角不等式: C(u,w)C(u,v)+C(v,w).输出具有最小代价的Hamilton环,Hamilton环是一个包含V中每个结点一次的简单环.代价函数的扩展: 设AE, C(A)=(u,v)E C(u, v).不满足三角不等式的TSP问题无具有常数Ration Bound的近似算法, 除非NP=P.,基本思想 首先构造最小生成树(可以使用第五章的算法) 先序遍历最小生成树, 构造TSP的解,近似算法的设计,a,d,e,b,f,g,h,c,先序遍历: abchde
13、fga,先序遍历解,优化解,近似算法APPROX-TSP-TOUR(G,C)1. 选择一个rVG作为生成树的根;2. 调用MST-Prim(G, C, r)生成一个最小生成树T;3. 先序遍历T, 形成有序结点表L;4. 按照L中的顺序访问各结点, 形成哈密顿环.,算法的性能分析,时间复杂性第2步: O(|E|+|V|log|V|)=O(|V|2+|V|log|V|)=O(|V|2)第3步: O(|E|)=O(|V|2), 因为G是完全图, 第4步: O(|V|)T(G)=O(|V|2),解的精确度定理1. APPROX-TSP-TOUR具有Ratio Bound 2.证. 设H*是TSP问题
14、的优化解, H是算法产生的近似解.我们需要证明C(H)2C(H*).从H*中删除任意一条边, 可以得到G的一个生成树T. 设T是算法第2步产生的导致H的最小生成树, 则C(T)C(T)C(H*).T的一个full walk W列出了所有结点(第一次访问的和 以后从一个子树返回时再访问的). 前面例子的full walk给出顺序: a,b,c,b,h,b,a,d,e,f,e,g,e,d,a,由于W通过每条边两次, C(W)=2C(T), 进而C(W)2C(H*).W不是哈密顿环, 因为它通过某些结点多于一次. 根据三角不等式, 我们可以从W中删除对一个结点的任何 访问, 而不增加代价. (例如:
15、从uvw 删除v得uw)反复地应用上述操作, 我们可以从W中删除所有对任何结 点的非第一次访问, 得到一个算法中的preoder walk. 在我们的例子中, 操作结果是: a, b, c, h, d, e, f, g.由于T的preoder walk导致H, 我们有C(H)C(W), 即 C(H)2C(H*), 明所欲证.,9.5 Randomization and Linear Programming,求解Max-3-CNF问题随机近似算法 求解最小节点覆盖问题的线性规划算法,基本概念 定义1. 设C是随机近似算法RAS产生的问题P的近似解的代价, C*是问题P的准确解的代价, n是P的大
16、小. 若max(C/C*, C*/C)p(n), 则称RSA具有近似比p(n). 我们也称RAS是一个随机p(n)-近似算法.,求解Max-3-CNF问题随机近似算法,Max-3-CNF问题的定义 输入: 合取范式CNF,每个析取式具有三个变量,没有任何变量和它的非在同一个析取式中 输出: 一个变量赋值,最大化值为1的析取式个数 随机算法Random-Max-3-CNF(CNF) For 对于CNF中的每个变量x Do随机地为x赋值: x =0的概率为1/2, x =1的概率为1/2; Return.,性能分析定理. Random-Max-3-CNF是一个随机8/7-近似算法.证.假定输入CN
17、F中具有n个变量, m个析取式, 第i个析取式的形式为 xi1xi2xi3. 对i=1, 2, m, 定义随机变量: Yi=1 如果第i个析取式为1, 否则Yi=0.Pr(第i个析取式为0)=Pr(xi1=0)Pr(xi2=0)Pr(xi3=0)=(1/2)3=1/8.Pr(第i个析取式为1)=1- 1/8 = 7/8.EYi=7/8. 令Y=Y1+Y2+Ym. Y是CNF中值为1的析取式的个数.EY=1imEYi=1im7/8=m7/8.显然, 优化解的代价为m. 于是近似比=m/(m7/8)=8/7 .,问题的定义 输入: 无向图G=(V, E), 每个节点具有权w(v). 输出: CV,
18、 满足(1). (u, v)E, uC或者vC (2). w(C)最小, w(C)=cCw(c).以前的节点覆盖算法不再适用!,求解节最小点覆盖问题的线性规划算法,问题转化为0-1线性规划问题P0-1 对于vV, 定义 x(v)0, 1如下: 若v在节点覆盖中, 则x(v)=1, 否则x(v)=0. (u, v)E, 若u、v或两者在覆盖中, 则x(u)+x(v)1. 对应的0-1整数规划问题P0-1 优化目标: 最小化 vV w(v)x(v) 约束条件: x(u)+x(v)1 for vV x(v)0, 1 for vV0-1整数规划问题是NP-完全问题我们需要设计近似算法,用线性规划问题的
19、解近似0-1规划问题的解 对于vV, 定义 x(v)0, 1 P0-1对应的线性规划问题LP 优化目标: 最小化 vV w(v)x(v) 约束条件: x(u)+x(v)1 for vV x(v)0, 1 for vV线性规划问题具有多项式时间算法P0-1的可能解是LP问题的可能解P0-1解的代价LP的解的代价,近似算法 Approx-Min-VC(G, w)C=0;计算LP问题的优化解y;For each vV DoIf x(v)1/2 Then C=Cv;/* 用四舍五入法把LP的解近似为P0-1的解 */ 5. Return C.,算法的性能 定理. Approx-Min-VC是一个多项式
20、时间2-近似算法证. 由于求解LP需多项式时间, Approx-Min-VC的For循环需要多项式时间, 所以算法需要多项式时间. 下边证明Approx-Min-VC的近似比是2.往证算法产生的C是一个节点覆盖. (u, v)E, 由约束条件可知 x(u)+x(v)1. 于是, x(u)和x(v)至少一个大于等于1/2, 即u、v或两者在C中. C是一个覆盖.,往证w(C)/w(C*) 2. 令C*是P0-1的优化解, z*是LP优化解的代价. 因为C*是LP的 可能解, w(C*)z*.z* = vV w(v)x(v) vV: x(v)1/2 w(v)x(v) vV: x(v)1/2 w(v
21、)1/2= vC w(v)1/2= (1/2) vC w(v)= (1/2)w(C).由w(C*)z*, w(C*)(1/2)w(C), 即 w(C)/w(c*)2.,9.6 The Subset-sum Problem,问题的定义指数时间算法 完全多项式时间近似模式,输入:(S, t), S=x1, x2, ., xn, xi是整数, t=正整数 输出:xA x, 满足:AS, xAxtxA x =max xB x | BS ,问题定义,算法(设S是集合, x是正整数, 定义S+x=s+x sS) Exact-Subset-Sum(S =x1, x2, ., xn, t)1. nS;2. L
22、0;3. For i1 To n Do4. LiMerge-List(Li-1, Li-1+xi);5. 删除Li中所有大于t的元素;6. Return Ln中最大元素.,指数时间算法,计算过程: L0= L1= /* 前一个元素所有子集的和(不大于t) */ L2= /* 前二个元素所有子集的和(不大于t) */ L3= /* 前三个元素所有子集的和(不大于t) */ Li=前i个元素所有子集的和(不大于t),对n作数学归纳法可以证明: Ln=前n个元素所有子集的和(不大于t),时间复杂性第4步: |Li|=2|Li-1|+12|Li-1|22|Li-2|2i|L0|=2iT(n)=O(2n
23、) 如果t比较大1. nS;2. L0;3. For i1 To n Do4. LiMerge-List(Li-1, Li-1+xi);5. 删除Li中所有大于t的元素;6. Return Ln中最大元素.,基本思想:修剪L, 对于多个相近元素, 只留一个代表, 尽量缩小每个L的长度 设(01)是修剪参数, 根据修剪L: (1). 从L中删除尽可能多的元素, (2). 如果L是L修剪后的结果, 则对每个从L中删除的元素y, L中存在一个元素zy, 使得(1-)yzy 如果y被修剪掉, 则存在一个代表y的z在L中, 而且z相对于y的相对误差小于.,完全多项式时间近似模式,修剪算法 Trim(L=
24、y1, y2, ., ym,) /* yiyi+1, 0; lasty1; For i2 To m DoIf last(1-)yi /*即yi-1(1-)yi, 由L和L有序, 对yL, 不满足(1-)yiyyi */Then yi加入到L末尾; /* 因L中目前没有能够表示yi的元素 */lastyi; Return L . 复杂性: O(L)=O(m),完全多项式近似模式 输入: S=x1, x2, ., xn, t 0, 0 3. For i1 To n Do 4. LiMerge-List(Li-1, Li-1+xi); 5. LiTrim(Li, /n) /* 修剪参数= /n */
25、 6. 从Li中删除大于t的元素; 7. 令z是Ln中最大值; 8. Return z .,性能分析 定理1. Approx-Subset-Sum是子集求和问题的一个完全多项式时间近似模式.证.令P0=0, Pi=x x=yA y, Ax1, x2, ., xi. 例如, 令S=1, 4, 5, 则P1=0, 1, P2=0, 1, 4, 5, P3=0, 1, 4, 5, 6, 9, 10.使用数学归纳法可以证明: Pi=Pi-1(Pi-1+xi). 使用数学归纳法可以证明Li是Pi中所有不大于t的元素的有序表.,Li经第5步修剪以及第6步的大于t元素的删除, 仍然有LiPi. 于是, 第8
26、步返回的z是S的某个子集的和. 我们需证明(1). C*(1-)z, 即(C*-z)/C*, C*是优化解, z是近似解. 注意, 由于子集合求和问题是最大化问题, (C*-z)/C*是算法 的相对误差.(2). 算法是关于S和1/的多项式时间算法.,(1). 往证C*(1-)z对i作归纳法证明: yPi, yt, 存在一个zLi使(1-/n)iyzy.当i=0时Pi=0, Li=0, 命题成立.设当ik时命题成立. Pk+1= PkPk+xk+1. 由归纳假设, yPk+1Pk, yt, 存在zLkLk+1使(1-/n)kyzy. 于是, (1-/n)k+1yz y. 对于yPk+1-Pk,
27、 y=y+xk+1 t, yPk. 由归纳假设, 存在 zLkLk+1使(1-/n)kyzy. 于是, (1-/n)ky+xk+1z+xk+1y+xk+1.由于zLk, z+xk+1Lk+1, 而且(1-/n)ky+xk+1)-(1-/n)k+1(y+xk+1)=(1-/n)k(y-(1-/n)y)+(xk+1-(1-/n)k+1xk+1)0, 即(1-/n)k+1(y+xk+1)(1-/n)ky+xk+1z+xk+1y+xk+1.,最后, 若C*Pn是子集合求和问题的优化解, 则存在一个zLn, 使(1-/n)nC*zC*. 因算法解z=max(Ln), (1-/n)nC* zzC*.由于(1-/n)n的一阶导数大于0, (1-/n)n是关于n递增的函数. 因为n1, (1-)1/(1-/n).如果Li中具有k+2个元素, 则必有y0=0, y1=z0, y2z01/(1-/n), y3z01/(1-/n)2, yk+1z01/(1-/n)k, 而且z01/(1-/n)kt. 由z01/(1-/n)kt, klog1/(1-/n)t, 对log1/(1-/n)t, 台劳展开ln(1-/n), |Li|=k+22+log1/(1-/n)t =2+(lnt/-ln(1-/n)2+nlnt/.算法的运行时间是Li的多项式, 即n和1/的多项式.,9.7近似算法中的线性规划方法,