首先,我们通过给出一个实例来讲述一下什么是k-中心问题?
给定一个城市集合以及城市间的距离,从中选取k个城市来设置仓库,使得各城市与离它最近的仓库的距离中的最大者达到最小。(此类问题就称为k-中心问题)
如下图所示:
仓库:C F 城市:A B D E
A 距离C仓库最近 距离为5
B 距离C仓库最近 距离为15
D 距离F仓库最近 距离为4
E 距离F仓库最近 距离为9
各城市最近仓库距离中的最大值为15
本章研究的是k-中心问题以及它在边费用满足三角不等式限制下的加权形式。(重要前提:P≠NP)
问题:
以之前的城市-仓库为例,S为城市,V为仓库,connect(v,S)为最近距离,max{connect(v,S)}为各城市最近仓库距离中的最大值15。现在想要的是最小化该最大值15.
一、参数模型剪枝(Parametric pruning)应用于度量k-中心
首先,我们来介绍一下关于剪枝的概念(参考https://www.cnblogs.com/fusiwei/p/11759489.html):
以深度优先遍历为例,从起始节点开始深搜,若要完全遍历,则需要搜索所有的节点。但是在解决实际问题的过程中,我们往往可以发现,有一些点和它们的子节点显然不符合题意,压根就没必要进行搜索。那么我们就在算法中加入一个判断条件,使得这棵子树在搜索的时候不会被进入,以此优化时空复杂度。因为这个优化的技巧非常像在树上砍冗余的枝条,所以起了一个名字叫做:剪枝。
支配集(dominating set):
对于图G = (V, E) 来说,支配集指的是从顶点集 V 中取一些点组成一个集合,使得 V 中剩余的点都与取出来的点中的某个点有边相连.也就是说,设 D 是图的一个支配集,则对于图中的任意一个顶点 u ,要么属于集合 D, 要么与 D 中的顶点相邻.
最小支配集(minimum dominating set ):
称G 的所有支配集中顶点个数最少的支配集为最小支配集,最小支配集中的顶点个数称为支配数.如下图:
(C,D)(C,D,E)等等都是支配集,也是最小支配集
图的平方( square of graph):
若无向图H中u,v之间(u≠v)存在长度不超过2的路,则H的平方包含边(u,v).如下图所示:
下面介绍k-中心算法:
算法思想:将图G中的边按cost大小从小到大进行排序,然后从中找到一个最小的i,使得Gi有一个大小至多为k的支配集(这里的k个支配集可以理解为一开始的城市问题中的设置了仓库的城市集合,其余城市和支配集中的城市有路连接)。
M1={B,C,D}(不唯一) M2={A,B} M3={A}或{B}或{C}或{D} M4={A}或{B}或{C}或{D}
所以,取M3即可,即最优解为{A}或{B}或{C}或{D}(假设k=1)
具体证明详见《近似算法》第44-45页。
二、加权形式
除了边集上的费用函数外,还给定顶点集上的权函数和界限
得到了下面的改进算法:
区别在于多了第三步和第四步(s(u)表示顶点u在图H中的权重最轻的邻接点)
具体证明参见《近似算法》第46-47页