我正在尝试使用Graphs.jl模块从Julia中的图中获取子图。我有图,我将他的顶点和边存储到列表中,然后我的算法在这个列表中移动,删除不属于新子图的节点和边。对于这一部分,所有工作正常,在整个算法后,剩下的是数组sub_vertices 类型: Graphs.ExVertex[]和数组sub_edges 类型:Graphs.ExVertex[]
在整个函数的末尾,我将创建子图,因此我使用:
sub_g = graph(sub_vertices, sub_edges, is_directed=false)但是我得到了界()错误。知道吗?我只知道问题在边缘。
我试着逃跑
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,但似乎没问题。所以我不知道为什么边会出现边界错误。
发布于 2016-08-25 10:47:04
使用图构造函数获取子图可能不是个好主意。我对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=>5https://stackoverflow.com/questions/36102141
复制相似问题