近似算法與K-center問題的解釋不清楚筆記

注:本文作者也沒太搞懂K-center算法

什麼是近似算法?

因爲存在NP-Hard問題,沒有算法能在多項式時間找出最優解。
在設計算法的時候要考慮三個問題:1.最優解 2.快速 3.全部情況
如果三個都考慮,可能沒法在多項式時間內完成,所以就考慮2和3,在多項式的時間內找到一個解,這個解可能不是最優解,但也不會太壞。
這就是近似算法
常見例子有:裝箱問題(Bin Packing)、揹包問題(The Knapsack Problem)、紋理拼接問題(texture packing)

衡量近似算法

近似算法的得到的解不能太壞,不然我們就不用這個算法了。所以要能衡量這個算法的好壞,標準就是所得解與最優情況的比值,哪個放分母無所謂,但結果一定要大於1。
比值可能有小數位,變成大於它的最小整數(1.3->2),叫這個整數ρ (n)。
這個算法就叫做ρ(n)-approximation algorithm,顯然ρ(n)越小越好。

什麼是K-center問題

有一堆點(N),你要找到K箇中心的位置,每個中心形成一個半徑爲r的圓,這些圓能覆蓋所有的點。

K-center問題分析

定義dist(x,y)和 dist(x,C)x, y是點, C是點的集合。
dist(x, y):兩個點間的距離
dist(x, C):點x到C集合中所有點的距離的最小值,在本問題裏就是裏最近中心的距離
在這個問題裏,把點實體化爲老年人的房子(House->h),中心實體化爲老年人活動中心(Center->C)
問題就轉化爲求出所有的dist(h.i, C),然後取其最大值作爲r,這樣每個老年人都最多走r距離找到一個活動中心。
爲了讓老年人少走點路,K-center問題就需要找出讓r最小的K箇中心位置。
這個問題裏我們用C*和r*表示最佳的情況。

爲什麼K-center問題需要用近似算法解決

亟待解決!
第一反應是因爲K個點的位置組合太多了,遍歷會很慢。但很多非近似算法不需要考慮所有情況,只需要考慮某些情況(比如最優情況,greedy)
問題轉化爲:爲什麼其他算法思想沒法在多項式時間解決這個問題
下面第一個貪婪算法可能能幫助理解。

做了texture packing 的project,感覺四個算法的思想都是貪婪算法的思想,課件上K-center問題的兩個可行的2-approximation算法也都是貪婪算法。是否近似算法一般都用的貪婪算法的思想呢?

一個不可行的貪婪算法

先建造一個老年活動中心,讓老年人們都有地方去且r最小,然後再建第二第三個,縮小r的值。
但問題是建造了中心後拆起來不方便,就有可能出現特別糟糕的情況,讓這個中心不如廢棄。
舉例:兩個城市集資建立一個老年活動中心,當然會建在兩個城市間。但後來老年人們覺得還是太遠了,於是讓兒女衆籌出了可以再建兩個中心的錢,在各自城市建立了新的兩個中心。第一個中心就沒用了。(K = 3)r大幅度縮短,從高速路變成了城市街道的距離。
如果只衆籌出了一箇中心的錢,那還有一個城市的老年人要跑和以前一樣遠的距離(半條高速路長),r還是沒變。(K = 2),顯然多等一段時間在兩個城市各建一個纔是最優情況。

一個可行的貪婪算法 近似算法Greedy-2r

!!!!!!發現理解有點不太對,思考中。請不要看下去了
這個算法是預先設定一個r值,然後看看這個r值能不能解決問題。
如何看能否解決問題?
隨便選一個老年人A把他家作爲活動中心,那些離A距離在2r內的老年人就可以不用去別的中心了。然後在從剩下的老年人中重複這個操作,直到沒有老年人了爲止。
如果最後選出了K以內的老年人,r就是一個可行解。
如果選的比K多,說明r肯定比最優解r*要小。

//僞代碼
Centers  Greedy-2r ( Sites S[ ], int n, int K, double r )
{   Sites  S’[ ] = S[ ]; /* S’ is the set of the remaining sites */
    Centers  C[ ] = ∅;
    while ( S’[ ] != ∅ ) {
        Select any s from S’ and add it to C;
        Delete all s’ from S’ that are at dist(s’, s) ≤ 2r;
    } /* end-while */
    if ( |C| ≤ K ) return C;
    else ERROR(No set of K centers with covering radius at most r);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章