为保持问题清晰,我发布了一篇第一次的解答。这个hack并不总是有效,因此有缺陷,详见下面的第二个例子。
对于一个有效的hack,请参见我的第二个答案或其他人的答案!
我找到标签的规范排列,然后找到这个新规范图的规范颜色,接着我就可以使用vf2。
我们重新涂色图的函数如下:
canonical <- function(input){
labels <- unique(input)
match(input, labels)
}
现在回到正题:
g <- graph.empty()
g <- g + vertices(1,2,3)
g <- g + path(1,2,3)
g1 <- g
V(g1)$color = c(1,2,2)
g2 <- g
V(g2)$color = c(2,1,1)
g1 <- permute.vertices(g1, canonical.permutation(g1)$labeling)
g2 <- permute.vertices(g2, canonical.permutation(g2)$labeling)
V(g1)$color <- canonical(V(g1)$color)
V(g2)$color <- canonical(V(g2)$color)
par(mfrow=c(1,2))
palette(rainbow(3))
plot(g1)
plot(g2)
现在将被检测为同构:
graph.isomorphic.vf2(g1, g2)$iso
真
失败的例子:
对于这个例子,它不起作用:
g1 <- graph.empty()
g1 <- g1 + vertices(1,2)
g1 <- g1 + edge(1,2)
V(g1)$color = c(1,2)
g2 <- graph.empty()
g2 <- g2 + vertices(1,2)
g2 <- g2 + edge(2,1)
V(g2)$color = c(2,1)
g1 <- permute.vertices(g1, canonical.permutation(g1)$labeling)
g2 <- permute.vertices(g2, canonical.permutation(g2)$labeling)
V(g1)$color <- canonical(V(g1)$color)
V(g2)$color <- canonical(V(g2)$color)
par(mfrow=c(1,2))
palette(rainbow(3))
plot(g1)
plot(g2)
graph.isomorphic.vf2(g1,g2)$iso
graph.subisomorphic(g1,g2)
返回了 TRUE?你特别想使用vf2
算法有什么原因吗?你可能需要检查一下?graph.subisomorphic.vf2
帮助页面上列出的参考文献,看看这个算法是否有已知的缺陷。 - MrFlickvf2
的原因是,查看文档后,它似乎是唯一处理颜色的算法。 - alberto