Indexing Julia/Graphs.jl:使用graph()和参数创建图形

Indexing Julia/Graphs.jl:使用graph()和参数创建图形,indexing,graph,julia,Indexing,Graph,Julia,我正在尝试使用Graphs.jl模块从Julia中的graph中获取子图。 我有一个图,我将他的顶点和边存储到列表中,然后我的算法在这个列表中移动,删除不属于新子图的节点和边。对于这一部分,一切都正常工作,在整个算法之后,剩下的就是数组子顶点类型:Graphs.ExVertex[]和数组子顶点类型:Graphs.ExEdge{Graphs.ExVertex}[] 在整个函数的末尾,我想创建子图,因此我使用: sub_g = graph(sub_vertices, sub_edges, is_di

我正在尝试使用Graphs.jl模块从Julia中的graph中获取子图。 我有一个图,我将他的顶点和边存储到列表中,然后我的算法在这个列表中移动,删除不属于新子图的节点和边。对于这一部分,一切都正常工作,在整个算法之后,剩下的就是数组子顶点类型:Graphs.ExVertex[]和数组子顶点类型: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_g = graph(sub_vertices, Graphs.ExEdge{Graphs.ExVertex}[], is_directed=false)

它运行正常。在打印顶点后,它们有索引,例如1,3,5,但看起来还可以。所以我不知道为什么边会给出边界错误。

使用图构造函数来获取子图可能不是一个好主意。我不太熟悉Graphs.jl,但我在Julia中使用过Graphs

构造函数可能会将新索引分配给子顶点。因此,如果子顶点是[5,6,9],例如,新图形仍将使用[1,2,3]。如果边列表是[5=>6,6=>9,9=>5],您会注意到没有一条边是有效的,因为子图只有顶点[1,2,3]

我建议您使用专用子图方法,分两个阶段完成您要完成的工作:

  • 首先,使用已隔离的子图边计算子图
  • 接下来,使用sub_顶点计算一个子图
  • 有一种方法可以同时执行这两项操作:

      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
    

    是否有理由使用
    Graphs.jl
    ,或者您愿意使用
    LightGraphs.jl
    解决方案?是的,但我找到了另一种解决方案。这是一个问题,由索引引起,我认为解决方案甚至不存在。明白了。你能把你的解决方案作为一个答案吗,以防将来人们会遇到同样的问题?这不是如何正确编写这种构造方法的解决方案,而是如何从图中轻松获取子图的解决方案或我想说的变通方法。我一到家就把它寄出去:-)