确定一个图是否与另一个图的子图同构
‘lad’ 方法
这是 Solnon 的 LAD 算法,请参阅下面的参考资料。 它有以下额外的参数
- domains
如果不是
NULL
,则它指定匹配限制。它必须是target
顶点集的列表,以数字顶点 ID 或符号顶点名称给出。列表的长度必须是vcount(pattern)
,并且对于pattern
中的每个顶点,它给出target
中允许匹配的顶点。默认为NULL
。- induced
逻辑标量,是否搜索诱导子图。 默认值为
FALSE
。- time.limit
计算的处理器时间限制,以秒为单位。 默认为
Inf
,表示没有限制。
‘vf2’ 方法
此方法使用 Cordella、Foggia 等人的 VF2 算法,请参阅下面的参考资料。 它支持顶点和边颜色,并具有以下额外的参数
- vertex.color1, vertex.color2
可选的整数向量,给出彩色图同构的顶点颜色。如果未给出,但图具有 “color” 顶点属性,则将使用它。如果要忽略这些属性,请为这两个参数提供
NULL
。另请参阅下面的示例。- edge.color1, edge.color2
可选的整数向量,给出边着色(子)图同构的边颜色。如果未给出,但图具有 “color” 边属性,则将使用它。如果要忽略这些属性,请为这两个参数提供
NULL
。
参考文献
LP Cordella, P Foggia, C Sansone, and M Vento: An improved algorithm for matching large graphs, Proc. of the 3rd IAPR TC-15 Workshop on Graphbased Representations in Pattern Recognition, 149–159, 2001.
C. Solnon: AllDifferent-based Filtering for Subgraph Isomorphism, Artificial Intelligence 174(12-13):850–864, 2010.
示例
# A LAD example
pattern <- make_graph(
~ 1:2:3:4:5,
1 - 2:5, 2 - 1:5:3, 3 - 2:4, 4 - 3:5, 5 - 4:2:1
)
target <- make_graph(
~ 1:2:3:4:5:6:7:8:9,
1 - 2:5:7, 2 - 1:5:3, 3 - 2:4, 4 - 3:5:6:8:9,
5 - 1:2:4:6:7, 6 - 7:5:4:9, 7 - 1:5:6,
8 - 4:9, 9 - 6:4:8
)
domains <- list(
`1` = c(1, 3, 9), `2` = c(5, 6, 7, 8), `3` = c(2, 4, 6, 7, 8, 9),
`4` = c(1, 3, 9), `5` = c(2, 4, 8, 9)
)
subgraph_isomorphisms(pattern, target)
#> [[1]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 2 1 7 6 5
#>
#> [[2]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 1 2 3 4 5
#>
#> [[3]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 6 4 3 2 5
#>
#> [[4]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 8 4 5 6 9
#>
#> [[5]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 5 4 8 9 6
#>
#> [[6]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 9 4 5 7 6
#>
#> [[7]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 1 5 4 6 7
#>
#> [[8]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 1 5 4 3 2
#>
#> [[9]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 4 5 1 7 6
#>
#> [[10]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 7 5 4 9 6
#>
#> [[11]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 6 5 2 3 4
#>
#> [[12]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 6 5 2 1 7
#>
#> [[13]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 2 5 6 7 1
#>
#> [[14]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 9 6 7 5 4
#>
#> [[15]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 5 6 9 8 4
#>
#> [[16]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 4 6 7 1 5
#>
#> [[17]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 7 6 9 4 5
#>
#> [[18]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 1 7 6 4 5
#>
#> [[19]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 6 7 1 2 5
#>
#> [[20]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 8 9 6 5 4
#>
subgraph_isomorphisms(pattern, target, induced = TRUE)
#> [[1]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 1 2 3 4 5
#>
#> [[2]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 6 4 3 2 5
#>
#> [[3]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 6 5 2 3 4
#>
#> [[4]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 1 5 4 3 2
#>
subgraph_isomorphisms(pattern, target, domains = domains)
#> [[1]]
#> + 5/9 vertices, named, from 63b67b0:
#> [1] 1 5 4 3 2
#>
# Directed LAD example
pattern <- make_graph(~ 1:2:3, 1 -+ 2:3)
dring <- make_ring(10, directed = TRUE)
subgraph_isomorphic(pattern, dring)
#> [1] FALSE