判断两幅图是否同构是一个经典问题。
nauty算法作为目前流行的主流算法,具有效率高、剪枝力强等优点。 当然,在特定情况下将不起作用。
该算法的概念提出于20世纪80年代,但发展至今仍是一种不可忽视的方法。
我查了中文网络,但是找不到详细的介绍。 在堆栈溢出中进行问答; 找到了a。 按照帖子的回复,我找到了算法原作者自制的网站。 例如,得到了至宝。
结合离散数学,得出了该算法的大致流程。 总结如下。
nauty算法:判断两幅图是否同构。
想法:
设置给两幅图编号的编号系统。 如果与两幅图对应的正则编号相同,则两幅图为同形。
设置号码系统:
1 )按照任意节点的不同颜色的相邻节点的数量相同的方式分割图表。
2 )对于包含节点数大于1的部分集合的再分割,将所有部分集合的要素数转化为1。
3 )上溯,得到第二个划分。 比较两种划分方式,得到置换群信息,利用该信息进行剪枝。
4 )上溯,得到第三个划分,再得到一些置换群的信息,再进行剪枝。
5 )最终剩下的划分结果是该图可行的命名方式。 选择其中最大的词典之一作为正则编号,与其他图进行对照。
剪枝过程中还利用了【节点不变量】的信息。 具体来说,用一个函数评价某个节点的【节点不变量】。
如果深度相同且一个节点的函数值高于另一个节点,则常规编号将显示在该节点的子树中。
在相同深度,如果一个节点的函数值不等于另一个节点,则两个子树不同。
如果有两个节点的组相同,则两个节点的子树具有对应的等价项。
虽然部分理解有偏差,但对该算法感兴趣的人可以通过作者自制的网站了解详细内容。 里面有漂亮的PPT,排版也很好。
另外,nauty算法剪枝的核心是求解自同构群,这个过程在网站搜索树一栏中也有详细的描述,与基础群论知识相结合比较容易理解。