一、近似算法的概念
1、爲啥要研究近似算法?
目前大規模的NPC問題我們無法通過計算得到,因此我們需要通過損失一部分精度的做法來找到多項式的近似算法。
2、近似算法精度的評價
用近似算法得到的解與原問題的最優解比值不超過ρ,則稱該算法是ρ−近似算法。難點在於在不知道最優解的情況下證明近似解與最優解的近似程度。
二、幾個經典的近似問題
1、負載均衡問題
負載均衡問題:給出m個機器,n個任務,設任務j處理時長爲tj。要求如下:
- 每個任務只能在一個機器上不間斷的完成
- 每個機器不能同時處理多個任務
設S[i]表示給機器i處理的任務集合,則機器i的處理時長爲L[i]=∑j∈S[i]tj。負載均衡問題的目標就是 找到一種任務分配方案使得min(max(L[i])),即讓每個機器處理的任務的時長儘可能均衡。
這個問題是NPC問題,因爲Partiton問題≤P負載均衡問題。
近似策略1
貪心策略:每次在機器中選出當前處理時長最短的機器處理下一個任務。時間複雜度爲O(nlogm),對於每個任務都需要從m個機器中選出處理時長最短的機器,這個用優先隊列維護即可。這個近似算法是2-近似的,證明如下:
- 引理1:設最優解爲L∗,則L∗≥maxjtj,因爲至少一個機器要處理一個任務,所有任務中花費時間最長的任務所需時間爲maxjtj,故得到此不等式。
- 引理2:L∗≥m1∑jtj。當每個機器處理任務的時長相同時L∗=m1∑jtj,顯然其他情況下L∗>m1∑jtj。
- 假設最後一個任務j給了機器i,說明在此之前,機器i的負載時長最小,即L[i]−tj≤L[k](對任意k滿足1≤k≤m)。
- 因爲對任意一個機器k都滿足L[i]−tj≤L[k],因此m(L[i]−tj)≤∑kL[k],即L[i]−tj≤m1∑kL[k]=m1∑jtj≤L∗(引理2)
- 到這裏,該近似算法求解的結果L=L[i]=(L[i]−tj)+tj≤L∗+L∗=2L∗,即L≤2L∗,該貪心策略是該問題的2-近似算法。
該近似算法能達到最優解的2倍嗎,即上述不等式是緊的嗎?是緊的!
近似策略2
策略2:將任務按照處理時長tj從大到小排序,之後再每次在機器中選出當前處理時長最短的機器處理下一個任務。時間複雜度爲O(nlogn+nlogm)。這個近似算法是23−近似的,證明如下:
- 引理3:假設有m個機器,超過m個任務,這些任務按照處理時長排好序,t1≥t2≥⋯≥tm+1≥⋯,則顯然某個機器上至少要處理兩個任務,則最優解L∗≥2tm+1。
- 從近似策略1的推導可以得到L=L[i]=(L[i]−tj)+tj,假設機器i上至少有2個任務,則利用引理3可得tj≤21L∗,故L≤23L∗,該策略是該問題的23−近似算法。
該近似算法能達到最優解的23倍嗎,即上述不等式是緊的嗎?不是緊的!
2、中心點選擇問題
問題描述:給出n個點s1,⋯,sn,從中選出k個點C,設每個點到最近的中心點C的距離爲di,問採取何種策略選出這k個點使得r(C)=max(di)最小。這個問題是NPH問題。
貪心策略:初始時隨機選一個點作爲中心點,之後的k−1次,每次遍歷除已選做中心點的其他點,找出與該點距離最近的某個中心點計算出距離dj。最後在這些點中找出maxjdj對應的點作爲下一個中心點。這個近似算法是2-近似的,證明如下:
- 設C∗是最優解對應的中心點,C是用上述貪心算法選出的中心點,則r(C)≤2r(C∗)。
3、帶權頂點覆蓋問題
圖的每個頂點都有權重,找一個圖的頂點集合能覆蓋所有的邊,問如何選擇頂點使得這些頂點的權重和最小。用競價法去近似求解。
- 對於某個頂點i,其權重爲wi,與該頂點相連的邊記爲p,給這些邊賦值權重,使得∑e=(i,j)pe≤wi。
- 設S爲任意一個集合覆蓋,則∑epe≤∑i∈S∑e=(i,j)pe≤∑i∈Swi=w(S),故∑epe≤w(S)。
- 算法流程:對於圖中任意一條邊e=(i,j),令pe=0,當i,j頂點的∑e=(i,j)pe<wi,∑e=(i,j)pe<wj時,增加pe直到滿足∑e=(i,j)pe=wi或者∑e=(i,j)pe=wj。這時候相等的那個頂點放入S中。
- 競價法是2-近似算法,證明如下: