我想枚举所有大小为无向图,但是我只需要每个同构类的一个实例。换句话说,我想枚举个顶点上的所有非同构(无向)图。我怎样才能做到这一点?
更准确地说,我想要一种算法,该算法将生成具有以下特性的无向图的序列:对于个顶点上的每个无向图,都存在一个索引,使得与同构。我希望该算法尽可能高效。换句话说,我关心的指标是生成和迭代此图列表的运行时间。第二个目标是,如果算法不太复杂而无法实现,那就太好了。
请注意,每个同构类至少需要有一个图,但是如果该算法产生多个实例,则可以。特别是,如果输出序列包含两个同构图,则可以,只要这可以帮助您更轻松地找到这样的算法或启用更有效的算法,只要它覆盖所有可能的图即可。
我的应用程序如下:我有一个程序要在大小为所有图形上进行测试。我知道如果两个图是同构的,则我的程序将在两个同构上表现相同(对两个图都正确,或者对两个图都不正确),因此足以枚举每个同构类的至少一个代表,然后对其进行测试。对这些输入进行编程。在我的应用程序中,很小。
我考虑过一些候选算法:
我可以列举所有可能的邻接矩阵,即所有对称的 0或1矩阵,对角线都为0。但是,这需要枚举矩阵。这些矩阵中有许多将表示同构图,因此这似乎在浪费大量精力。
我可以列举所有可能的邻接矩阵,并针对每个矩阵测试它与我先前输出的任何图是否同构;如果它与之前输出的内容不是同构的,则将其输出。这将大大缩短输出列表,但是仍然需要至少个计算步骤(即使我们假设图形同构检查是超快的),因此通过我的指标。
可以枚举邻接矩阵的子集。特别是,如果是个顶点,则可以不失一般性地假设顶点的排列方式为。换句话说,每个图都是同构的,其中顶点以非降序排列。因此,仅枚举具有此属性的邻接矩阵就足够了。我不知道这样的邻接到底有多少矩阵也有,但它是许多不到他们可以用比少很多被列举计算步骤。但是,这仍然留下了很多冗余:许多同构类仍然会被覆盖很多次,因此我怀疑这是最优的。
我们可以做得更好吗?如果我理解正确,大约是非同构图的等价类。我们能否找到一种运行时间比上述算法更好的算法?我们可以接近下界?我主要关心小(例如或左右;足够小以至于可以合理地运行这样的算法来完成),而不是大的渐近性。
相关:构建不等价的二元矩阵(尽管不幸的是,似乎没有收到有效的答案)。