【问题标题】:Shortest path between each node in the graph and elements in a list图中每个节点与列表中元素之间的最短路径
【发布时间】:2021-08-16 10:25:15
【问题描述】:

以下数据框

Node       Target
Jennifer   Maria
Luke       Mark
Johnny     Martin
Ludo       Martin
Maria      nan
Mark       Luke
Mark       Christopher 

用于构建网络(其中node为源节点):

G = nx.from_pandas_edgelist(edges, source='Node', target='Target')

我想列出源节点和单独列表中的节点之间的所有最短路径(如果存在):

list4path=['Christopher', 'Donna', 'Julian','Martin']

计算networkx中的最短路径有几个选项(例如,shortest_path),但我想知道如何获得每个节点和list4pth中的几个目标之间的所有最短路径(目标列只需要用于建筑目的)。

【问题讨论】:

    标签: python networkx


    【解决方案1】:

    最简单的方法是使用默认行为nx.shortest_path(G),只要您的网络很小,就没有指定source 或target 参数。如果你只是运行all_shortest = nx.shortest_path(G),按照docs:

    如果既没有指定源也没有指定目标,则返回带有 path[source][target]=[list of nodes in path] 的字典字典。

    那么 all_shortest['Luke']['Christopher'] 将是 Luke 和 Christopher 之间的 a 最短路径,或者如果节点之间没有路径,则将导致 KeyError。或者你可以使用.get() 来避免KeyError。

    如果您的网络足够大以至于只计算目标在list4path 中的路径更实用,那么您可以执行以下操作:

    selected_shortest = {source: {target: nx.shortest_path(G, source, target) for target in list4path if nx.has_path(G, source, target)} for source in G.nodes()}
    

    这将为您提供相同的数据结构,但只计算所需的最短路径,该路径以来自list4path 的节点结尾。

    我确信编写一个仅处理source 和target 之间没有路径的情况的简单函数会快得多。我只是在懒惰的单行代码中调用了额外的nx.has_path() 函数,但我将把它作为练习留给读者进行优化。 ;^)

    【讨论】:

      猜你喜欢
      • 2015-06-12
      • 2015-05-17
      • 2021-12-18
      • 2016-03-04
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多