Генерация взвешенной и направленной матрицы смежности форм сети в Юлии - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу создать взвешенную и направленную сеть из матрицы смежности в Julia (v0.7).

Пока я пробовал:

using LightGraphs
using SimpleWeightedGraphs

A = rand(100, 100)
G = Graph(A)

, но я получаю ошибку:

ERROR: ArgumentError: Adjacency / distance matrices must be symmetric
Stacktrace:
 [1] SimpleGraph{Int64}(::Array{Float64,2}) at /home/user/.julia/packages/LightGraphs/PPsyP/src/SimpleGraphs/simplegraph.jl:78
 [2] SimpleGraph(::Array{Float64,2}) at /home/user/.julia/packages/LightGraphs/PPsyP/src/SimpleGraphs/simplegraph.jl:72
 [3] top-level scope at none:0

До сих пор я видел только пример на странице github (https://github.com/JuliaGraphs/SimpleWeightedGraphs.jl)), которая генерирует взвешенный граф из и крайний список. Однако я бы предпочел, чтобы я мог генерировать граф напрямуюиз матрицы смежности.

Ответы [ 3 ]

0 голосов
/ 19 сентября 2018

Исходя из ответа crstnbr, Graph является невзвешенным неориентированным, поэтому матрица смежности идеально симметрична со значениями в [0, 1].
При подаче в конструктор Graph любая симметричная матрица создает ребра для каждого ненулевой элемент:

A = rand(3,3);
Graph(A+A');
println.(edges(G));
 Edge 1 => 1
 Edge 1 => 2
 Edge 1 => 3
 Edge 2 => 2
 Edge 2 => 3
 Edge 3 => 3

* SimpleWeightedDiGraph имеет несколько конструкторов, которые могут принимать плотную или SparseMatrixCSC матрицу смежности:

SimpleWeightedDiGraph(rand(4,4))
 {4, 16} directed simple Int64 graph with Float64 weights

SimpleWeightedDiGraph(rand([0,1], 3, 3))
 {3, 5} directed simple Int64 graph with Int64 weights

using SparseArrays
SimpleWeightedDiGraph( sprand(3, 3, 0.5) )
 {3, 5} directed simple Int64 graph with Float64 weights
0 голосов
/ 19 сентября 2018

Первая проблема, с которой вы сталкиваетесь, заключается в том, что ваша матрица случайных смежностей не является симметричной, и это требуется для неориентированного графа.Вы хотите создать ориентированный граф.

Во-вторых, если вам нужен взвешенный граф, вы захотите использовать пакет SimpleWeightedGraphs.jl, что означает, что вы можете просто сделать

julia> using LightGraphs, SimpleWeightedGraphs

julia> a = rand(100,100);

julia> g = SimpleWeightedDiGraph(a)
{100, 10000} directed simple Int64 graph with Float64 weights
* 1006.* но учтите, что это действительно плохой способ создания случайного взвешенного графа, потому что функция rand почти гарантирует, что это будет полный граф.Гораздо лучше использовать sprand:
julia> using SparseArrays

julia> a = sprand(100, 100, 0.2);

julia> g = SimpleWeightedDiGraph(a)
{100, 2048} directed simple Int64 graph with Float64 weights
0 голосов
/ 18 сентября 2018

Отнюдь не эксперт по графам Джулии, но я думаю, что вам нужно:

julia> A = rand(100,100);

julia> G = SimpleWeightedDiGraph(A)
{100, 10000} directed simple Int64 graph with Float64 weights

Graph(a::AbstractMatrix) - конструктор для неориентированного (взвешенного по единицам) графа:

julia> A = A+transpose(A); # making A symmetric

julia> G = Graph(A)
{100, 5050} undirected simple Int64 graph

julia> weights(G)
100 × 100 default distance matrix (value = 1)
...