《A (Sub)Graph Isomorphism Algorithm for Matching Large Graphs》论文总结

来源:互联网 发布:同志交友软件blued2015 编辑:程序博客网 时间:2024/06/08 10:36

子图同构的概念我们已经介绍过,使用ULLMANN算法的解决方式请看我的前一篇博客 《An Algorithm for Subgraph Isomorphism》论文总结。今天要说的是VF2算法,对子图同构问题的处理效率更高,适合于图的size很大,即点数很多的的large graph,在最后的测试中,算法的性能几乎与点的数目无关。但是根据我的测试和boost库中对VF2的实现来看,两个算法对于同构的标准并不相同,VF2更加严格,这点我还有疑问,

论文:http://www.docin.com/p-1760455871.html。

首先是算法的原理。这是论文中给出的伪代码:


算法求同构的方法就是不断扩展s,不断扩展状态,当状态扩展到小图的规模的时候,就说明求得了一个同构,如果状态没到预定的规模,那么需要继续依照规则扩展s。论文里把这种方法叫做SSR, State Space Representation.状态s代表的是图1和图2中已经确认同构的部分,这里图1是targetGraph,大图。图2是queryGraph,小图。算法的输出是是否能在大图中找到一个小图。对于图1,已经在s中的点的集合是G1s,图2中在s中的点的集合是G2s。G1s和G2s是同构的(注意这里的词是同构而不是子图同构,也就是说,G1s和G2s的点数目是一样的,G1s中有的边,G2中也有,并且反过来也是)。

扩展s的的方法是这样,首先计算所有可以加入到s中的点对P(s)(计算P(s)的方法稍后提到),然后对于P(s)中的一个点对计算它的可行性(计算的方法也稍后提到),如果这个点对p是可行的,那么就扩展s。当然在实际的代码中还要设计回退的过程。

计算P(s)的方法看论文就可以,先看两张图中已经在s里点的一步终点邻接点,再看已经在s里的点的一步源点邻接点。如果是连通图,那么必然此时可以构建P(s)了,但是如果是非连通图,那么就可能这两个集合都是空的。此时就只能在unmapped点中进行两两组合了。

判断P(s)对于当前state的可行性的方法如下:


前两条规则保证加入了p以后,s依然是同构的。第3第4条规则确定这个s能否再扩展出儿子,原文的说法是k-look-ahead rules,这里的k就是1.第5条规则是看这个s能否扩展出孙子,是2-look-ahead rule。先看前2条规则,它要求G1中有的边G2中也要有,反过来也是。这就是说两张图是induced同构的,这个概念是这样的,摘自维基百科:


在论文原文中并没有induced这个词,5条规则却是求induced subgraph isomorphism的,让我还有疑问。

第3和第4条和第5条规则的含义就是说大图中点在规定集合里的度数要比小图大,这个很好理解。第五条统计的度数是即将因为p会在下一次被考虑到的点。第五条也是保证induced才用得到的。

对于VF2的性能,的确和边的数目没有关系,论文里说和state的状态有关系,其实就是和边的数目有关系。

如果想要把VF2的同构规则改成ULLMANN的规则的话,只需要将五条规则的前两条改造,第五条去掉即可。

下面的链接是boost库对于VF2的实现,boost对于VF2的说明很明确的用了induced这个词。

总结:其实说实话我一开始对于VF2论文突然给出的一句算法用时和图的size是almost没有关系的很惊讶,效果更好也不用好到这么夸张吧。但是仔细想想的确如此,它和边的数目成比例,所以它对于稀疏图的效果肯定很好。说它比ULLMANN算法更高效,参考网上我看过的博客,原因就是具体问题具体分析了。ULLMANN算法中的搜索顺序没有利用到图的性质,只是把度数大的点往前提,尽可能的剪枝。VF2中让每次剪枝时被考虑到的点、边更多,自然被剪掉的也就更多,能早点发现问题。

博客写的有些乱,是我看完论文的感想,不是对于论文的解释。放在这里是希望和大家交流,写的乱望海涵,先看论文再看这个比较好。

最后是我的C++实现代码,参考了http://blog.csdn.net/luo123n/article/details/49787183这篇博客中的JAVA实现。我也对他提出了一些问题,在评论里。

阅读全文
1 0
原创粉丝点击