问题定义
- INPUT
- n n n个地点: S = { s 1 , s 2 , . . . , s n } S = \{s_1,s_2,...,s_n\} S={s1,s2,...,sn}
- 中心的个数: k k k
- OBJECTIVE
- 在所有地点中,使得地点到最近的中心的最大距离最小: min max s ∈ S min c ∈ C e n t e r s d i s t ( s , c ) \min \max _{s\in S} \min _{c\in Centers} dist(s,c) minmaxs∈Sminc∈Centersdist(s,c)
Center Selection Algorithm
- 思路:
- 初始化:任意选一个site加入中心点集合
- 选择距离中心点集合最远的site加入中心点集合
- 注:离中心点集合最远的site是指 max s ∈ S min c ∈ C e n t e r s d i s t ( s , c ) \max _{s \in S} \min _{c\in Centers} dist(s,c) maxs∈Sminc∈Centersdist(s,c) - 重复2直到选出了 k k k个中心点
- 代码:
def center_selection(sites, k):
# 初始化:选择第一个site加入中心点集合
initial = sites[0]
centers = [initial]
# 重复步骤2,选择一个最远的点,加入中心点
for i in range(k - 1):
futherst = 0
for site in sites:
if site in centers:
continue
dis = assign_center(centers, site)[0]
if dis > futherst:
futherst = dis
next_site = site
# next_site.display_location()
centers.append(next_site)
return centers
算法上界
令最优解为 r ∗ r^* r∗,算法得到的解为 r r r。
- 首先考虑
vitural center selection
算法,即当我们知道 r ∗ r^* r∗时,我们可以构建该 2 − a p p r o x i m a t i o n 2-approximation 2−approximation算法如下:- 任意选择一个地点,加入中心点集合
- 将所有与该中心点距离小于等于
2
r
∗
2r^*
2r∗的点移除,重复步骤1直到选出了k个中心点。
- 注:若此时仍有点未被覆盖,则说明 r ∗ r^* r∗无法达到,因为对于中心c而言,同属于同一中心的点之间的最大距离不超过 2 r ∗ 2r^* 2r∗
- 对于中心选址算法而言,若 s s s离中心集合的距离大于 2 r ∗ 2r^* 2r∗,则可看作与虚拟中心选址算法相同,否则,说明所有的点离中心的距离都小于 2 r ∗ 2r^* 2r∗。
- 因此,此为 2 − a p p r o x i m a t i o n 2-approximation 2−approximation算法
例子
-
r
(
C
)
≈
2
r
(
C
∗
)
r(C) \approx 2r(C^*)
r(C)≈2r(C∗)
选(0,0)为初始点 -
r
(
C
)
=
r
(
C
∗
)
r(C) = r(C^*)
r(C)=r(C∗)
选(1,1)为初始点