Julia 为什么LightGraphs.betweenness\u centrality()会运行这么长时间

Julia 为什么LightGraphs.betweenness\u centrality()会运行这么长时间,julia,lightgraphs,Julia,Lightgraphs,当我尝试使用julia的LightGraphs包计算SimpleWeightedGraph的介数\u centrality()时,它会无限期运行。它会不断增加RAM的使用量,直到某个时候它崩溃而没有错误消息。我的图表有问题吗?或者,找到问题原因的最佳方法是什么 我的图形不是由LightGraphs生成的,而是由另一个库FlashWeave生成的。我不知道这是否重要 对于未加权的SimpleGraph或我在LightGraphs中创建的加权图,问题不会出现 using BenchmarkTools

当我尝试使用julia的LightGraphs包计算SimpleWeightedGraph的
介数\u centrality()
时,它会无限期运行。它会不断增加RAM的使用量,直到某个时候它崩溃而没有错误消息。我的图表有问题吗?或者,找到问题原因的最佳方法是什么

我的图形不是由LightGraphs生成的,而是由另一个库FlashWeave生成的。我不知道这是否重要

对于未加权的SimpleGraph或我在LightGraphs中创建的加权图,问题不会出现

using BenchmarkTools
using FlashWeave
using ParserCombinator
using GraphIO.GML
using LightGraphs
using SimpleWeightedGraphs

data_path = /path/to/my/data

netw_results = FlashWeave.learn_network(data_path,                                          
                                        sensitive     = true,
                                        heterogeneous = false)

dummy_weighted_graph = SimpleWeightedGraph(smallgraph(:house))
# {5, 6} undirected simple Int64 graph with Float64 weights


my_weighted_graph = graph(netw_results_no_meta)
# {6558, 8484} undirected simple Int64 graph with Float64 weights

# load_graph() only loads unweighted graphs
save_network(gml_no_meta_path, netw_results_no_meta)
my_unweighted_graph = loadgraph(gml_no_meta_path, GMLFormat())
# {6558, 8484} undirected simple Int64 graph



@time betweenness_centrality(my_unweighted_graph)
# 12.467820 seconds (45.30 M allocations: 7.531 GiB, 2.73% gc time)

@time  betweenness_centrality(dummy_weighted_graph)
# 0.271050 seconds (282.41 k allocations: 13.838 MiB)

@time  betweenness_centrality(my_weighted_graph)
# steadily increasing RAM usage until RAM is full and julia crashes.

您是否检查了图表是否包含负权重
LightGraphs.betweenness_centrality()
使用Dijkstra的最短路径来计算betweenness centrality,因此期望非负权重

LightGraphs.betweenness\u centrality()
不检查非法/无意义的图。这就是为什么它没有抛出错误。这个问题已经被报道了,但是现在,如果你不确定它们是否合法,请检查你自己的图表

A = Float64[
    0  4  2
    4  0  1
    2  1  0
]

B = Float64[
    0  4  2
    4  0  -1
    2  -1  0
]

graph_a = SimpleWeightedGraph(A)
# {3, 3} undirected simple Int64 graph with Float64 weights
graph_b = SimpleWeightedGraph(B)
# {3, 3} undirected simple Int64 graph with Float64 weights

minimum(graph_a.weights)
# 0.00
minimum(graph_b.weights)
# -1.00

@time betweenness_centrality(graph_a)
# 0.321796 seconds (726.13 k allocations: 36.906 MiB, 3.53% gc time)
# Vector{Float64} with 3 elements
# 0.00
# 0.00
# 1.00

@time betweenness_centrality(graph_b)
# reproduces your problem.

在这个问题发布到这里之前,这个问题已经在中得到了回答。如解析中所述,图中的权重为负数。Dijkstra不处理具有负权重的图,而介于中心性之间的LightGraphs使用Dijkstra