使用NetworkX查找最短和最长的权重

时间:2019-09-03 03:25:10

标签: python networkx

我想计算特定来源到目标的所有可能值(csv中的列)。我能够使用以下代码创建图形:

import networkx as nx
import pandas as pd

df = pd.read_csv('Rates.csv')

Graphtype = nx.MultiDiGraph()

G = nx.from_pandas_edgelist(df, source='Source', target='Destination', edge_attr='value',create_using=Graphtype)   



# print all paths 

for path in nx.all_simple_paths(G, source='a', target='d'):
    print(path)

我正确地将输出从特定来源传送到目的地。

输出

 ['a', 'b', 'c', 'd']
    ['a', 'b', 'd']
    ['a', 'd']
    ['a', 'c', 'd']

由于我们也已将权重分配给图形,因此我也要计算所有路径的权重。即让我们说['a','b','c','d']的权重将为SUM(a-> b,b-> c,c-> d),并且所有路径的权重均相同。

有什么方法可以使用networkX达到相同目的。我能够查看文档

  

https://networkx.github.io/documentation/latest/_modules/networkx/algorithms/shortest_paths/weighted.html

但是它仅讨论特定源到目的地的最短路径。主要目的是计算从特定来源到目的地的最小重量和最大重量。有没有办法达到相同的目的。

由于

,我们可以通过创建函数来实现相同目的
  

How to find path with highest sum in a weighted networkx graph?

heaviest_path = max((path for path in nx.all_simple_paths(G, source, dest)),
                    key=lambda path: get_weight(path))

任何人都可以建议我们如何构建get_weight函数。

编辑

G.edges()提供输出:

OutMultiEdgeDataView([('a', 'b', {'value': 0.7}), ('a', 'd', {'value': 0.52}), ('a', 'c', {'value': 0.33}), ('b', 'c', {'value': 0.58}), ('b', 'd', {'value': 0.66}), ('c', 'd', {'value': 0.4}), ('d', 'b', {'value': 0.3})])

其中值是权重。

谢谢

2 个答案:

答案 0 :(得分:0)

我不认为networkx内置任何内容。但是我认为这是一个相当简单的函数。我将假设权重存储在edge属性'weight'中。

def get_weight(G, path):
    total = 0
    for u, v in zip(path[:-1], path[1:]):
        total += G.edges[u,v]['weight']
    return total

我使用了zip,它将获取两个列表,并返回由其参数的第一个元素,然后的第二个元素,然后是第三个元素等组成的对。我将两个列表,即第一个列表是zip,但没有最后一个元素。第二个列表是path,但没有第一个元素。因此,如果path,则path = ['a', 'b', 'c', 'd']返回的第一件事是zip。接下来是('a','b'),等等。

您可以通过使用列表理解功能来使其更加紧凑:

('b', 'c')

我相信它的速度也要快一些,但是我对此可能是错的。除非您进行许多此类计算,否则不可能产生重大变化。

答案 1 :(得分:0)

我能够使用以下代码解决问题:

def get_weight(G, path):
    total = 0
    for u, v in zip(path[:-1], path[1:]):
        total += G.get_edge_data(u,v)[0]['value']
    return total

感谢@Joel帮助我们理解了这一点。

相关问题