Algorithm 消除图的对称性

Algorithm 消除图的对称性,algorithm,graph,graph-algorithm,symmetric,symmetry,Algorithm,Graph,Graph Algorithm,Symmetric,Symmetry,我有一个算法问题,在这个问题中,我导出了许多状态之间的转移矩阵。下一步是对它求幂,但它非常大,所以我需要对它做一些缩减。具体来说,它包含很多对称性。下面是一些通过简单观察可以消除多少节点的示例 我的问题是,是否有一种算法可以有效地消除有向图中的对称性,类似于我在下面手动完成的方法 在所有情况下,初始向量对于所有节点都具有相同的值 在第一个示例中,我们看到b、c、d和e都从a接收值,并且彼此中的一个接收值。因此,它们将始终包含相同的值,我们可以合并它们 在本例中,我们很快发现,从a、b、c

我有一个算法问题,在这个问题中,我导出了许多状态之间的转移矩阵。下一步是对它求幂,但它非常大,所以我需要对它做一些缩减。具体来说,它包含很多对称性。下面是一些通过简单观察可以消除多少节点的示例

我的问题是,是否有一种算法可以有效地消除有向图中的对称性,类似于我在下面手动完成的方法

在所有情况下,初始向量对于所有节点都具有相同的值


在第一个示例中,我们看到
b
c
d
e
都从
a
接收值,并且彼此中的一个接收值。因此,它们将始终包含相同的值,我们可以合并它们


在本例中,我们很快发现,从
a
b
c
d
的角度来看,图形是相同的。同样,对于它们各自的侧节点,连接到哪个内部节点并不重要。因此,我们可以将图简化为两种状态


更新:有些人很理性,不太清楚“状态转移矩阵”是什么意思。这里的想法是,您可以将一个组合问题分解为若干状态类型,每个状态类型都是循环中的
n
。然后,矩阵告诉您如何从
n-1
n

通常,您只对其中一个状态的值感兴趣,但还需要计算其他状态的值,这样您就可以随时进入下一个级别。但是,在某些情况下,多个状态是对称的,这意味着它们将始终具有相同的值。显然,计算所有这些是相当浪费的,所以我们希望减少图形,直到所有节点都是“唯一的”

下面是示例1中简化图的传递矩阵示例

[S_a(n)]   [1  1  1] [S_a(n-1)]
[S_f(n)] = [1  0  0]*[S_f(n-1)]
[S_B(n)]   [4  0  1] [S_B(n-1)]


非常感谢对论文的任何建议或参考。

Brendan McKay的nauty()是我所知道的计算图的自同构的最好工具。计算图形的整个自同构组可能过于昂贵,但您可能可以重用McKay的论文“实用图形同构”(从nauty页面链接)中描述的一些算法。

如果其他人感兴趣,我将在userOVER9000建议的基础上添加一个额外的答案。 下面是通过
dreadnaut
工具在示例2中使用
nauty
的示例

$ ./dreadnaut 
Dreadnaut version 2.4 (64 bits).
> n=8 d g                                     -- Starting a new 8-node digraph
 0 : 1 3 4;                                   -- Entering edge data
 1 : 0 2 5;
 2 : 3 1 6;
 3 : 0 2 7;
 4 : 0;
 5 : 1;
 6 : 2;
 7 : 3;
> cx                                          -- Calling nauty
(1 3)(5 7)
level 2:  6 orbits; 5 fixed; index 2
(0 1)(2 3)(4 5)(6 7)
level 1:  2 orbits; 4 fixed; index 4
2 orbits; grpsize=8; 2 gens; 6 nodes; maxlev=3
tctotal=8; canupdates=1; cpu time = 0.00 seconds
> o                                           -- Output "orbits"
 0:3; 4:7;
注意,它建议将示例2中的
a:d
节点
0:3
e:h
节点
4:7
连接起来


nauty算法没有很好的文档记录,但作者将其描述为指数最坏情况,
n^2
平均值。

计算对称性似乎有点像二阶问题。在第二张图中只取a,b,c和d,对称性必须被表示出来

a(b,c,d) = b(a,d,c)
以及它的所有排列,或者类似的排列。考虑第二个子图a,b′,c′,d′。同样,我们有对称性,但参数化不同

对于计算人员(而不是数学人员),我们可以这样表达问题吗

每个图形节点包含一组字母。在每次迭代中,每个节点中的所有字母都通过箭头复制到其相邻节点(有些箭头需要多次迭代,可以视为匿名节点的管道)

我们正试图找到有效的方法来确定诸如 *N次迭代后,每个集合/节点包含哪些字母。 *对于每个节点,其集合不再更改后的N。 *哪些节点集最终包含相同的字母集(等价类)


+1关于好的示例和好的图形我不知道,但我不确定您在第一个示例中指的是什么“值”(即:“从A接收值”,“包含相同的值”)。如果我理解正确,您是在寻找具有特殊特征的特殊子图(循环、线、完整子图等)(节点度,它们之间的连接,…)也许这些子图在你原来的问题中有一定的意义。也许很好地定义感兴趣的子图并用适当的算法找到它们。问题可能是递归的,在结果图上可以做同样的简化。ANTE:我已经添加了一个说明。我不太确定你是否可以考虑减少的图“子图”。,因为你不会扔掉节点,而是将相等的节点连接在一起。太好了。我尝试使用他们的Drearnaut工具,它输出的结果与预期完全一致。在示例一中,它说节点b:d形成一个“轨道”在例子2中,它给出了a:d,e:h,虽然它没有给出增加的顶点值,但是一旦知道了减少值,它们应该很容易计算。非常有趣!对于你的参考,如果有一个图自同构f,两个顶点u和v在同一轨道上——即,所有保留边的顶点的置换f(即:如果有一条从u到v的边,那么就有一条从f(u)到f(v)的边)——将u映射到v(即:f(u)=v).的确很有趣。但是我必须承认,出于我的实际目的,我最终采用了一种简单的概率方法。我没有试图计算轨道,而是连续检查了几组节点共享值。我想这很有效,因为我的数字增长得非常快。是的,我们可以这样表示。至少如果我们允许的话多个节点以同一字母开头。