判断图同构大杀器—nauty算法

判断两图是否同构是一个经典问题。nauty算法作为时下较为流行的主流算法,具有效率高,剪枝力度强等优势。当然,在某些特殊情况会失灵。虽然该算法的概念在上世纪80年代就提出来了,但发展至今,仍然是不可忽略的一种方法。本人翻遍了中文互联网,没找到详细相关介绍,在stackoverflow上边找到了一个问答,顺着帖子的回复找到了算法原作者自建的网站,如获至宝。再结合离散数学,看懂了这个算法的大致流程。总结如下:nauty算法:判断两个图是否同构。思路:①设置一套编号系统,给两个图进行编号,如果两个

大家好,又见面了,我是你们的朋友全栈君。

判断两图是否同构是一个经典问题。
nauty算法作为时下较为流行的主流算法,具有效率高,剪枝力度强等优势。当然,在某些特殊情况会失灵。
虽然该算法的概念在上世纪80年代就提出来了,但发展至今,仍然是不可忽略的一种方法。

本人翻遍了中文互联网,没找到详细相关介绍,在stack overflow上边找到了一个问答,顺着帖子的回复找到了算法原作者自建的网站,如获至宝。
再结合离散数学,看懂了这个算法的大致流程。总结如下:

nauty算法:判断两个图是否同构。
思路:
①设置一套编号系统,给两个图进行编号,如果两个图对应的正则编号是一样的,两图同构。

②设置编号系统:
1)对图进行划分,使得任意一个节点的不同颜色的邻接节点的个数相同。
2)对于包含节点个数大于1的子集合再划分,一直化到所有子集合元素个数为1。
3)回溯,得到第二个划分。对比两个划分方式,得到置换群信息,利用这一信息去剪枝。
4)回溯,得到第三个划分,再得到一些置换群的信息,进一步剪枝。
5)最终存留的划分结果即是这个图的可行的命名方式。选择其中最大字典的一种作为正则编号,与另外一个图进行比对。

③剪枝过程中还利用了【节点不变量】信息。具体来说,用一个函数评价某节点的【节点不变量】。
在同一深度下,某节点的函数值相较另一个节点高,则正则编号将出现在该节点的子树下。
在同一深度下,某节点的函数值与另一个节点不相等,则二者的子树不一样。
两节点在某一群作用下相同,则两节点的子树有对应相等值。

部分理解存在偏差,对该算法感兴趣的朋友可以去作者自建的网站了解详情,里边有漂亮的PPT,排版也很好。

另外,nauty算法剪枝的核心是求解自同构群,这一过程在网站的search tree那一栏也有详尽的说明(类似PPT),结合基础群论知识,很容易理解。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126816.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vmware linux安装教程_vmware10虚拟机安装教程

    vmware linux安装教程_vmware10虚拟机安装教程一、安装VMware下载地址(16pro):https://www.aliyundrive.com/s/FSktJJXsfa8安装:选一下安装地址,一直下一步即可。(可能会要求重启电脑,重启即可)二、安装Linux下载地址:CentOS-7.5提取码:486k接下来看图操作2.1新建虚拟机现在我们就相当于买电脑,先把电脑配置整好。什么cpu啊内存条啊硬盘啊什么乱七八糟的,先不着急装系统。这里看你装什么版本的Linux了,我装的是GenOS7.564位所以选的是Ge

    2022年10月8日
    0
  • Swiper滑动Html5手机浏览器自适应

    Swiper滑动Html5手机浏览器自适应

    2022年1月30日
    47
  • ES是什么?

    ES是什么?ES是什么?ES是什么?ElasticSearch的使用场景ElasticSearch的主要特点:ElasticSearch的核心概念ElasticSearch的有关概念ElasticSearch的使用案例参考文献ES是什么?ES全称ElasticSearch,是一个基于Lucene的搜索服务器。(其实就是对Lucene进行封装,提供了RESTAPI的操作接口)ElasticSearch作为一个高度可拓展的开源全文搜索和分析引擎,可用于快速的对大数据进行存储,搜索和分析。Elasti

    2022年6月18日
    54
  • float double取值范围_double float区别

    float double取值范围_double float区别Java浮点数浮点数结构  要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法,比如,简单点的,float四个字节,前两个字节表示整数位,后两个字节表示小数位(这就是一种规则标准),这样就组成一个浮点数。而Java中浮点数采用的是IEEE754标准。IEE

    2022年10月23日
    0
  • java实习生面试题_java实习生面试题.doc

    java实习生面试题[标签:标题]实习生在面试Java岗位时,做好面试准备很重要,那么你了解面试题目了吗?下面阳光网小编已经为你们整理了java实习生面试题,希望可以帮到你。java实习生面试题11.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。Java语言提供了八种基本类型:六种数字类型(四个整数型,两个浮点型)字节型byte8位短整型short16位整型in…

    2022年4月18日
    45
  • 手眼标定算法Tsai-Lenz代码实现(Python、C++、Matlab)

    手眼标定算法Tsai-Lenz代码实现(Python、C++、Matlab)上一节介绍了手眼标定算法Tsai的原理,这一节介绍算法的代码实现,分别有Python、C++、Matlab版本的算法实现方式。该算法适用于将相机装在手抓上和将相机装在外部两种情况论文已经传到git上,地址:https://gitee.com/ohhuo/handeye-tsai如果你要进行手眼标定,可以参考我的其他文章:手眼标定-基础使用手眼标定-JAKA机械臂手眼标定-AUBO机械臂手眼标定-Aruco使用与相机标定手眼标定-注意事项Python版本使用前需要安装库:pip3

    2022年5月20日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号