运筹系列68:Julia的图论包

Posted IE06

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了运筹系列68:Julia的图论包相关的知识,希望对你有一定的参考价值。

一些小技巧:

using ProgressMeter
@showprogress 1 "Retrieving Julian info..." for ...

using JSON
# write to file
userdata = Dict("nodes"=>usernodes, "links"=>userlinks)
open("Julians.json", "w") do f
  JSON.print(f, userdata, 2)
end

用D3进行可视化:
在这里插入图片描述
教程参见https://juliagraphs.org/LightGraphs.jl/latest/

1. 优越的性能

这篇文章测试了目前开源的六个图论框架,四个是Python&C++,一个是纯Python(基准),还有一个是Julia的LightGraph.jl,发现Julia的运算速度十分惊人(因为一开始本来没打算测Julia的)。并且与其他框架相比,Julia可以显式控制是否使用并行。

  • 这6个框架是:
    graph-tool, v2.31 (Peixoto 2014)
    igraph, v0.8.2 (Csardi and Nepusz 2006)
    networkit, v6.1.0 (Staudt, Sazonovs, and Meyerhenke 2016)
    networkx, v2.4 (Hagberg, Swart, and S Chult 2008)
    SNAP, v5.0.0 (Leskovec and Sosič 2016)
    lightgraphs, v2.0-dev (Seth Bromberger and contributors 2017)

在这里插入图片描述

  • 测试的5个问题如下:
    loading the data
    single source shortest path
    page rank
    k-core decomposition
    strongly connected components

  • 测试数据集为:
    Amazon product co-purchasing network from March 2 2003, 262k nodes, 1.2m edges
    Web graph from Google, 875k nodes, 5.1m edges
    Pokec online social network, 1.6m nodes, 30.6m edges

  • 结果:
    lightGraph除了loading比较慢之外,在算法上比其他包要快很多。
    在这里插入图片描述

2. 基础

2.1 定义

sing LightGraphs
using Graphplot

G₁ = Graph(3) # graph with 3 vertices

# make a triangle
add_edge!(G₁, 1, 2)
add_edge!(G₁, 1, 3)
add_edge!(G₁, 2, 3)

gplot(G₁, nodelabel=1:3)

在这里插入图片描述
亦可以使用矩阵:

A = [0 1 1
    1 0 1
    1 1 0]

G₂ = Graph(A)

或者随机生成边:

G = Graph(3,3)
G = DiGraph(3,3)
gplot(G)

在这里插入图片描述
另外有一些预定义的图,叫generator:

for shape in ["bull","house"]
    G = smallgraph(shape)
    display(gplot(G))
end

G = CliqueGraph(3,4)
gplot(G)

在这里插入图片描述
在这里插入图片描述
另外可以用嵌套方式:

# metal plate
□ = Graph(4)
add_edge!(□, 1, 2)
add_edge!(□, 1, 3)
add_edge!(□, 2, 4)
add_edge!(□, 3, 4)

# airplane skeleton
skeleton = Graph(11)
add_edge!(skeleton, 1, 2)
add_edge!(skeleton, 2, 3)
add_edge!(skeleton, 3, 4)
add_edge!(skeleton, 4, 5)
add_edge!(skeleton, 3, 6)
add_edge!(skeleton, 3, 7)
add_edge!(skeleton, 3, 8)
add_edge!(skeleton, 3, 9)
add_edge!(skeleton, 9, 10)
add_edge!(skeleton, 9, 11)

gplot(cartesian_product(□, skeleton))

在这里插入图片描述

2.2 函数

G = smallgraph("house")
# 获取节点
nvertices = nv(G) # number of vertices
nedges = ne(G)    # number of edges
for v in vertices(G)
    println("vertex $v")
end
for e in edges(G)
    u, v = src(e), dst(e)
    println("edge $u - $v")
end
adjacency_matrix(G) # 邻接矩阵
incidence_matrix(G) # 关联矩阵
laplacian_matrix(G)  # 拉普拉斯矩阵
gplot(G, nodelabel=1:nvertices, edgelabel=1:nedges) # 绘图

# 增加/删除点和边
add_vertex!(G)
add_edge!(G, 5, 6)
gplot(G, nodelabel=1:nv(G), edgelabel=1:ne(G))
rem_vertex!(G, 1)
gplot(G, nodelabel=1:nv(G), edgelabel=1:ne(G))

以上是关于运筹系列68:Julia的图论包的主要内容,如果未能解决你的问题,请参考以下文章

运筹系列68:TSP问题Held-Karp下界的julia实现

运筹系列70:julia的交互界面

运筹系列80: 使用Julia精确求解tsp问题

运筹系列79:使用Julia进行column generation求解

运筹系列69:GPU版本的单纯形法

图与网络优化