Algorithm 如何找到;中心“;图中顶点子集的?
我有一个无向、正加权的连通图,它的顶点Algorithm 如何找到;中心“;图中顶点子集的?,algorithm,graph,graph-algorithm,Algorithm,Graph,Graph Algorithm,我有一个无向、正加权的连通图,它的顶点V和边E。我还有一个子集S。目前V包含大约22000个顶点和E大约23000条边,但对于较大的输入,这些边预计将增加到大约一百万条S通常包含少于1000个顶点,并且它们在图形中相对靠近 我想找到S的“中心”,意思是V中的一个顶点c,从该顶点到S中最远顶点的距离尽可能小。它类似于,但只适用于顶点的子集。[编辑:]它也是图形上的一个符号;更一般的k-中心问题是NP难问题,但这个问题可能更容易 有没有一种算法可以有效地找到这个中心?理想情况下,性能只取决于S及其周
V
和边E
。我还有一个子集S
。目前V
包含大约22000个顶点和E
大约23000条边,但对于较大的输入,这些边预计将增加到大约一百万条<另一方面,code>S通常包含少于1000个顶点,并且它们在图形中相对靠近
我想找到S
的“中心”,意思是V
中的一个顶点c
,从该顶点到S
中最远顶点的距离尽可能小。它类似于,但只适用于顶点的子集。[编辑:]它也是图形上的一个符号;更一般的k-中心问题是NP难问题,但这个问题可能更容易
有没有一种算法可以有效地找到这个中心?理想情况下,性能只取决于S
及其周围环境,而不是整个图形
我曾经考虑过从
s
中的所有顶点同时开始广度优先搜索s\u I
,当所有s\u I
都遇到顶点v\u I
时停止搜索,但这并不太有效。在这种情况下,这可能是可行的,但感觉可能有更好的方法。这里有一个近似算法,它应该提供一个合适的时间质量折衷曲线。第一部分是由于Teofilo F.Gonzalez(聚类以最小化最大聚类间距离,1985年),但我无法立即找到第二部分的引用,可能是因为它太薄,无法成为主要结果
设k为您愿意运行Dijkstra算法的次数(如您所建议的,在到达所有s后截断)。冈萨雷斯的算法运行dijkstrak− 1次,将端子S划分为k个簇,以便2-近似最小化最大簇半径。方便的是,它产生了一个副产品k,即分离良好的中心C和k的最短路径树− 其中1个。我们再次运行Dijkstra,然后选择相对于C的最佳1-中心。该中心满足
approximate objective ≤ optimal objective + maximum cluster radius.
用k来量化近似因子有点棘手。关键是有界双维,我将通过假设欧几里德距离来说明这一点。假设我们试图找到半径为1的圆盘的1-中心。最佳位置是磁盘的中心。盘中可以有多少个不相交的radius-r球?它们的面积包含在半径为(1+r)的圆盘内,圆盘的面积为π(1+r)²,因此最多(π(1+r)²)/πr²=(1/r+1)²。最大簇半径为2r,或以k表示,约为4/√k是最佳目标的k倍,因此k=100将为您提供一个在最佳目标20%范围内的解决方案。双维基本上使用这个参数作为定义
作为参考,冈萨雷斯的算法是
然后我们从最近选择的点再次运行Dijkstra,然后为选择的点选择最佳的1-中心。我不知道如何分析该算法,也不知道引用,但它似乎可以工作
要有效地计算树的中心,请在每个节点的所有子节点上标记到根的最大距离(在线性时间内,通过按后期顺序访问节点)。然后,通过具有最大标签的子项在树中下降,只要它能提高半径。子树中的所有内容都会随着子树父边的长度而变得更近;其他一切都将以同样的数量进一步发展。一个想法: 让我们以保持其他节点的距离不变的方式除去所有不在S中的节点。如何做到这一点:
- 对于不在S中的每个节点,删除该节点并将其替换为连接其相邻节点的边。如果此边比已连接这些节点的边短,请将其替换注意这应该是合理的,因为您提到的边数与节点数大致相同
- 这不应该破坏任何东西,因为它通过使用新边连接两个节点来保持两个节点之间的最小距离相同。它只是删除了一些节点
- 从具有最低度数的节点开始:可以立即切割叶片(S中除外),度数为2的节点将替换为单条边(技术上为K2)。deg>2的任何节点都将被K(邻居)替换。幸运的是,图形中的平均度数似乎没有您提到的那么大,因为节点和边的数量相似
- 解构最坏情况(即完整图形)需要| V |*| E |(每个节点都有需要替换的所有边,每次替换节点时都会更新图形的其余部分和所有边)。您的案例应该便宜得多,因为您的图形只有| V |边,所以您很可能无法获得完整的| V | ^ E |(| V | ^3),直到更深入的线,当计数为