我正在尝试使用Graphs.jl模块从Julia中的图形中获取子图。 我有图表,我将他的顶点和边缘存储到列表,然后我的算法移动到此列表并删除不属于新子图的节点和边。对于这个部分,一切都正常,在整个算法之后剩下的就是数组 sub_vertices 类型:Graphs.ExVertex [] 和数组 sub_edges 类型:Graphs.ExEdge {Graphs.ExVertex} [] 。
在整个函数结束时,我想创建子图,所以我使用:
sub_g = graph(sub_vertices, sub_edges, is_directed=false)
但我得到 Bounds()错误。 任何的想法 ?我只知道问题出在边缘。
我试图跑:
sub_g = graph(sub_vertices, Graphs.ExEdge{Graphs.ExVertex}[], is_directed=false)
它运行正常。它创建的图形具有由数组 sub_vertices 给出的顶点。使用 sub_edges 添加边时会出现问题。
其他信息: 顶点和边缘是原始图形的精确副本。这意味着索引,标签等属性与原始图形相同。我认为顶点的索引可能会有问题,但不是因为我跑的时候,
sub_g = graph(sub_vertices, Graphs.ExEdge{Graphs.ExVertex}[], is_directed=false)
运行正常。在打印顶点后,它们具有索引,例如1,3,5,但似乎没问题。所以我不知道为什么边缘会给出边界错误。
答案 0 :(得分:1)
使用图构造函数获取子图可能不是一个好主意。我对 Graphs.jl 不太熟悉,但我在朱莉娅中使用过图表。
构造函数可能会为 sub_vertices 分配新索引。因此,如果 sub_vertices [5,6,9] ,新图表仍会使用 [1,2,3] 。如果您的边列表是 [5 => 6,6 => 9,9 => 5] ,您会注意到没有任何边有效,因为子图只有顶点 [1,2,3] 。
我建议您使用专用的子图方法,分两个阶段来完成您尝试做的事情:
Graft.jl有一种方法可以让您同时执行这两项操作:
julia> using Graft
julia> g = completegraph(10)
Graph(10 vertices, 90 edges, Symbol[] vertex properties, Symbol[] edge properties)
julia> sg = subgraph(g, [5,6,9], [5=>6, 6=>9, 9=>5])
Graph(3 vertices, 3 edges, Symbol[] vertex properties, Symbol[] edge properties)
julia> vertices(sg)
1:3
julia> edges(sg)
3-element Graft.EdgeIter:
1=>2
2=>3
3=>1
或者如果您希望顶点保留其原始标签
julia> g = completegraph(10)
Graph(10 vertices, 90 edges, Symbol[] vertex properties, Symbol[] edge properties)
julia> setlabel!(g, collect(1:10)) # Label the vertices
julia> sg = subgraph(g, [5,6,9], [5=>6, 6=>9, 9=>5])
Graph(3 vertices, 3 edges, Symbol[] vertex properties, Symbol[] edge properties)
julia> encode(sg)
3-element Array{Int64,1}:
5
6
9
julia> encode(sg, edges(sg))
3-element Array{Pair{Int64,Int64},1}:
5=>6
6=>9
9=>5