我正在尝试使用 Graphs.jl 模块从 Julia 中的图中获取子图。
我有图,我将他的顶点和边存储到列表中,然后我的算法在该列表中移动并删除不属于新子图的节点和边。这部分一切正常,在整个算法之后,剩下的就是数组 sub_vertices 类型:Graphs.ExVertex[] 和数组 sub_edges 类型:Graphs.ExEdge{Graphs.ExstrongVertex}

在整个函数结束时,我想创建子图,所以我使用:

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,但似乎没问题。所以我不知道为什么边缘会给出边界错误。

最佳答案

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

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

我建议您使用专用的子图方法来完成您想要做的事情,分两个阶段:

  • 首先,使用您隔离的 sub_edges 计算子图。
  • 接下来,使用 sub_vertices 计算子图。

  • 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
    

    关于indexing - Julia /Graphs.jl : creating graph using graph() and arguments,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36102141/

    10-10 18:38