近似算法与K-center问题的解释不清楚笔记
2017-05-30 12:09
447 查看
注:本文作者也没太搞懂K-center算法
在设计算法的时候要考虑三个问题:1.最优解 2.快速 3.全部情况
如果三个都考虑,可能没法在多项式时间内完成,所以就考虑2和3,在多项式的时间内找到一个解,这个解可能不是最优解,但也不会太坏。
这就是近似算法
常见例子有:装箱问题(Bin Packing)、背包问题(The Knapsack Problem)、纹理拼接问题(texture packing)
比值可能有小数位,变成大于它的最小整数(1.3->2),叫这个整数ρ (n)。
这个算法就叫做ρ(n)-approximation algorithm,显然ρ(n)越小越好。
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个点的位置组合太多了,遍历会很慢。但很多非近似算法不需要考虑所有情况,只需要考虑某些情况(比如最优情况,greedy)
问题转化为:为什么其他算法思想没法在多项式时间解决这个问题
下面第一个贪婪算法可能能帮助理解。
做了texture packing 的project,感觉四个算法的思想都是贪婪算法的思想,课件上K-center问题的两个可行的2-approximation算法也都是贪婪算法。
但问题是建造了中心后拆起来不方便,就有可能出现特别糟糕的情况,让这个中心不如废弃。
举例:两个城市集资建立一个老年活动中心,当然会建在两个城市间。但后来老年人们觉得还是太远了,于是让儿女众筹出了可以再建两个中心的钱,在各自城市建立了新的两个中心。第一个中心就没用了。(K = 3)r大幅度缩短,从高速路变成了城市街道的距离。
如果只众筹出了一个中心的钱,那还有一个城市的老年人要跑和以前一样远的距离(半条高速路长),r还是没变。(K = 2),显然多等一段时间在两个城市各建一个才是最优情况。
这个算法是预先设定一个r值,然后看看这个r值能不能解决问题。
如何看能否解决问题?
随便选一个老年人A把他家作为活动中心,那些离A距离在2r内的老年人就可以不用去别的中心了。然后在从剩下的老年人中重复这个操作,直到没有老年人了为止。
如果最后选出了K以内的老年人,r就是一个可行解。
如果选的比K多,说明r肯定比最优解r*要小。
什么是近似算法?
因为存在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); }
相关文章推荐
- 要是我问的问题你解释的不清楚,我就喂你袋盐!
- 简单的问题没解释清楚,真不想问他第二遍,太气人
- powercenter 8.5.1实践笔记2 ——数据源驱动程序问题
- 简单的问题没解释清楚,真不想问他第二遍,太气人
- PowerCenter问题笔记
- [置顶] React中一个没人能解释清楚的问题——为什么要使用Virtual DOM
- Help_装箱/拆箱后的【==】与【Equals】问题,『★世界第一难题★』,也许只有编译器才能解释清楚_AX
- Python学习笔记0001:字符串切片问题解释
- 还是一个类的初始化问题(初始化过程解释的非常清楚)
- Qt中文乱码问题(比较清楚,同一个二进制串被解释成不同的语言)
- STL学习笔记:用非递归的方法实现汉诺塔问题
- 关于字节对齐问题的解释.
- 异常(Exception)问题的笔记
- 关于Tomcat: The value for the useBean class attribute is invalid 问题的另类解释
- [问题征解]请解释下ubuntu 510 firefox的flash不发音的问题
- Oracle 学习过程中的笔记以及几个问题
- 自己对“一个C的实验及疑惑 ”一文中问题的解释!
- 大三下学期开学.近期linux,java,eclipse一些小问题的笔记.
- (问题)零碎笔记
- [笔记]3.软件代码中的BUG问题的一些记录