例如,假设我有一个图G,其中包含所有蓝色节点和一个红色节点。我还有一个图表F,它有所有蓝色和一个红色节点。
我可以运行什么算法来验证这两个图是否与其彩色节点同构?
答案 0 :(得分:2)
我试图创建一个多项式图同构算法,虽然我还没有为每种情况创建一个被证明是多项式的算法,但我提出的一种算法特别适用于此目的。它基于DFA最小化算法(具体算法为http://en.wikipedia.org/wiki/DFA_minimization#Hopcroft.27s_algorithm;您可能希望从其他地方找到描述,因为维基百科很难遵循)。
通过基于度数将顶点组织成不同的组来初始化原始算法(一个顶点为1度,一个顶点为2度顶点,等等)。出于您的目的,您需要根据程度和标签将顶点组织成组;这将确保如果它们具有不同的标签,则不会配对两个节点。每个图都应该有自己的结构,包含这些组。检查两个图的组的集合;两个图形应该有相同数量的组,并且对于一个图形中的每个组,另一个图形中应该有一个组包含相同度数和标签的相同数量的顶点。如果不是这种情况,则图表不是同构的。
在主算法的每次迭代中,您应该为下一步将使用的顶点组的两个图中的每一个生成新的数据结构。对于每个组,为组索引/ ID的每个顶点生成一个列表,该列表对应于与所讨论的顶点相邻的顶点(包括此列表中的重复组)。检查每个组以查看每个包含的顶点的排序组索引/ ID列表是否相同。如果是这种情况,请在下一步的组结构中创建该组的未修改副本。如果不是这种情况,那么对于该组中每个唯一的组索引/ ID列表,为生成该列表的原始组内的顶点创建一个新组,并将该新组添加到下一步骤中。小组结构。如果在给定的迭代中没有细分任何一个图形的任何组,请停止运行该算法的主要部分。如果细分至少一个组,则需要再次检查以确保两个图的组结构彼此对应。此检查将类似于在算法初始化结束时执行的检查(您甚至可以对两者使用相同的功能)。如果此检查失败,则图形不同构。如果检查通过,则丢弃/释放当前组结构并使用新创建的组开始下一次迭代。
进行确定"相应群组的过程"更容易,我强烈建议使用可预测的方案将组添加到结构中。例如,如果在初始化期间以(度,标签)顺序添加组,则按升序索引顺序细分组,并根据组索引列表的顺序将细分组添加到新结构(即按第一个列出的索引排序,然后第二个,等等,然后两个组结构之间的相应组将始终具有相同的索引,这使得跟踪哪些组彼此对应多的过程更容易。
如果算法完成时所有组都包含3个或更少的顶点,则图形是同构的(对于包含2个或3个顶点的相应组,任何顶点配对都是有效的)。如果不是这种情况(这种情况总是发生在所有节点具有相同程度和标签的图形中,有时对于具有该属性的子图形发生),则图形尚未确定为同构或非同构。要区分这两种情况,请选择第一个图形最大组的任意节点,并将其分成自己的组。然后,对于另一个图形的最大组的每个节点,尝试再次运行该算法,将该节点分成其自己的组。实质上,您从第一个图形中选择一个不成对节点,并通过猜测和检查将其与第二个图形中仍然是合理配对的每个节点配对。如果任何分叉迭代返回同构,则图形是同构的。如果它们都没有,那么图形就不是同构的。
对于一般情况,该算法是多项式的。在极端情况下,算法可能是指数的。是否是这种情况与在图形输入和节点选择的最坏情况下算法被强制分叉的频率有关,我在尝试设置有用的界限时遇到了困难。例如,虽然算法在比较两个完整图时的每一步都会分叉,但该树的每个分支都会产生一个同构;因此,在这种情况下算法返回多项式时间,即使遍历整个执行树也需要指数时间,因为只遍历执行树的一个分支需要多项式时间。
无论如何,此算法应该适合您的目的。我希望我对它的解释是可以理解的;如果没有,我可以尝试提供处理简单情况的算法的例子,或者将其表示为伪代码。
答案 1 :(得分:1)
多年前,我为这个问题创建了一个简单而灵活的算法(带有标签的图形同构)。
我把它命名为“Powerhash”,要创建算法,它需要两个见解。第一个是功率迭代图算法,也用于PageRank。第二个是能够用我们想要的任何东西替换功率迭代的内部步进功能。我用一个函数替换它,在每次迭代和每个节点上执行以下操作:
第一步,节点的哈希受其直接邻居的影响。在第二步,节点的哈希受到距离它的2跳的邻域的影响。在第N步,节点的散列将受到其周围的邻域N跳的影响。所以你只需要继续运行Powerhash for N = graph_radius步骤。最后,图中心节点的哈希将受到整个图的影响。
要生成最终哈希,请对最后一步的节点哈希值进行排序并将它们连接在一起。之后,您可以比较最终的哈希值,以查找两个图形是否同构。如果您有标签,则在为每个节点计算的内部哈希中添加它们(在第一次迭代中)。
有关详细信息,请点击此处查看我的帖子:
https://plus.google.com/114866592715069940152/posts/fmBFhjhQcZF
上面的算法是在“madIS”功能关系数据库中实现的。您可以在此处找到算法的源代码:
https://github.com/madgik/madis/blob/master/src/functions/aggregate/graph.py
答案 2 :(得分:-1)
检查;你的意思是严格的图同构或其他什么?同构图具有相同的邻接关系(即,如果节点A在一个图中与节点B相邻,则节点g(A)与另一个图中的节点g(B)相邻,这是将变换g应用于第一个图的结果...)如果您只是想检查一个图表的节点类型和数量与另一个图表相同,那么您可以只比较计数。