使用Kruskal算法的最小生成树

时间:2013-05-17 09:33:39

标签: r igraph minimum-spanning-tree kruskals-algorithm

如何使用Kruskal算法计算im R(3.0.0 - Linux x32)最小生成树?

我用igraph(0.6.5)库创建一个加权的完整图形作为folws:

set.seed(1234567890)
g <- graph.full(n = 20)
E(g)$weight <- round(runif(ecount(g)), 2) * 100

我能用Prim(igraph)来计算最小的树木。

mstPrim <- minimum.spanning.tree(g, algorithm = "prim")

但不幸的是,在“igraph”中没有实施Kruskal算法。

我可以将我的基因图表表示为data.frame:

edgeMatrix <- data.frame(cbind(get.edgelist(g), E(g)$weight))
names(edgeMatrix) <- c("from", "to", "weight")

有没有一种简单的方法可以用R中的Kruskal算法计算mst?

2 个答案:

答案 0 :(得分:2)

使用RBGL包的一个小解决方法:

#convert with graph packagege to BAM class of graph an calculate mst
mstKruskalBAM <- mstree.kruskal(graphBAM(edgeMatrix))
#build new data frame with resut
mstKruskalDF <- data.frame(cbind(t(mstKruskalBAM$edgeList),
                                 t(mstKruskalBAM$weight)))
#convert back to igraph package
mstKruskal <- graph.data.frame(mstKruskalDF, directed=FALSE)

现在可以绘制并比较aloriph和定义这样的布局算法:

plot(mstPrim, layout = layout.kamada.kawai, edge.label = E(mstPrim)$weight)
plot(mstKruskal, layout = layout.kamada.kawai, edge.label = mstKruskal$weight)

答案 1 :(得分:0)

我认为ape包中的mst函数实现了这一点。

http://cran.r-project.org/web/packages/ape/ape.pdf