是否有用于图同构的算法或启发式算法?
推论:一个图可以用不同的绘图表示。
如何找出一个图的不同绘图的最佳方法?
这是一个麻烦的问题。
一般来说,基本思想是将图形简化为规范形式,然后进行规范形式的比较。生成跨度树以达到此目的,但跨度树并不唯一,因此需要有一种规范的方法来创建它们。
在获得规范形式之后,你可以相对容易地执行同构比较,但这只是开始,因为非同构的图可能具有相同的跨度树。(例如,考虑一棵跨度树T和向其添加单个边缘以创建T'的情况,这两个图不同构,但它们具有相同的跨度树)。
其他技术涉及比较描述符(例如,节点数,边数),但通常会产生误报。
我建议您先从维基百科页面“图同构问题”开始了解。我还有一本书推荐:“图论及其应用”。这是一本厚重的书,但值得一读。
根据你的推论,给定图的每种可能的空间分布都是同构的。因此,两个同构图具有相同的拓扑结构,并且从拓扑角度来看它们是相同的图。另一方面,例如要找到享有特定属性(例如,如果存在,则为非交叉边缘)的同构结构,则取决于您想要的属性。
找到图同构中最好的算法之一是VF2。
我已经写了一篇关于VF2在化学中的高级概述- 在那里它被广泛使用。这篇文章涉及VF2和Ullmann之间的差异。还有一个用Java编写的从头开始实现VF2,可能会有所帮助。
一个非常类似的问题——图自同构——可以通过saucy来解决,该软件可提供源代码。它可以找到图形的所有对称性。如果你有两个图形,请将它们合并成一个,任何同构都可以被发现作为联接的自同构。
免责声明:我是 saucy 的合作者之一。
有算法可以做到这一点——然而,我还没有真正研究过它们。我相信Donald Knuth在他的计算机艺术系列中在第二次(重新)编写时会介绍这个主题。
至于在小图上可能实际起作用的简单方法,我建议计算度数,然后对于每个顶点,还要注意与之相邻的顶点的度数集合。这将为每个点提供一组潜在的顶点同构。然后只需从这个受限制的集合中尝试所有这些(通过蛮力,但选择潜在的顶点同构集合按递增顺序选择顶点)。直观地说,大多数图同构都可以通过这种方式在实践中计算出来,尽管显然会有可能需要很长时间的退化情况。
nauty和Traces是用于计算图形和有向图的自同构群的程序[*]。它们还可以生成一个规范标签。它们是用C的可移植子集编写的,并且可以在许多不同的系统上运行。
我发现该算法属于k维Weisfeiler-Lehman算法类别,并且在常规图形中失败。更多信息请参见:
http://dabacon.org/pontiff/?p=4148
以下是原始帖子:
我曾经研究过在图形数据库(包含化学成分)中查找同构图的问题。
简而言之,该算法使用幂迭代方法创建图形的哈希值。可能会出现错误的哈希碰撞,但这种概率非常小(我在数以万计的图形中没有遇到过这样的碰撞)。
算法的工作方式如下:
进行N次迭代(其中N是图形的半径)。在每次迭代和每个节点上:
在第一步中,节点的哈希值受其直接邻居的影响。在第二步中,节点的哈希值受其2跳邻域的影响。在第N步中,节点的哈希值将受到其周围N跳邻域的影响。因此,您只需要继续运行Powerhash N = graph_radius步即可。最终,图形中心节点的哈希值将受到整个图形的影响。
为了生成最终哈希,需将最后一步的节点哈希进行排序并连接在一起。然后,您可以比较这些最终哈希以判断两个图是否同构。如果有标签,则在计算每个节点的内部哈希时(第一步),将它们加入其中。
更多背景信息请查看以下内容:
https://plus.google.com/114866592715069940152/posts/fmBFhjhQcZF
你可以在这里找到它的源代码:
https://github.com/madgik/madis/blob/master/src/functions/aggregate/graph.py