# isisomorphic
确定两个图是否同构
函数库: TyMath
# 语法
tf = isisomorphic(G1, G2; EdgeVariable=false, NodeVariable=false)
# 说明
如果图 G1 和 G2 之间存在图的同构,tf = isisomorphic(G1,G2) 将返回逻辑值 true;否则,将返回逻辑值 false。示例
tf = isisomorphic(G1,G2; EdgeVariable=false, NodeVariable=false) NodeVariables 指示同构是否保留节点属性才有效,EdgeVariables 指示同构是否保留边属性才有效。示例
# 示例
比较图
创建两个有向图,然后确定它们是否同构。
using TyMath
G1 = DiGraph([1, 1, 1, 2, 3, 4], [2, 3, 4, 4, 4, 1])
G2 = DiGraph([3, 3, 3, 2, 1, 4], [1, 4, 2, 3, 2, 2])
isisomorphic(G1,G2)
ans = true
比较具有不同标签和布局的图
创建并绘制两个图形 G1 和 G2。
using TyMath
using TyPlot
G1 = Graph([1 1 1 2 2 3 3 4 5 5 7 7][:], [2 4 5 3 6 4 7 8 6 8 6 8][:]);
plotG(G1, [1 4 4 1 2 3 3 2][:],[4 4 1 1 3 3 2 2][:])
G2 = Graph(
["a", "a", "a", "b", "b", "b", "c", "c", "c", "d", "d", "d"],
["g", "h", "i", "g", "h", "j", "g", "i", "j", "h", "i", "j"],
);
figure()
plotG(G2, [1 2 2 2 1 2 1 1][:], [4 4 3 2 3 1 2 1][:])
确定 G1 和 G2 之间是否存在同构。结果表明,两个图尽管具有不同的标签和布局,但具有相同的结构。
isisomorphic(G1,G2)
ans = true
在同构比较中保留节点属性
通过两种不同的比较,确定两个图之间是否存在同构关系。一种比较保留节点属性,另一种比较忽略节点属性。
创建两个类似的图。在每个图中添加节点属性 Color。
using TyMath
G1 = Graph(["d", "e", "f"], ["e", "f", "d"]);
G1.Nodes.props = ["red", "red", "blue"];
G2 = Graph(["a", "b", "c"], ["b", "c", "a"]);
G2.Nodes.props = ["blue", "blue", "red"];
确定两个图是否同构,并忽略节点属性。
isisomorphic(G1, G2)
ans = true
确定两个图是否同构,并在比较中保留节点属性的值。在这种情况下,由于每个图的节点属性包含不同数量的 "red" 和 "blue" 值,所以二者之间不存在同构关系。
isisomorphic(G1, G2, NodeVariable=true)
ans = false
# 输入参数
G - 输入图Graph 对象 | DiGraph 对象
EdgeVariables - 是否保留的边属性false (默认) | true
使用此选项指定同时位于 G1.Edges 和 G2.Edges 中的边属性。同构必须保留指定的边属性才有效。
如果 G 是多重图,第二个输出 edgeperms 允许重新排序边变量。
NodeVariables - 是否保留的节点属性false (默认) | true
使用此选项指定同时位于 G1.Nodes 和 G2.Nodes 中的节点属性。同构必须保留指定的节点属性才有效。
# 详细信息
图的同构
两个图 G1 和 G2,如果存在一种节点置换 P,使得 reordernodes(G2,P) 与 G1 具有相同的结构,则说明二者是同构图。
同构的两个图具有类似的结构。例如,如果一个图包含一个圆,则与其同构的所有图也都会包含一个圆。
# 另请参阅
Graph | DiGraph | isomorphism | reordernodes