同构性#

is_isomorphic(G1, G2[, node_match, edge_match])

如果图 G1 和 G2 同构则返回 True,否则返回 False。

could_be_isomorphic(G1, G2)

如果图确定不同构则返回 False。

fast_could_be_isomorphic(G1, G2)

如果图确定不同构则返回 False。

faster_could_be_isomorphic(G1, G2)

如果图确定不同构则返回 False。

VF2++#

VF2++ 算法#

VF2++ 算法 [1] 用于图同构测试的实现。

使用此模块最简单的接口是调用以下函数:

vf2pp_is_isomorphic:检查两个图是否同构。vf2pp_isomorphism:如果两个图同构,获取它们之间的节点映射。vf2pp_all_isomorphisms:如果两个图同构,生成所有可能的映射。

引言#

VF2++ 算法遵循与 VF2 类似的逻辑,同时引入了新的易于检查的剪枝规则并确定了节点的最佳访问顺序。与之前的版本相比,它还以非递归方式实现,从而节省了时间和空间。

在考虑了节点的度以及标签稀有性后,可以获得最优的节点排序。这样,我们将更可能匹配的节点放在排序的前面,从而在开始时就检查最有希望的分支。这些规则也考虑了节点标签,使得在过程早期更容易剪枝掉无用的分支。

示例#

假设 G1 和 G2 是同构图。验证如下:

无节点标签

>>> import networkx as nx
>>> G1 = nx.path_graph(4)
>>> G2 = nx.path_graph(4)
>>> nx.vf2pp_is_isomorphic(G1, G2, node_label=None)
True
>>> nx.vf2pp_isomorphism(G1, G2, node_label=None)
{1: 1, 2: 2, 0: 0, 3: 3}

有节点标签

>>> G1 = nx.path_graph(4)
>>> G2 = nx.path_graph(4)
>>> mapped = {1: 1, 2: 2, 3: 3, 0: 0}
>>> nx.set_node_attributes(
...     G1, dict(zip(G1, ["blue", "red", "green", "yellow"])), "label"
... )
>>> nx.set_node_attributes(
...     G2,
...     dict(zip([mapped[u] for u in G1], ["blue", "red", "green", "yellow"])),
...     "label",
... )
>>> nx.vf2pp_is_isomorphic(G1, G2, node_label="label")
True
>>> nx.vf2pp_isomorphism(G1, G2, node_label="label")
{1: 1, 2: 2, 0: 0, 3: 3}

参考文献#

[1]

Jüttner, Alpár & Madarasi, Péter. (2018). “VF2++—一种改进的子图同构算法”。Discrete Applied Mathematics. 242. https://doi.org/10.1016/j.dam.2018.02.018

vf2pp_is_isomorphic(G1, G2[, node_label, ...])

检查 G1 和 G2 是否同构。

vf2pp_all_isomorphisms(G1, G2[, node_label, ...])

生成 G1 和 G2 之间所有可能的映射。

vf2pp_isomorphism(G1, G2[, node_label, ...])

如果存在,返回 G1G2 之间的一个同构映射。

树同构性#

一种算法,用于查找两棵无向树是否同构,如果同构,则返回两组节点之间的同构映射。

此算法使用一个例程来判断两棵有根树(指定了根节点的树)是否同构,这可能独立有用。

这实现了一个算法,来自:Aho, Hopcroft 和 Ullman 的著作《计算机算法的设计与分析》(Addison-Wesley Publishing 1974)中示例 3.2(第 84-86 页)。

该算法的一个更易于理解的版本描述在:Matthew Suderman 撰写的 McGill University SOCS 308-250B 课程作业 5,2002 年冬季 http://crypto.cs.mcgill.ca/~crepeau/CS250/2004/HW5+.pdf

rooted_tree_isomorphism(t1, root1, t2, root2)

给定两棵有根树 t1t2,其根节点分别为 root1root2,此例程将判断它们是否同构。

tree_isomorphism(t1, t2)

给定两棵无向树(或自由树)t1t2,此例程将判断它们是否同构。

高级接口#