算法分析与设计——近似算法

一、近似算法的概念

1、为啥要研究近似算法?

\quad目前大规模的NPC问题我们无法通过计算得到,因此我们需要通过损失一部分精度的做法来找到多项式的近似算法。

2、近似算法精度的评价

\quad用近似算法得到的解与原问题的最优解比值不超过ρρ,则称该算法是ρρ-近似算法。难点在于在不知道最优解的情况下证明近似解与最优解的近似程度。

二、几个经典的近似问题

1、负载均衡问题

\quad负载均衡问题:给出mm个机器,nn个任务,设任务jj处理时长为tjt_j。要求如下:

  • 每个任务只能在一个机器上不间断的完成
  • 每个机器不能同时处理多个任务

\quadS[i]S[i]表示给机器ii处理的任务集合,则机器ii的处理时长为L[i]=jS[i]tjL[i]=\sum_{j\in S[i]}t_j。负载均衡问题的目标就是 找到一种任务分配方案使得min(max(L[i]))min(max(L[i])),即让每个机器处理的任务的时长尽可能均衡。
\quad这个问题是NPC问题,因为PartitonPPartiton问题 \le_P 负载均衡问题

近似策略1

\quad贪心策略:每次在机器中选出当前处理时长最短的机器处理下一个任务。时间复杂度为O(nlogm)O(nlogm),对于每个任务都需要从mm个机器中选出处理时长最短的机器,这个用优先队列维护即可。这个近似算法是2-近似的,证明如下:

  • 引理1:设最优解为LL^*,则LmaxjtjL^*\geq max_jt_j,因为至少一个机器要处理一个任务,所有任务中花费时间最长的任务所需时间为maxjtjmax_jt_j,故得到此不等式。
  • 引理2L1mjtjL^* \geq \frac{1}{m}\sum_jt_j。当每个机器处理任务的时长相同时L=1mjtjL^* = \frac{1}{m}\sum_jt_j,显然其他情况下L>1mjtjL^* > \frac{1}{m}\sum_jt_j
  • 假设最后一个任务jj给了机器ii,说明在此之前,机器ii的负载时长最小,即L[i]tjL[k](k1km)L[i]-t_j\le L[k](对任意k满足1 \le k \le m)
  • 因为对任意一个机器kk都满足L[i]tjL[k]L[i]-t_j\le L[k],因此m(L[i]tj)kL[k]m(L[i]-t_j)\le \sum_kL[k],即L[i]tj1mkL[k]=1mjtjL(2)L[i]-t_j\le \frac{1}{m}\sum_kL[k]=\frac{1}{m}\sum_j t_j \le L^*(引理2)
  • 到这里,该近似算法求解的结果L=L[i]=(L[i]tj)+tjL+L=2LL=L[i]=(L[i]-t_j)+t_j \le L^*+L^*=2L^*,即L2LL\le 2L^*,该贪心策略是该问题的2-近似算法。

\quad该近似算法能达到最优解的2倍吗,即上述不等式是紧的吗?是紧的!

近似策略2

\quad策略2:将任务按照处理时长tjt_j从大到小排序,之后再每次在机器中选出当前处理时长最短的机器处理下一个任务。时间复杂度为O(nlogn+nlogm)O(nlogn+nlogm)。这个近似算法是32\frac{3}{2}-近似的,证明如下:

  • 引理3:假设有mm个机器,超过mm个任务,这些任务按照处理时长排好序,t1t2tm+1t_1\ge t_2 \ge \cdots \ge t_{m+1} \ge \cdots,则显然某个机器上至少要处理两个任务,则最优解L2tm+1L^*\ge 2t_{m+1}
  • 从近似策略1的推导可以得到L=L[i]=(L[i]tj)+tjL=L[i]=(L[i]-t_j)+t_j,假设机器ii上至少有2个任务,则利用引理3可得tj12Lt_j\le \frac{1}{2}L^*,故L32LL\le \frac{3}{2}L^*,该策略是该问题的32\frac{3}{2}-近似算法。

\quad该近似算法能达到最优解的32\frac{3}{2}倍吗,即上述不等式是紧的吗?不是紧的!

2、中心点选择问题

\quad问题描述:给出nn个点s1,,sns_1,\cdots,s_n,从中选出kk个点CC,设每个点到最近的中心点CC的距离为did_i,问采取何种策略选出这kk个点使得r(C)=max(di)r(C)=max(d_i)最小。这个问题是NPH问题。
\quad贪心策略:初始时随机选一个点作为中心点,之后的k1k-1次,每次遍历除已选做中心点的其他点,找出与该点距离最近的某个中心点计算出距离djd_j。最后在这些点中找出maxjdjmax_j d_j对应的点作为下一个中心点。这个近似算法是2-近似的,证明如下:

  • CC^*是最优解对应的中心点,CC是用上述贪心算法选出的中心点,则r(C)2r(C)r(C)\le 2r(C^*)

3、带权顶点覆盖问题

\quad图的每个顶点都有权重,找一个图的顶点集合能覆盖所有的边,问如何选择顶点使得这些顶点的权重和最小。用竞价法去近似求解。

  • 对于某个顶点ii,其权重为wiw_i,与该顶点相连的边记为pp,给这些边赋值权重,使得e=(i,j)pewi\sum_{e=(i,j)}p_e \le w_i
  • SS为任意一个集合覆盖,则epeiSe=(i,j)peiSwi=w(S)\sum_ep_e\le \sum_{i\in S}\sum_{e=(i,j)}p_e\le \sum_{i\in S}w_i=w(S),故epew(S)\sum_ep_e\le w(S)
  • 算法流程:对于图中任意一条边e=(i,j)e=(i,j),令pe=0p_e=0,当i,ji,j顶点的e=(i,j)pe<wi,e=(i,j)pe<wj\sum_{e=(i,j)}p_e<w_i,\sum_{e=(i,j)}p_e<w_j时,增加pep_e直到满足e=(i,j)pe=wie=(i,j)pe=wj\sum_{e=(i,j)}p_e=w_i或者\sum_{e=(i,j)}p_e=w_j。这时候相等的那个顶点放入SS中。
    在这里插入图片描述
  • 竞价法是2-近似算法,证明如下:
    在这里插入图片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章