# graphsimplify


将多重图简化为简单图

函数库: TyMath

# 语法

H, eind, ecount = graphsimplify(G)
H, eind, ecount = graphsimplify(G, pickmethod="first")
H = graphsimplify(G, aggregatemethod)
H, eind, ecount = graphsimplify(___; propflag=false)
H, eind, ecount = graphsimplify(___; selfloopflag=false)
H = graphsimplify(___)

# 说明

H,eind,ecount = graphsimplify(G) 返回没有多条边或自环的图。当相同的两个节点之间出现多条边时,只保留第一条边(如 G.Edges 中所定义)。边属性会保留。示例

还返回边索引 eind 和边计数 ecount:

  • H.Edges.endnodes[eind[i],:] 是 H 中表示 G 中的边 i 的边。

  • ecount[j] 是 G 中与 H 中的边 j 对应的边的条数。


H,eind,ecount = graphsimplify(G,pickmethod="first") 指定在多条边之间进行选择的方法。边属性会保留。pickmethod 可以是 "first"(默认值)、"last"、"min" 或 "max"。示例


H = graphsimplify(G,aggregatemethod) 指定的方法是将多条边的权重合并为一条新边的权重。G 中所有其他边属性均舍弃。aggregatemethod 可以是 "sum" 或 "mean"。无法返回 eind 和 ecount。示例


___ = graphsimplify(___;selfloopflag=false) 使用上述语法中的任何输入参数组合指定是保留还是删除图中的自环。selfloopflag=true 指定具有一个或多个自环的节点在简化图中将只有一个自环。示例


___ = graphsimplify(___;propflag=false) propflag 为 false(默认值) 时,根据边权重使用指定的方法简化图,propflag 为 true 时使用边属性。您可以使用上述语法中的任何输入参数组合。

# 示例

将多重图简化为简单图

创建一个加权的无向多重图,在节点 1 和节点 2 之间有多条边。

using TyMath
G = Graph([1,1,1,1,2,3],[2,2,2,3,3,4], 1:6);
G.Edges
ans = 
6×2
EndNodes        Weights
1       2       1
1       2       2
1       2       3
1       3       4
2       3       5
3       4       6
G = graphsimplify(G)[1];
G.Edges
ans = 
4×2
EndNodes        Weights
1       2       1
1       3       4
2       3       5
3       4       6
选择或合并图中的多条边

使用 graphsimplify 的第二个输入选择一种方法:是从多条边之中进行选择,还是将多条边合并成一条边。

创建一个加权的多重图。在此图中,节点 3 和节点 4 之间出现五条边,但边的权重是随机的。查看边。

using TyMath
G = Graph([1, 2, 3, 3, 3, 3, 3, 3], [2, 3, 1, 4, 4, 4, 4, 4], randi(10, 8));
G.Edges
ans = 
8×2
EndNodes        Weights
1       2       10
1       3       7
2       3       3
3       4       10
3       4       7
3       4       3
3       4       10
3       4       10

命令 graphsimplify(G) 保留重复边中的第一条边。但是,您可以使用第二个输入指定不同的选择/合并方法。

从多条边之中进行选择的选项包括:"first"(默认值)、"last"、"min" 和 "max"。保留权重最大的重复边。

H_pick = graphsimplify(G, "max");

将多条边合并成一条边的选项包括:"sum" 和 "mean"。将重复边相加生成一条权重较大的边。

H_comb = graphsimplify(G, "sum");
保留图中的自环

使用 selfloopflag=true 在简化图的同时保留自环。

创建一个具有两个节点和几个自环的多重图。简化图并保留自环。

using TyMath
G = Graph([1,1,1,1,1,1,1,2,2,2,2],[1,1,1,1,2,2,2,2,2,2,2]);
G = graphsimplify(G; selfloopflag=true)[1];
边索引和重复边数

graphsimplify 的第二个和第三个输出,获取有关合并了多少条边(以及哪些边)的信息。

创建一个具有三个节点和四条边的无向多重图。

using TyMath
G = Graph([1,1,1,2],[2,2,3,3]);
G.Edges
ans = 
4×1
EndNodes
1       2
1       2
1       3
2       3

简化图并指定三个输出,以获取有关合并边的更多信息。

G, ei, ec = graphsimplify(G)
G = Graph with properties:
Edges:3×1
Nodes:3×0

ei = 4-element Vector{Int64}:
 1
 1
 2
 3

 ec = 3-element Vector{Int64}:
 2
 1
 1

ei[i] 是简化图中表示旧图中的边 i 的边。由于前两条边重复,因此 ei[1] = ei[2] = 1。而且 ec[1] = 2,因为新图中有两条边对应于旧图中的边 1。

# 输入参数

G - 输入图
Graph 对象 | DiGraph 对象

输入图,指定为 Graph 或 DiGraph 对象。可使用 Graph 创建一个无向图,或使用 DiGraph 创建一个有向图。

示例: G = Graph(1,2)

示例: G = DiGraph([1,2],[2,3])

pickmethod - 边选择方法
"first" (默认) | "last" | "min" | "max"

边选择方法,指定为 "first"、"last"、"min" 或 "max"。当相同的两个节点之间存在多条边时,边选择方法可以选择要保留其中的哪条边。

如果方法是 "first" 或 "last",则 graphsimplify 只保留边 G.Edges 中出现的第一条边或最后一条边。

如果方法是 "min" 或 "max",则 graphsimplify 只保留具有最小权重或最大权重的边。weights 变量必须存在于 G.Edges 中,除非您使用 propflag=false 对边属性进行选择。

指定该方法后会有三个返回值 H,eind,ecount。

示例: graphsimplify(G,"last")

aggregatemethod - 聚合方法
"sum" | "mean"

聚合方法,指定为 "sum" 或 "mean"。当相同的两个节点之间存在多条边时,聚合方法可将多条边合并成一条边。

默认情况下,graphsimplify 仅对图中的边权重进行求和或求平均值,而舍弃所有其他边属性。但是,您可以使用 propflag=false 保留和聚合 G.Edges 中的边属性。

示例: graphsimplify(G,"sum")

selfloopflag - 是否保留自环
false (默认) | true

是否保留自环,指定为下列值之一:

  • false - 删除图中的所有自环。这是默认设置。

  • true - 具有一个或多个自环的节点在简化图中只有一个自环。

示例: graphsimplify(G,"sum",selfloopflag=true)

propflag - 是否根据边属性选择/聚合边
false (默认) | true

是否根据边属性选择/聚合边,指定为下列值之一:

  • false - 不根据边属性选择/聚合边,采用边权重。这是默认设置。

  • true - 根据边属性选择/聚合边,不采用边权重。

示例: graphsimplify(G,"min",propflag=true)

# 输出参数

H - 简化图
Graph 对象 | DiGraph 对象

简化图,以 Graph 或 DiGraph 对象形式返回。H 不包含相同两个节点之间的任何重复边,例如 ismultigraph(H) 返回逻辑值 0 (false)。自环也被删除,除非您指定 selfloopflag=true 选项。

eind - 边索引
向量

边索引,以向量形式返回。H 中表示 G 中的边 i 的边由 H.Edges.endnodes[eind[i],:] 指定。如果 G 中的边 i 是被删除的自环,则 eind[i] 为 0。

ecount - 边数
向量

边数,以向量形式返回。ecount[i] 是 G 中对应于 H 中的边 i 的边的条数。

# 另请参阅

Graph | DiGraph | ismultigraph