【问题标题】:Compute ALL spanning trees of a directed acyclic graph using igraph, network, or other R package使用 igraph、network 或其他 R 包计算有向无环图的所有生成树
【发布时间】:2023-03-12 10:25:01
【问题描述】:

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

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

【问题讨论】:

    标签: r distance igraph graph-theory


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢,这是有道理的,但让我对通常如何计算 distortion 图形指标感到困惑(这是我的最终目标)。你熟悉这个指标吗?我编辑了我的帖子以包含定义。
    • 另外值得一提的是,我的用例仅限于 DAG(有向无环图)。现在我想多了……也许这个指标在这里没有意义。
    • 既然你有有向图,那么跨越树枝的数量(是的,名字改变了)是 n^{(n-2)/2}。但是,这仍然是一个很大的数字:(
    • 我以前从未见过这个指标。但是,我们可以看看文献。可能有更好的选项(和一些图形属性)允许您在不计算图形的所有跨越树状结构的情况下计算它
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2015-08-16
    • 2014-06-25
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多