近似算法与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);
}

你可能感兴趣的:(DS)