3

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

我使用 igraph (0.6.5) 库创建了一个加权完整图,如下所示:

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”克鲁斯卡尔的算法中实现。

我可以将我的生成图表示为 data.frame:

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

有没有一种简单的方法可以用 R 中的克鲁斯卡尔算法计算 mst?

4

2 回答 2

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)
于 2013-05-17T17:35:49.450 回答
0

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

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

于 2013-05-17T10:00:53.507 回答