近似算法

负载均衡问题

问题描述:有 m m m个机器, n n n个任务,任务 j j j的处理时间为 t j t_j tj,每个任务只能在一台机器上连续工作,一台机器同一时间只能处理一个任务。
机器 i i i的负载: L [ i ] = ∑ j ∈ S [ i ] t j L[i] = \sum_{j\in S[i]}t_j L[i]=jS[i]tj S [ i ] S[i] S[i]为分配给机器 i i i的任务集合
工期: L = m a x i L [ i ] L=max_iL[i] L=maxiL[i]
优化问题:寻找一个分配方案最小化工期
决策问题:是否存在一个分配方案使工期为 L L L

负载均衡问题是NPH问题,让分割问题 ≤ p \leq_p p负载均衡问题
构造思路
任给分割问题的实例 v 1 , v 2 , … , v n v_1,v_2,\dots,v_n v1,v2,,vn,我们构造3负载均衡的实例,即共有3台机器工作。任务 t 1 = v 1 , t 2 = v 2 , … , t n = v n , t n + 1 = 1 2 ∑ i v i t_1 = v_1,t_2=v_2,\dots,t_n=v_n,t_{n+1} = \frac{1}{2}\sum_iv_i t1=v1,t2=v2,,tn=vntn+1=21ivi。分割问题有解当且仅当3-负载均衡问题存在工期为 1 2 ∑ i v i \frac{1}{2}\sum_iv_i 21ivi的分配方案。

①负载均衡的2倍近似算法
贪心思路:不用排序,将任务分配给当前工期最小的机器上
两个结论

  • 最优工期 L ∗ ≥ m a x j t j L^*\geq max_jt_j Lmaxjtj(总有一个机器要处理这个最大时间的任务)
  • 最优工期 L ∗ ≥ 1 m ∑ j t j L^*\geq \frac{1}{m}\sum_jt_j Lm1jtj(最优工期大于等于绝对平衡工期)

2倍近似度证明

设机器 i i i是瓶颈机器(则 L [ i ] L[i] L[i]为贪心解),任务 j j j是最后一个在机器 i i i上调度的任务(在调度前,机器 i i i的工期是最小的)
L [ i ] − t j ≤ L [ k ] L[i] -t_j \leq L[k] L[i]tjL[k],对任意 1 ≤ k ≤ m 1\leq k \leq m 1km

L [ i ] − t j ≤ 1 m ∑ k L [ k ] = 1 m ∑ j t j ≤ L ∗ L[i] -t_j \leq \frac{1}{m}\sum_kL[k] = \frac{1}{m}\sum_jt_j\leq L^* L[i]tjm1kL[k]=m1jtjL

L = L [ i ] = ( L [ i ] − t j ) + t j ≤ 2 L ∗ L = L[i] = (L[i]-t_j)+t_j\leq 2L^* L=L[i]=(L[i]tj)+tj2L

2倍界是紧的,我们可以构造一个例子,最大极限为2。
如: m m m个机器,m(m-1)个长度为1的任务,1个长度为 m m m的任务
在这里插入图片描述
在这里插入图片描述
极限: l i m m → ∞ 2 m − 1 m = 2 lim_{m\rightarrow \infty}\frac{2m-1}{m}=2 limmm2m1=2

②负载均衡的 4 3 \frac{4}{3} 34倍近似算法
贪心思路:按照处理时长由大到小排序,将排序后的任务依次分配给当前工期最小的机器上。
我们只证明该算法是 3 2 \frac{3}{2} 23倍近似的

  • 如果瓶颈机器只有一个任务,那么我们的算法得到的分配方案是最优的
  • 如果瓶颈机器有两个及以上个任务(说明每个机器都至少有一个任务,不然需把瓶颈机器最后一个任务安排到空机器上),则 L ∗ ≥ 2 t m + 1 L^*\geq 2t_{m+1} L2tm+1(瓶颈机器至少要做两个任务,两个任务的时间总和 ≥ 2 t m + 1 \geq 2t_{m+1} 2tm+1

于是我们只需证明在瓶颈机器有两个及以上个任务时,得到的解是 3 2 \frac{3}{2} 23倍近似的即可
仍设任务 j j j是瓶颈机器 i i i最后处理的任务,在瓶颈机器有两个及以上个任务时, t j ≤ t m + 1 t_j\leq t_{m+1} tjtm+1 L ∗ ≥ 2 t m + 1 ≥ 2 t j L^*\geq 2t_{m+1}\geq 2t_j L2tm+12tj t j ≤ 1 2 L ∗ t_j\leq\frac{1}{2}L^* tj21L

因此: L = L [ i ] = ( L [ i ] − t j ) + t j ≤ 3 2 L ∗ L=L[i]=(L[i]-t_j)+t_j\leq \frac{3}{2}L^* L=L[i]=(L[i]tj)+tj23L

3 2 \frac{3}{2} 23倍近似不是紧的, 4 3 \frac{4}{3} 34倍近似才是紧的,例子如下:
m m m个机器, n = 2 m + 1 n=2m+1 n=2m+1个任务,长度为 m , m + 1 , … , 2 m − 1 m,m+1,\dots,2m-1 m,m+1,,2m1的任务各两个,长度为 m m m的任务1个。
L L ∗ = 4 m − 1 3 m , l i m m → ∞ 4 m − 1 3 m = 4 3 \frac{L}{L^*} = \frac{4m-1}{3m},lim_{m\rightarrow\infty} \frac{4m-1}{3m}=\frac{4}{3} LL=3m4m1,limm3m4m1=34

中心选择问题

问题描述:给定 n n n个站点,寻找 k k k个中心,每个站点距自身最近中心的距离为 d i s t ( s i , C ) dist(s_i,C) dist(si,C),问一种中心选择方案,使最大的 d i s t ( s i , C ) dist(s_i,C) dist(si,C)尽可能的小。

几个符号标注:
d i s t ( x , y ) dist(x,y) dist(x,y):站点 x x x y y y之间的距离
d i s t ( s i , C ) = m i n c ∈ C d i s t ( s i , c ) dist(s_i,C) = min_{c\in C}dist(s_i,c) dist(si,C)=mincCdist(si,c) s i s_i si到其最邻近中心的距离
r ( C ) = m a x i d i s t ( s i , C ) r(C) = max_i dist(s_i,C) r(C)=maxidist(si,C):最小覆盖半径

贪心策略:选择与当前存在的一系列中心最远的站点作为下一个中心(一开始随机选一个站点作为中心集合的第一个点)
启发式思想:每个站点尽可能分离,覆盖范围尽可能的分离,有效利用覆盖半径。

证明该算法是一个二倍近似算法,即 r ( C ) ≤ 2 r ( C ∗ ) r(C)\leq 2r(C^*) r(C)2r(C)
在这里插入图片描述
反证法,假设 r ( C ∗ ) < 1 2 r ( C ) r(C^*)<\frac{1}{2}r(C) r(C)<21r(C)

  • 对于贪心选择的中心 c i ∈ C c_i\in C ciC,考虑其半径为 1 2 r ( C ) \frac{1}{2}r(C) 21r(C)的区域
  • 在每个区域中有且仅有一个最优中心 c i ∗ c_i^* ci(若区域中不存在最优中心,则找到一个站点与最优站点距离大于 1 2 r ( C ) \frac{1}{2}r(C) 21r(C),与假设矛盾;若存在两个以上,则一定有一个区域不存在最优中心),令贪心解 c i c_i ci c i ∗ c_i^* ci对应。
  • 取任意站点 s s s c i ∗ c_i^* ci为站点 s s s在最优解中的最近中心, d i s t ( s , C ) ≤ d i s t ( s , c i ) ≤ d i s t ( s , c i ∗ ) + d i s t ( c i , c i ∗ ) ≤ 2 r ( C ∗ ) dist(s,C)\leq dist(s,c_i)\leq dist(s,c_i^*)+dist(c_i,c_i^*)\leq 2r(C^*) dist(s,C)dist(s,ci)dist(s,ci)+dist(ci,ci)2r(C)

因此: r ( C ) ≤ 2 r ( C ∗ ) r(C)\leq 2r(C^*) r(C)2r(C)
除非 P = N P P = NP P=NP,否则中心选择问题不存在2倍近似度以下的算法

带权顶点覆盖问题

问题描述:在顶点覆盖的条件下,满足所选顶点总权重之和最小
在这里插入图片描述
①竞价法
给每个边赋予一个价格 p e ≥ 0 p_e\geq0 pe0,任意顶点的权重大于等于与其邻接的所有边价格总和:
∑ e = ( i , j ) p e ≤ w i \sum_{e=(i,j)}p_e\leq w_i e=(i,j)pewi
公平引理:对于任意顶点覆盖集合 S S S和任意公平价格 p e p_e pe,有 ∑ e p e ≤ w ( S ) \sum_e p_e\leq w(S) epew(S)
在这里插入图片描述
贪心策略:只要存在一条边 e ( i , j ) e(i,j) e(i,j)其两个端点都未饱和,则增加该边的价格,直到其中一个端点饱和为止。重复上述操作,直到找不到满足上述的边为止。
在这里插入图片描述
证明竞价法是一个二倍近似算法
S S S为贪心算法终止时,所有饱和顶点的集合,易得 S S S为一个顶点覆盖(反证,如果某条边没有被覆盖到,则其两个端点都未饱和,算法不会终止)
证明关键: ∑ e ∈ E p e ≤ w ( S ∗ ) \sum_{e\in E}p_e\leq w(S^*) eEpew(S)
在这里插入图片描述

②线性规划方法近似
带权顶点覆盖问题可以转化为整数线性规划问题
在这里插入图片描述
顶点覆盖问题 ⇔ \Leftrightarrow 带权顶点覆盖(权重设为1) ⇔ \Leftrightarrow 整数线性规划( w i = 1 w_i=1 wi=1
如果我们能多项式时间解整数线性规划,则我们能多项式时间解带权顶点覆盖问题,但是整数线性规划是 N P H NPH NPH的,而一般线性规划可以多项式时间求解,因此我们用一般线性规划去近似整数线性规划的解。
证明线性规划的解取整是2倍近似的
在这里插入图片描述
x x x是线性规划的最优解,集合 S = { i ∈ V : x i ≥ 1 2 } S=\{i\in V:x_i\geq \frac{1}{2}\} S={iV:xi21}是一个顶点覆盖,且权重不超过最优顶点覆盖权重的2倍

  • 证明集合 S S S是一个顶点覆盖:对任意一条边 ( i , j ) (i,j) (i,j),由于 x i + x j ≥ 1 x_i+x_j\geq 1 xi+xj1,因此至少有一个值 ≥ 1 2 \geq\frac{1}{2} 21,即至少有一个端点在集合 S S S中,因此集合 S S S是一个顶点覆盖。
  • 集合 S S S权重不超过最优顶点覆盖权重的2倍:
    ∑ i ∈ S ∗ w i x i ∗ ≥ ∑ i ∈ S w i x i ≥ 1 2 ∑ i ∈ S w i \sum_{i\in S^*}w_ix_i^*\geq \sum_{i\in S}w_ix_i\geq\frac{1}{2}\sum_{i\in S}w_i iSwixiiSwixi21iSwi

中间项为没有整数限制的一般线性规划的解(没有近似的),最后一项表示近似后的权重和
除非 P = N P P=NP P=NP,不然没有近似度<1.3606的算法,即使所有权重都设为1

一般化的负载均衡

问题描述:增加了任务只能在授权机器上进行处理,仍然是一个任务只能在一台机器上连续工作,求最小化工期的任务分配方案
一般化的负载均衡可以与整数线性规划等价,当用一般线性规划近似时,问题含义会发生变化,即一个任务可以分成多片在不同授权机器上运行
x i j x_{ij} xij表示机器 i i i处理任务 j j j所用的时间
在这里插入图片描述
根据上述一般线性规划的解 x x x,我们可以构造一个无环图 G G G。如果 G G G有环,我们也可以通过流转换的形式,将其转换成一个等价的无环图的形式。
构造思路:选任意一个机器作为根节点,若 x i j > 0 x_{ij}>0 xij>0,则机器 i i i和任务 j j j之间存在一条边。
从上述无环图中,我们按照以下规则得到近似的分配方案(相当于线性规划的取整操作):

  • 如果任务 j j j是叶子节点,则将其分配给父亲节点的机器 i i i(相当于单授权节点)
  • 如果任务 j j j是非叶子节点,则将其分配给它随机的一个孩子节点机器(相当于可多授权节点)

两个事实

  • 任意一个任务的处理时长小于等于最优工期,即 t j ≤ L ∗ t_j\leq L^* tjL,因为 t j ≤ m a x j t j ≤ L ∗ t_j\leq max_jt_j\leq L^* tjmaxjtjL
    因为最大时间的任务总要被某个机器处理,工期至少为最大时间的任务
  • 叶子节点,表示能够处理该任务的机器只有一台,因此线性规划对应的解 x i j = t j x_{ij}=t_j xij=tj,因为需要满足 ∑ i x i j = t j \sum_i x_{ij} = t_j ixij=tj,且只有一项参与求和。

对于叶子结点:
在这里插入图片描述
对于非叶子节点:
在这里插入图片描述
综上全局负载: L i ≤ 2 L ∗ L_i \leq 2L^* Li2L

补充:通过流思想将有环图转化成无环图
x i j x_{ij} xij看成任务 j j j流向机器 i i i的流,任务指向机器的链路容量设置为 ∞ \infty ,机器节点到宿点的链路容量设置为 L L L,即最大工期。每个任务节点 j j j的出口流量之和为 t j t_j tj,最终流入宿点的总流量为 ∑ j t j \sum_jt_j jtj
在这里插入图片描述
如果存在环,则删除环中的一条边,调整流量(二部图抵消原则)依然满足原线性规划的约束,知道图中不存在环为止。
在这里插入图片描述
运行时间
对于线性规划而言,我们需要 x i j x_{ij} xij L L L,因此一共 m n + 1 mn+1 mn+1个变量。
对于流网络而言,我们需要 m + n + 1 m+n+1 m+n+1个节点,然后运行流算法

01背包问题

两种思路

  • 枚举物品集合、重量上限下的最大价值,一直枚举到 n n n个物品和最大重量,此时对应的最大价值为目标解
  • 枚举物品集合、价值下限下的最小重量,一直枚举到 n n n个物品和满足重量约束下的最小价值,此时对应的价值为目标解

①状态转移方程
在这里插入图片描述
最大能达到的重量为 W W W,最优的时间复杂度为 O ( n W ) O(nW) O(nW)

②状态转移方程
在这里插入图片描述
最大能达到的价值数为 n v m a x nv_{max} nvmax,因此计算复杂度为 O ( n 2 v m a x ) O(n^2v_{max}) O(n2vmax)

针对目标②我们给出相应的近似算法:
近似原则

  • 0 < ϵ < 1 0<\epsilon<1 0<ϵ<1:定义为近似程度
  • v m a x v_{max} vmax n n n个物品中最大的价值
  • θ \theta θ是放缩因子,是跟近似程度正相关的参数,定义为 θ = ϵ v m a x 2 n \theta = \frac{\epsilon v_{max}}{2n} θ=2nϵvmax,形象理解为含 k k k个0近似的大整数, k k k越大越粗糙,精度损失越大。
  • 若原物品价值为 v i v_i vi,则近似价值为 v i ‾ = ⌈ v i θ ⌉ θ \overline{v_i} = \lceil\frac{v_i}{\theta}\rceil \theta vi=θviθ,缩小相同倍数得到等价价值 ⌈ v i θ ⌉ \lceil\frac{v_i}{\theta}\rceil θvi

我们的近似算法相当于对大价值数进行向上凑整,因此恰好等于重量约束时,会比最优解的价值总和大一些,当然比非最优解大更多。大的程度跟凑整时的近似程度有关。下式非常直观:表示近似物品价值向上凑整后大于任意可行解(最优解是可行解中最大的那个,可以直接替换成最优解)。其中的价值都是没有近似的价值,近似算法得到的只是一个物品集合,不修改原价值:
( 1 + ϵ ) ∑ i ∈ S v i ≥ ∑ i ∈ S ∗ v i (1+\epsilon)\sum_{i\in S}v_i \geq \sum_{i\in S^*}v_i (1+ϵ)iSviiSvi

证明过程关键步骤在如何替换 θ \theta θ θ \theta θ的定义)以及如何替换 v m a x v_{max} vmax(任意解集合只放最大价值物品带入不等式)
在这里插入图片描述

近似算法时间复杂度
原先复杂度为 O ( n 2 v ^ m a x ) O(n^2\widehat{v}_{max}) O(n2v max),又 v ^ m a x = ⌈ v m a x θ ⌉ = ⌈ 2 n ϵ ⌉ \widehat{v}_{max} = \lceil \frac{v_{max}}{\theta}\rceil = \lceil\frac{2n}{\epsilon} \rceil v max=θvmax=ϵ2n,因此最优的时间复杂度为 O ( n 3 ϵ ) O(\frac{n^3}{\epsilon}) O(ϵn3)

  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值