我有一个无向图G =(V,E),其中每个顶点代表一个大型网络中的路由器。每条边表示从一个路由器到另一个路由器的网络跳,因此,所有边都具有相同的权重。我希望将这个路由器网络划分为3个或5个不同的集合,这些集合按跳数计算。
动机: 我们的想法是在这三组中包含的路由器中复制一些数据。这样,无论何时网络图中的节点(或客户端或其他)请求某个数据项,我都可以在3个集中搜索它,并从每个集中获取一个负责任的节点(一个缓存了该特定数据的节点) 。然后我选择离请求节点最小跳数的节点,继续我的算法和测试。
缓存分发和请求响应不在此问题的范围内。我只需要一种方法将网络划分为3组,以便我可以对它执行上述操作。
在这种情况下可以使用哪种聚类算法。我在图中有大约9000个节点,我希望每组获得3组~3000个节点
答案 0 :(得分:2)
在图形情况下,可以使用基于最小生成树的聚类方法。
常规算法如下:
k - 1
最长边,其中k
是所需的群集数。但是,这仅适用于边缘长度(或重量)不同的情况。在长度相等的边缘的情况下,每个生成树是最小的,因此这不会很好。但是,稍微考虑一下,我想到了一种使用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)。