繁体   English   中英

图同构

[英]Graph Isomorphism

是否存在图同构的算法或启发式算法?

推论:图表可以用不同的不同图纸表示。

找到不同图形图的最佳方法是什么?

这是一个问题的地狱。

一般来说,基本思想是将图形简化为规范形式,然后执行规范形式的比较。 使用此目标生成生成树,但生成树不是唯一的,因此您需要使用规范方法来创建它们。

在有规范形式之后,您可以轻松地执行同构比较(相对),但这只是一个开始,因为非同构图可以具有相同的生成树。 (例如,考虑一个生成树T和一个边缘的单独添加来创建T'。这两个图不是同构,但它们具有相同的生成树)。

其他技术涉及比较描述符(例如,节点数,边数),其通常可以产生误报。

我建议你从关于图同构问题的维基页面开始。 我还有一本书建议: “图论及其应用” 这是一本书,但值得每一页。

从你的推论出发,给定图的顶点的每个可能的空间分布都是同构的。 因此,两个同构图具有相同的拓扑结构,从拓扑的角度来看,它们最终是相同的图形。 另一个问题是,例如,找到那些享有特定属性的同构结构(例如,如果存在非交叉边缘),这取决于您想要的属性。

寻找图同构的最佳算法之一是VF2。

我已经写了一篇应用于化学的VF2的高级概述 - 它被广泛使用。 该帖子涉及VF2和Ullmann之间的差异。 还有一个用Java编写的VF2的从头开始实现可能会有所帮助。

一个非常相似的问题 - 图自同构 - 可以通过源代码中提供的saucy来解决。 这可以找到图形的所有对称性。 如果你有两个图,将它们连接成一个,任何同构都可以被发现为连接的自同构。

免责声明:我是俏皮的合着者之一。

有算法可以做到这一点 - 但是,我还没有理由认真研究它们。 我相信唐纳德·克努特(Donald Knuth)正在写作或者在他的第二次传递(重新)写作时,在他的计算机艺术系列中写过这个主题。

至于在小图上做一些可能在实践中起作用的简单方法,我建议计算度数,然后对于每个顶点,还要注意那些相邻顶点的度数集。 然后,这将为每个点提供一组潜在的顶点同构。 然后尝试所有这些(通过强力,但从潜在顶点同构集的增加顺序中选择顶点)来自此受限集。 直觉上,大多数图形同构可以通过这种方式实际计算,但显然会出现可能需要很长时间的退化情况。

我的项目- Griso -在sf.net: http://sourceforge.net/projects/griso/有这样的描述:
Griso是用C ++编写的图形同构测试实用程序。 它基于我自己的POLYNOMIAL-TIME (在这一点上是项目的盐)算法。 请参阅http://funkybee.narod.ru/graphs.htm页面上的Griso示例输入/输出。

我最近发现了以下论文: http//arxiv.org/abs/0711.2010本文提出了“图同构的多项式时间算法”

nauty和Traces是用于计算图形和有向图的自同构组的程序[*]。 他们还可以生产规范标签。 它们是用C的可移植子集编写的,可以在相当多的不同系统上运行。

至于启发式:我一直在幻想改进的Ullmann算法,你不仅要使用广度优先搜索,而是将其与深度优先搜索方式混合,首先使用广度优先搜索,而不是设置限制检查一些邻居后进行广度分析并进一步深入,并且每一步都要降低一些量。 这实际上就是我在地图上找到自己的方式:首先通过广度优先搜索找到自己,然后用深度优先搜索搜索路线 - 主要是,这是我大脑发明的最佳进化。 :)从长远来看,可以添加一些智能来增加关键顶点处的广度优先搜索邻居计数 - 例如,存在大量具有相同边缘计数的相邻顶点。 比如有时用车检查你的实际路线(没有gps)。

我发现该算法属于k维Weisfeiler-Lehman算法的类别,并且它失败了常规图。 更多信息:

http://dabacon.org/pontiff/?p=4148

原帖如下:

我已经研究过这个问题,在图表数据库中找到同构图(包含化学成分)。

简而言之,该算法使用幂迭代方法创建图的散列。 可能存在误报哈希冲突,但其概率非常小(我没有与成千上万的图表发生任何此类冲突)。

算法的工作方式是:

做N(其中N是图的半径)迭代。 在每次迭代和每个节点上:

  • 对节点邻居的哈希值(从上一步骤)进行排序
  • 散列连续排序的哈希值
  • 用新计算的哈希替换节点的哈希值

在第一步,节点的哈希受其直接邻居的影响。 在第二步,节点的哈希受到距离它的2跳的邻域的影响。 在第N步,节点的散列将受到其周围的邻域N跳的影响。 所以你只需要继续运行Powerhash for N = graph_radius步骤。 最后,图中心节点的哈希将受到整个图的影响。

要生成最终哈希,请对最终步骤的节点哈希值进行排序并将它们连接在一起。 之后,您可以比较最终的哈希值,以查找两个图形是否同构。 如果您有标签,则在为每个节点计算的内部哈希中添加它们(在第一步)。

这里有更多背景:

https://plus.google.com/114866592715069940152/posts/fmBFhjhQcZF

你可以在这里找到它的源代码:

https://github.com/madgik/madis/blob/master/src/functions/aggregate/graph.py

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM