logo

줄리아의 그래프(네트워크) 분석 패키지 Graphs.jl 📂그래프이론

줄리아의 그래프(네트워크) 분석 패키지 Graphs.jl

소개

Graphs.jl은 파이썬의 NetworkX와 같이 그래프(네트워크) 분석을 위한 패키지이다. LightGraphs.jl라는 패키지를 리부트해서 만들어졌다.

The goal of Graphs.jl is to offer a performant platform for network and graph analysis in Julia, following the example of libraries such as NetworkX in Python.

The Graphs.jl project is a reboot of the LightGraphs.jl package (archived in October 2021), which remains available on GitHub at sbromberger/LightGraphs.jl.

코드

코드는 전체적으로 NetworkX와 비슷하다. 아직 제대로 쓰기에는 어려움이 있어 보인다.

설치

줄리아 REPL에서 ] add Graphs를 입력하여 설치한다.

(@v1.7) pkg> add Graphs

불러오기 및 버전 확인

julia> using Graphs
julia> using Pkg

julia> Pkg.status("Graphs")
  [86223c79] Graphs v1.7.1

그래프 생성

NetworkX와 마찬가지로 Graph(), DiGraph()널 그래프를 만든다. 버텍스의 기본 타입은 Int64이고 이보다 하위 타입으로만 만들 수 있다. 그래프의 정보는 $\left\{ \left| V \right|, \left| E \right| \right\}$로 나타난다.

julia> G = Graph()
{0, 0} undirected simple Int64 graph

julia> G = DiGraph()
{0, 0} directed simple Int64 graph

julia> G = Graph{Float64}()
ERROR: TypeError: in SimpleGraph, in T, expected T<:Integer, got Type{Float64}

julia> G = Graph{UInt64}()
{0, 0} undirected simple UInt64 graph

버텍스 추가 및 제거

NetworkX에서는 노드의 이름으로 노드를 추가하는데, Graphs.jl에서는 버텍스가 $1$부터 시작하여 $2,3,\dots$ 순으로 추가된다.

julia> add_vertex!(G)
true

julia> G
{1, 0} undirected simple Int64 graph

julia> add_vertex!(G)
true

julia> G
{2, 0} undirected simple Int64 graph

add_vertices!(G, n)으로 $n$개의 버텍스를 추가한다.

julia> add_vertices!(G, 3)
3

julia> G
{5, 0} undirected simple Int64 graph

rem_vertex!(G, v)로 특정 버텍스를 삭제할 수 있지만, 삭제 후 빈 번호 없이 자동으로 정렬됨에 주의하자. 예를 들어 버텍스가 $V = \left\{ 1,2,3,4,5 \right\}$일 때 $2$를 삭제하면, $3, 4, 5$의 이름이 $2, 3, 4$로 바뀐다.

julia> G = Graph(5)
{5, 0} undirected simple Int64 graph

julia> rem_vertex!(G, 2)
true

julia> G
{4, 0} undirected simple Int64 graph

julia> has_vertex(G, 2)
true

julia> has_vertex(G, 5)
false

에지 추가 및 제거

rem_vertex!(G, 2)로 두번째 버텍스를 제거하면 위에서 설명한대로 기존의 세번째 버텍스가 새로운 두번째 버텍스가 되는데, 막상 에지는 다른 결과가 나온다. 버그인 것 같다.

julia> G = Graph(5)
{5, 0} undirected simple Int64 graph
julia> add_edge!(G, 1, 2)
true
julia> add_edge!(G, 2, 3)
true
julia> add_edge!(G, 3, 4)
true
julia> G
{5, 3} undirected simple Int64 graph

julia> has_edge(G, 1, 2)
true
julia> has_edge(G, 2, 3)
true
julia> has_edge(G, 3, 4)
true


julia> rem_vertex!(G, 2)
true
julia> G
{4, 1} undirected simple Int64 graph
julia> has_vertex(G, 2)
true
julia> has_edge(G, 1, 2)
false
julia> has_edge(G, 2, 3)
false
julia> has_edge(G, 3, 4)
true

환경

  • OS: Windows10
  • Version: Julia 1.7.1, Graphs 1.7.1