当前位置: 首页 > 知识库问答 >
问题:

NetworkX平均最短路径长度和直径需要永远

西门磊
2023-03-14

我有一个由未加权边构建的图(a),我想计算主图(a)中最大连通图(giantC)的平均最短路径长度。但是,到目前为止,该脚本已经运行了3个多小时(在Colab和本地进行了尝试),对于diameteraverage\u shortest\u path\u length都没有输出任何结果。

我使用的是networkx==2.5python==3.6。9

这是我的剧本

import logging
import networkx as nx 
from networkx.algorithms.distance_measures import diameter
from networkx.algorithms.shortest_paths.generic import average_shortest_path_length


# graph is built from a json file as follows 
with open('graph.json') as f:
     graph_dict = json.load(f)

_indices = graph_dict['indices']
s_lst, rs_lst= _indices[0], _indices[1]    

graph_ = nx.Graph()
for i in range(len(s_lst)):
     graph_.add_edge(s_lst[i], rs_lst[i])


# fetch the hugest graph of all graphs
connected_subgraphs = [graph_.subgraph(cc) for cc in 
nx.connected_components(graph_)]
logging.info('connected subgraphs fetched.')
Gcc = max(nx.connected_components(graph_), key=len)
giantC = graph_.subgraph(Gcc)
logging.info('Fetched Giant Subgraph')

n_nodes = giantC.number_of_nodes()
print(f'Number of nodes: {n_nodes}') # output is 106088

avg_shortest_path = average_shortest_path_length(giantC)
print(f'Avg Shortest path len: {avg_shortest_path}')

dia = diameter(giantC)
print(f'Diameter: {dia}')

有没有办法让它更快?或者是计算giantC图的直径和最短路径长度的替代方法?

共有1个答案

曾枫
2023-03-14

对于将来的读者,如果您想从NetworkX图形中获取最大的连接子图

import networkx as nx
import logging


def fetch_hugest_subgraph(graph_):
    Gcc = max(nx.connected_components(graph_), key=len)
    giantC = graph_.subgraph(Gcc)
    logging.info('Fetched Giant Subgraph')
    return giantC

如果您想计算图形的平均最短路径长度,我们可以通过采样来实现

from statistics import mean
import networkx as nx


def write_nodes_number_and_shortest_paths(graph_, n_samples=10_000,
                                          output_path='graph_info_output.txt'):
    with open(output_path, encoding='utf-8', mode='w+') as f:
        for component in nx.connected_components(graph_):
            component_ = graph_.subgraph(component)
            nodes = component_.nodes()
            lengths = []
            for _ in range(n_samples):
                n1, n2 = random.choices(list(nodes), k=2)
                length = nx.shortest_path_length(component_, source=n1, target=n2)
                lengths.append(length)
            f.write(f'Nodes num: {len(nodes)}, shortest path mean: {mean(lengths)} \n')

Joris Kinable(在评论中)告诉我,计算avg_shortest_path_length的复杂性为O(V^3); V=节点数。这同样适用于计算你的重力直径

 类似资料:
  • 我想计算标记图中具有相同标签的节点的平均最短路径。例如,红色标记为A,黑色标记为B。 V_m是具有相同标签的顶点。n{i,j}是最短路径数,d{i,j}是测地距离。 我想使用Networkx来实现它。开始使用节点属性进行标记。 我可以用 现在我只想将键/值对保留在标签为例如“A”的位置。因此,我可以关注具有相同标签的节点。我希望它不是抽象的,但你有什么想法吗? 提前谢谢。

  • 如何计算路径的平均路径长度是一个,或两个在networkx?例如,在下面的图表中,平均路径长度等于一是6,二是2。

  • 这个问题是NetworkX特有的。我可以创建自己的函数来完成所有我需要的事情,但是这需要更长的时间,所以我想避免它。 情况: 我有一个未加权图,由NetworkX无向图表示。从这个图中,我寻找“最短循环”——也就是说,对于给定的节点k,我正在寻找最短的简单路径(只通过一个节点一次),它离开k,然后返回k。 为了实现这一点,我想使用任何NetworkX最短路径算法,并从节点k到节点k进行搜索。问题是

  • 我有一个一般性的问题,关于如何在边没有权的无向图中找到最短路径和最长路径。 我们需要使用DFS算法来寻找图中的最长路径,而我们需要使用BFS算法来寻找图中的最短路径,这是一个正确的结论吗?

  • 我是NetworkX的初学者,我试图找到一种方法,将图中一个节点到其他节点的所有最短路径值汇总为一个聚合值,例如,节点B的长度为6,如下面代码的结果所示。我得到了图中所有节点对之间的最短路径,但是我需要帮助将每个节点的长度添加为一个值,如上所述。任何帮助都将不胜感激。下面是计算最短路径长度的代码。我编辑了这个问题,以便获得单个节点的节点密度值,如下面的代码所示。

  • 我有一个人际网络。我可以通过使用Networkx创建有向图来显示它们的连接方式。 下面是一个代码示例: 我还可以计算两个节点之间的最短路径。然而,我坚持的是如何强调这条“最短路径”。任何指点都将不胜感激。顺便说一句,我是个新手