使用igraph,网络或其他R包计算有向无环图的所有生成树

时间:2019-04-17 20:21:29

标签: r distance igraph graph-theory

我想为图形计算完整的生成树集。我正在使用的图形很小(通常少于10个节点)。

我看到了使用igraph计算最小生成树的功能:

library(igraph)
g <- sample_gnp(100, 3/100)
g_mst <- mst(g)

,我看到一个previous StackOverflow post,描述了如何使用breadth-first search计算生成树。以下代码改编自公认的答案:

r <- graph.bfs(g, root=1, neimode='all', order = TRUE, father = TRUE)
h <- graph(rbind(r$order, r$father[r$order, na_ok = TRUE])[,-1], directed = FALSE)

但是,我不知道如何使它适应计算多个生成树。如何修改此代码以计算所有生成树?我认为这其中的一部分将是遍历每个节点以用作每棵树的“根”,但是我不认为这会一直困扰着我(因为仍然可能存在多个关联的生成树)具有给定的根节点)。

编辑

最终目标是计算图的失真,其定义如下(link, see page 5):

  

考虑图 G 上的任何生成树 T ,并计算平均距离 t = E [H T ] <共享 G 中的链接的任意两个节点之间的 T 上的/ em>。失真度测量 T 如何扭曲 G 中的链接,即,它测量从 G 中的链接的一侧需要经过多少跳。另一方面,如果我们仅限于使用 T 。畸变定义为[13],它是在所有可能的 T 中最小的平均值。直觉上的失真度衡量的是树状图。

     

[13] R. G. H. Tagmunarunkit和S. Jamin,“网络拓扑生成器:基于程度与结构的关系”,在SIGMCOMM中,2002年。

1 个答案:

答案 0 :(得分:3)

我认为您不会在R包上找到执行此操作的函数。

图上有n ^ {n-2}个生成树(根据Cayley's formula)。即使在具有10个节点的图上,也可能存在1,000,000,000个不同的生成树,这是一个很大的数目。

此外,计算或枚举给定图的所有生成树的问题是#P-Complete,与NP-Complete问题一样困难。

如果您真的愿意这样做,我建议您删除R并开始使用C或C ++,它们可以比任何R代码都能更快地计算出问题。
看看this paper上有关计算连接图的所有生成树的算法的调查(我认为这是您的情况)。