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

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

最佳答案 使用图构造函数获取子图可能不是一个好主意.我对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
点赞