Graph 从图集合中拒绝同构

Graph 从图集合中拒绝同构,graph,canonicalization,isomorphism,Graph,Canonicalization,Isomorphism,我有一个1500万(百万)个DAG(有向无环图,实际上是有向超立方体)的集合,我想从中删除同构。这方面的通用算法是什么?每个图都相当小,是一个维数为N的hybercube,其中N为3到6(目前),因此在N=6的情况下,每个图都有64个节点 使用networkx和python,我实现了这样的功能,它适用于300k(千)这样的小集合(在几天内运行) 一个更好的方法是将每个图转换为其规范顺序,对集合进行排序,然后删除重复项。这绕过了检查二进制is_isomophic()测试中的每一个15M图,我相信上

我有一个1500万(百万)个DAG(有向无环图,实际上是有向超立方体)的集合,我想从中删除同构。这方面的通用算法是什么?每个图都相当小,是一个维数为N的hybercube,其中N为3到6(目前),因此在N=6的情况下,每个图都有64个节点

使用networkx和python,我实现了这样的功能,它适用于300k(千)这样的小集合(在几天内运行)

一个更好的方法是将每个图转换为其规范顺序,对集合进行排序,然后删除重复项。这绕过了检查二进制is_isomophic()测试中的每一个15M图,我相信上面的实现类似于O(N!N)(不考虑同构时间),而一个干净的将all转换为规范排序和排序应该使用O(N)进行转换+O(log(N)N)进行搜索+O(N)进行删除重复项。O(N!N)>>O(log(N)N)

我发现了这篇关于正则图标记的论文,但它用数学方程非常简洁地描述,没有伪代码:“McKay的正则图标记算法”——


tldr:我需要通过二进制同构检查来检查大量的图。我相信通常的方法是通过规范排序。是否存在任何打包的算法或发布的直接实现算法(即有伪代码)?

这是一个有趣的问题,我没有答案!这是我的两分钱:

你说的15M是指1500万个无向图吗?每个有多大?关于它们的任何已知属性(树、
planar
k-树


您是否尝试过通过提前检测假阳性来减少检查次数?包括计算和比较数字,如顶点、边、度和度序列?除了其他的试探法来测试给定的两个图是否同构。还有,检查一下。这可能是您检查它们(并生成规范排序)的方法

这确实是一个有趣的问题

我会从邻接矩阵的角度来处理它。两个同构图将具有相邻矩阵,其中行/列的顺序不同。因此,我的想法是计算每个图的几个矩阵属性,这些属性对行/列交换是不变的,我从头开始:

numVerts、min、max、sum/mean、trace(如果没有自反边,可能不有用)、norm、rank、min/max/mean列/行和、min/max/mean列/行norm

任何一对同构图在所有性质上都是相同的

您可以创建一个哈希函数,该函数接收一个图并输出一个哈希字符串,如

string hashstr = str(numVerts)+str(min)+str(max)+str(sum)+...
然后按散列字符串对所有图进行排序,只需对散列相同的图进行完全同构检查


考虑到36个节点上有1500万个图,我假设你处理的是加权图,对于未加权的无向图,这种技术的效率要低得多。

这里是哈特克和拉德克利夫在论文中提出的麦凯的规范图标记算法的分解

我应该首先指出,这里有一个开源实现:

好的,我们开始吧!不幸的是,这个算法在图论中很重,所以我们需要一些术语。首先,我将从定义同构和自同构开始

同构:

如果两个图相同,则它们是同构的,只是顶点的标记不同。以下两个图是同构的

自守:

如果两个图(包括顶点标记)完全相同,则它们是自守的。以下两个图是自守的。这看起来微不足道,但出于技术原因,它变得很重要

图形哈希:

这整件事的核心思想是有一种方法将一个图散列成一个字符串,然后对于一个给定的图,计算与它同构的所有图的散列字符串。按字母顺序(技术上按字典顺序)最大的同构散列字符串称为“规范散列”,产生它的图形称为“规范同构”或“规范标签”

这样,要检查任意两个图是否同构,只需检查它们的正则同构(或正则标号)是否相等(即是彼此的自同构)。哇,行话!不幸的是,如果没有行话,这更令人困惑:-(

对于图G,我们将要使用的散列函数称为i(G):通过查看G中的每一对顶点(按顶点标签的顺序)来构建一个二进制字符串,如果这两个顶点之间有边,则放置一个“1”,如果没有边,则放置一个“0”。这样,i(G)中的第j位表示图中没有该边

McKay的规范图标记算法

问题是,对于n个顶点上的图,根据标记顶点的方式,可能存在O(n!)个同构哈希字符串,如果我们必须多次计算同一字符串(即自变形),则可能存在更多同构哈希字符串一般来说,我们必须计算每个同构散列字符串,以找到最大的一个,没有神奇的排序切割。McKay的算法是一种搜索算法,通过将搜索树中的所有自同构剪除,强制按递增顺序标记标准同构中的顶点,从而更快地找到这个标准同构其他一些技巧可以减少我们必须散列的同构数

(1) 第4节:McKay的第一步是根据度对顶点进行排序,这将剪掉大部分要搜索的等距线,但不能保证是唯一的排序,因为给定degr可能有多个顶点
string hashstr = str(numVerts)+str(min)+str(max)+str(sum)+...
#gnp.py
import networkx as nx
for i in range(100000):
    graph = nx.gnp_random_graph(10,0.1)
    print nx.generate_graph6(graph,header=False)


[nauty25r9]$ python gnp.py > gnp.g6
[nauty25r9]$ cat gnp.g6 |./labelg |sort |uniq -c |wc -l
>A labelg
>Z  10000 graphs labelled from stdin to stdout in 0.05 sec.
710