枚举边缘和对称约束下的图
Posted
技术标签:
【中文标题】枚举边缘和对称约束下的图【英文标题】:Enumerate graphs under edge and symmetry constraints 【发布时间】:2013-01-18 04:35:15 【问题描述】:我想创建具有 n 个顶点的所有有向图的集合,其中每个顶点都有 k 个直接后继和 k 个直接前驱。 n 和 k 不会那么大,而是在 n = 8 和 k = 3 左右。包括循环图和非循环图。每个图将依次用作对大量加权图进行采样的模板。
我的兴趣是拓扑图案的作用,所以我不想为任何两个彼此对称的图采样权重,其中 symmetry 意味着一个顶点中不存在顶点排列将其转换为另一个的图形。
一个天真的解决方案是考虑 2 ^ (n * (n - 1)) 邻接矩阵并消除所有那些(大部分)直接违反后继或前任约束。对于 n = 8,这仍然不足以表示和简单地枚举 uint64_t
内的每个矩阵。
跟踪行数和列数将是另一项改进,但真正的瓶颈是将图表添加到结果集中,此时我们需要针对已经在集合中的其他图表测试对称性。对于 n = 8,每个插入操作已经有超过 40,000 个排列。
谁能向我推荐一种我可以阅读的算法,它可以以更智能的方式完成所有这些工作?是否有用于 C、C++、Java 或 Python 的图形库已经实现了如此全面的图形生成器?是否有一个存储库,其中有人已经“列出”了所有合理的 n 和 k 图表?
【问题讨论】:
这听起来像是“计算机编程的艺术,第 4 卷”中的内容。 【参考方案1】:在我看来,图同构不是您应该考虑自己实现的东西。我相信当前最先进的是 Brendan McKay 的Nauty(以及相关的程序/库)。使用它有点麻烦,但避免做你自己的、幼稚的图同构可能是值得的。此外,它主要面向无向图,但它也可以处理有向图。您可能想查看 Nauty 附带的 gengem>(生成无向图)和 directg(根据基础图生成有向图)实用程序。
【讨论】:
谢谢,@mhum,至少 +1。看起来 Nauty 的geng
确实允许对度数进行限制(对于 k = 3 -d1
为较低,-D3
为较高)。但是directg
不会遵守这些约束,并且转换规则的组合将是不平凡的:虽然一级强制执行自我、进出和三级强制,但对于二级它会以一种非常讨厌的方式依赖邻居,不是吗?
你可能需要做一些摆弄才能让它工作。我可能会从带有 -d6 和 -D6 的 gengi> 开始,以获取 6 个正则无向图的列表,然后将这些图输入 directg 并丢弃那些不满足所有节点的入度和出度 = 3。不确定这对你来说是否足够快,但我敢打赌它会比你自己检查同构更快。
这很有意义。谢谢。
另外,请注意,根据this,在 8 个顶点上只有 11 个不同的无向图,有 24 条边(如果每个节点的度数为 6,则这是必要的,但还不够)。【参考方案2】:
这更像是一个评论而不是一个答案,因为我似乎错过了你的问题。
首先,这样的图有没有可能是无环的?
我也想知道你的对称约束。这不是使所有这些图彼此对称吗?是否允许置换连接矩阵的行和列?
例如,如果我们在图中允许自连接,那么下面的连接矩阵是否满足您的条件?
1 1 0 0 0 0 0 1
1 1 1 0 0 0 0 0
0 1 1 1 0 0 0 0
0 0 1 1 1 0 0 0
0 0 0 1 1 1 0 0
0 0 0 0 1 1 1 0
0 0 0 0 0 1 1 1
1 0 0 0 0 0 1 1
从这个矩阵开始,是不是不可能排列它的行和列以获得所有行和列之和为3的所有此类图形?
这样一个矩阵的一个例子可以从上面的矩阵A
通过以下方式获得(使用MATLAB)。
>> A(randperm(8),randperm(8))
ans =
0 1 0 0 0 1 1 0
0 0 1 0 1 0 1 0
1 1 0 1 0 0 0 0
1 1 0 0 0 1 0 0
1 0 0 1 0 0 0 1
0 0 1 1 0 0 0 1
0 0 1 0 1 0 0 1
0 0 0 0 1 1 1 0
PS。在这种情况下,我重复了几次该命令,以获得对角线中只有零的矩阵。 :)
编辑
啊,我从你的 cmets 看到我是不正确的。当然,行和列的排列索引必须相同。至少当我从一个具有自连接的图开始并在排列后获得一个没有它们的图时,我至少应该注意到这一点。
一个随机的同构排列看起来像这样:
idx = randperm(8);
A(idx,idx);
这将保持所有自连接。
也许这在生成矩阵时会有一些用处,但它并没有我想象的那么有用。
【讨论】:
谢谢,@user1884905。对于 k = 3,这些图确实是循环的。您置换矩阵的想法很巧妙。对于系统运行,请查看perms
。为了测试同构,行和列的排列索引是相同的,因此生成器可以排除这些相同的索引。通过一些编辑,我会赞成这一点。但是请注意,使用不同的行和列索引进行置换只是必要的,不足以避免同构,而且我还不清楚由此带来的节省。对于 n = 3 和 k = 2,大多数结果都是同构的,尽管对于 n >> k 碰撞应该下降。
@s.bandara 感谢 cmets,我知道我有点跑题了。不过,我仍然想知道无环图。非循环图是否不需要有无后继节点和无前驱节点。
好点。我的意思是说是否循环不是我的标准的一部分,但我现在看到它们都会有循环。以上是关于枚举边缘和对称约束下的图的主要内容,如果未能解决你的问题,请参考以下文章
为啥在所有边缘上固定 UIStackView 会导致模棱两可的约束错误?