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)

但是我收到边界()错误。知道吗?我只知道问题出在边缘。

我试图运行:

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]。

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

  1. 首先,使用您隔离的sub_edges计算子图。
  2. 接下来,使用 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

最新更新