我想用 n 顶点创建所有有向图的集合,其中每个顶点都有 k 直接后继和 k 直接前驱。 n 和 k 不会那么大,而是围绕 n = 8且 k = 3。包括循环和非循环图。反过来,每个图形将作为抽样大量加权图形的模板。
我感兴趣的是拓扑图案的作用,所以我不想为任何两个彼此对称的图形采样,其中对称意味着没有一个顶点的排列存在于一个将其转换为另一个的图形。
一个天真的解决方案是考虑2 ^( n *( n - 1))邻接矩阵并消除所有这些(大多数)直接矩阵违反了继承者或前任约束。对于 n = 8,仍然只有很少的位来表示并简单地在uint64_t
内简单地枚举每个矩阵。
跟踪行数和列数将是另一项改进,但真正的瓶颈是将图形添加到结果集中,此时我们需要测试已经在集合中的每个其他图形的对称性。对于 n = 8,每次插入操作已经超过40,000个排列。
任何人都可以向我推荐一个我能读到的算法,可以更智能地完成所有这些工作吗?是否有C,C ++,Java或Python的图形库已经实现了这样一个全面的图形生成器?是否存在某人已将所有图表“制表”为合理 n 和 k 的存储库?
答案 0 :(得分:1)
这更多的是评论而不是答案,因为我似乎错过了你的问题。
首先,这样的图表是否可能是非循环的?
我也想知道你的对称约束。这不会使所有这些图形彼此对称吗?是否允许置换连接矩阵的行和列?
例如,如果我们允许图中的自连接,以下连接矩阵是否满足您的条件?
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。在这种情况下,我重复了几次命令,以获得对角线中只有零的矩阵。 :)
修改强>
啊,我从你的评论中看出我不正确。当然,行和列的排列索引必须相同。当我开始使用带有自我连接的图表时,我至少应该注意到它,并在排列后获得没有它们的图形。
随机同构排列将会是这样的:
idx = randperm(8);
A(idx,idx);
将保留所有自我连接。
也许这可能在生成矩阵时有所用,但它根本不像我想的那样有用。
答案 1 :(得分:1)
在我看来,图形同构不是你应该考虑实现自己的东西。我相信当前最先进的是Brendan McKay的Nauty(以及相关的程序/库)。这是一个可以使用的熊,但它可能是值得的,以避免做自己的,天真的图同构。此外,它主要面向无向图,但它也可以做有向图。您可能需要查看 geng (生成无向图)和 directg (生成带有底层图的有向图)和Nauty附带的实用程序。