2016-03-19 11 views
4

Graphs.jlモジュールを使用してジュリアのグラフからサブグラフを取得しようとしています。 私はグラフを作成して頂点と辺をリストに格納しておき、アルゴリズムはこのリストをトラバースし、新しいサブグラフの一部ではないノードと辺を削除します。 Graphs.ExVertex []はアレイsub_edgesタイプ:Graphs.ExEdge {Graphs.ExVertex} []すべてが正常に動作し、この部分には、全体アルゴリズムの後に残っているすべてのアレイsub_verticesタイプです。私は私が使用して部分グラフを作成するためにwanto関数全体の終わりにJulia/Graphs.jl:graph()と引数を使用してグラフを作成する

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でエッジを追加するときに発生します。

追加情報: 頂点とエッジは元のグラフから正確にコピーされています。つまり、index、label、...などの属性は元のグラフと同じです。それはOK走る

sub_g = graph(sub_vertices, Graphs.ExEdge{Graphs.ExVertex}[], is_directed=false) 

、私は多分、頂点のインデックスが問題になると思ったが、私が実行したときので、それはないです。そして頂点を印刷した後、それらは例えば1,3,5のようなインデックスを持ちますが、それは大丈夫です。だから私はなぜエッジが境界エラーを与えるのか分からない。

+0

を保持したい場合は、 'グラフを使用することが理由です.jl'、または 'LightGraphs.jl'ソリューションを利用することができますか? –

+1

はい、ありますが、別の解決策が見つかりました。これは問題であり、インデックスによるものであり、解決策が存在しないと私は考える。 –

+2

Gotcha。将来同じ問題が発生する場合に備えて、ソリューションを回答として投稿できますか? –

答えて

1

サブグラフを取得するためにグラフコンストラクタを使用することは、おそらく良い考えではありません。私もGraphs.jlに慣れていませんが、私はJuliaのグラフで作業しました。

コンストラクタはおそらくsub_verticesに新しいインデックスを割り当てます。たとえば、sub_vertices[5,6,9]の場合、新しいグラフではまだ[1,2,3]が使用されます。エッジリストが[5 => 6,6> 9,9 => 5]の場合、サブグラフは頂点が1つしかないため、有効なエッジはありません。[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 
関連する問題