【问题标题】:Efficiently identifying ancestors/descendants within a given distance, in networkx在networkx中有效地识别给定距离内的祖先/后代
【发布时间】:2017-02-17 05:03:51
【问题描述】:

networkx 中是否有一个函数/方法可以识别给定(可选加权)距离内的所有祖先/后代?

例如,可以有效地产生与下面的函数相同的结果?

import networkx
g = networkx.DiGraph()
edges_with_atts = [(1, 2, {'length':5}),
                (1, 3, {'length':11}),
                (2, 4, {'length':4}),
                (2, 5,{'length':7})]
g.add_edges_from(edges_with_atts)

def descendants_within(graph, start_node=1, constraint=10, weight='length'):
    result = set()
    for node in networkx.descendants(graph, start_node):
        if networkx.shortest_path_length(graph, start_node, node, weight) < constraint:
            result.add(node)
    return result

print(descendants_within(g))

#set([2, 4])

【问题讨论】:

    标签: python networkx directed-graph


    【解决方案1】:

    一些 NetworkX 最短路径算法有一个“截止”参数。例如,在您的情况下,您可以从源节点到所有其他节点运行“单源最短路径”计算,并将搜索限制为短于指定截止长度的路径。在下面的示例中,Dijkstra 算法用于计算加权网络的最短路径。

    import networkx as nx
    g = nx.DiGraph()
    edges_with_atts = [(1, 2, {'length':5}),
                    (1, 3, {'length':11}),
                    (2, 4, {'length':4}),
                    (2, 5,{'length':7})]
    g.add_edges_from(edges_with_atts)
    
    lengths = nx.single_source_dijkstra_path_length(g, source=1, weight='length', cutoff=10)
    print(dict(lengths).keys())
    # [1, 2, 4]
    

    【讨论】:

    • 谢谢。对于计划使用它的其他人,请注意:single_source_dijkstra_path_length 仅处理后代。为了得到祖先,我不得不反转图表:networkx.reverse(g)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多