如何将无向图的节点划分为k个集

时间:2014-10-23 05:23:15

标签: algorithm graph cluster-analysis

我有一个无向图G =(V,E),其中每个顶点代表一个大型网络中的路由器。每条边表示从一个路由器到另一个路由器的网络跳,因此,所有边都具有相同的权重。我希望将这个路由器网络划分为3个或5个不同的集合,这些集合按跳数计算。

动机: 我们的想法是在这三组中包含的路由器中复制一些数据。这样,无论何时网络图中的节点(或客户端或其他)请求某个数据项,我都可以在3个集中搜索它,并从每个集中获取一个负责任的节点(一个缓存了该特定数据的节点) 。然后我选择离请求节点最小跳数的节点,继续我的算法和测试。

缓存分发和请求响应不在此问题的范围内。我只需要一种方法将网络划分为3组,以便我可以对它执行上述操作。

在这种情况下可以使用哪种聚类算法。我在图中有大约9000个节点,我希望每组获得3组~3000个节点

1 个答案:

答案 0 :(得分:2)

在图形情况下,可以使用基于最小生成树的聚类方法。

常规算法如下:

  1. 查找图表的最小生成树。
  2. 移除生成树中的k - 1最长边,其中k是所需的群集数。
  3. 但是,这仅适用于边缘长度(或重量)不同的情况。在长度相等的边缘的情况下,每个生成树是最小的,因此这不会很好。但是,稍微考虑一下,我想到了一种使用BFS的不同算法。

    算法:

    1. for i = 1..k do // for each cluster
    2.     choose the number of nodes N in cluster i
    3.     choose an arbitrary node n
    4.     run breadth-first search (BFS) from n until N
    5.     assign the first N nodes (incl. n) tapped by the BFS to the i-th cluster
    6.     remove these nodes (and the incident edges) from the graph
    7. done
    

    这个算法(结果)很大程度上取决于步骤3,即选择" root"实现了集群的节点。为了简单起见,我选择了一个任意节点,但它可能更复杂。最好的节点是那些在" end"图表。您可以找到图形的中心(具有到所有其他节点的路径长度的最小总和的节点),然后使用来自该中心的加速节点。

    真正的问题是你的边缘相等(如果我理解你的问题陈述)并且你没有关于节点的信息(即它们的坐标 - 那么你可以使用例如k-means)。