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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用igraph,网络或其他R包计算有向无环图的所有生成树相关的知识,希望对你有一定的参考价值。

我想为图形计算完整的生成树集。我正在使用的图表很小(通常少于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,并计算在G中共享链路的任意两个节点之间的T上的平均距离t = E [HT]。失真测量T如何扭曲G中的链路,即它测量多少额外的链路如果我们被限制使用T,则需要将跳从G中的链路的一侧转到另一侧。将失真定义为[13]是所有可能Ts上的最小平均值。直观的失真测量图形的树状结构。

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

答案

我不认为你会在R包上找到一个功能。

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

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

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

以上是关于使用igraph,网络或其他R包计算有向无环图的所有生成树的主要内容,如果未能解决你的问题,请参考以下文章

有向无环图的判定及拓扑排序

一个有向无环图的拓扑排序序列是否唯一的

算法:有向无环图的最短路径

有向无环图的哈希值

HOJ 13845 Atomic Computer有向无环图的动态规划

如何利用拓扑排序將一个有向无环图的邻接短阵中的非零元素集中到对角线以上?