【问题标题】:Generating all DAGs with n vertices生成所有具有 n 个顶点的 DAG
【发布时间】:2016-11-12 05:17:23
【问题描述】:

我想生成具有 n 个顶点的所有 DAG,直到同构 - 即,没有重复的未标记 DAG。是的,我知道其中有很多 很多,但我最关心的是仍然可以处理的小数字(例如,n 小于 10)。

添加所有可能的边组合等显而易见的方法有两个主要缺点:

  1. 这样的图形比唯一图形生成更多的重复(同构),尤其是随着n 的增长。
  2. 需要检查每个生成的图表是否包含循环。

【问题讨论】:

  • 我有。据我所知, nauty 仅对无向图有效。理论上可以生成所有无向图,然后生成此类图的所有非同构方向,但这种方法在没有环等限制条件下不实用。

标签: algorithm language-agnostic graph-theory enumeration


【解决方案1】:

您可以从 simple complete graph Kn 开始,其中 n 是图形的顺序,然后枚举其所有 spanning treesThe algorithm 是修改后的 DFS,因为它使用回溯并在探索所有可能的不同组合时避免 bridges(以继续生成连接的树)。

根据Cayley's formula,有n^(n-2)(其中^ 表示提升到幂)在Kn 上生成树,因此您最坏的情况可能看起来像9^7=4782969 并包含重复项。

这也让人想起Motif Detection 中的“子问题”,其中some algorithms(或this one)的目标是生成all simple connected graphs (not limited to trees) of order n (motifs),然后生成图的分解到这 n 个主题中。所以,这些文献可能对你也有一些用处。

希望这会有所帮助。

【讨论】:

  • 主要问题是“有重复”。我的问题不够清楚(我现在已经添加了说明),但主要技巧是避免大多数天真的方法中固有的重复(即生成同构的 DAG)。此外,您对n=9 的估计似乎不正确 - 实际上,n=9 有(没有重复)20,286,025 个未标记的 DAG - 已经超过了您的 4,782,969(有重复) - 请参阅A003087
  • 其实,生成树的方式似乎行不通。例如,如何从(无向)生成树转到 DAG?那么,如何引导生成树的边缘在您拥有a -> {b, c}, {b, c} -> d 的地方生成微不足道的“钻石 DAG”?这样的 DAG 在其无向骨架中有一个循环,所以我看不出树的边缘(没有循环)如何生成它。
  • 这不是我的估计,我所做的只是使用凯莱公式,它计算了某些树两次。但是,是的,我没有记住“指导”。您可以使用指标标记重复项并在发现期间拒绝它们,但这只是一种补救措施。对于 DAG 问题,请参阅 Motifs。还有更多,因为每条边都有三个状态。我能问一下你在解决什么样的问题吗?
  • 对不起,我应该说“推导”,而不是估计。我想生成所有可能的二进制函数链,并且似乎获得具有入度 2 的受限 DAG 类(以及一些附加要求)可以满足它。
  • 您能否在正则表达式中捕捉或表述问题,然后使用“反向”正则表达式生成所有可能的实现? (例如,参见rstr(特别是Xeger 部分)和exrex python 模块)
猜你喜欢
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 2016-05-18
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多