我想计算特定来源到目标的所有可能值(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达到相同目的。我能够查看文档
但是它仅讨论特定源到目的地的最短路径。主要目的是计算从特定来源到目的地的最小重量和最大重量。有没有办法达到相同的目的。
由于
,我们可以通过创建函数来实现相同目的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})])
其中值是权重。
谢谢
答案 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帮助我们理解了这一点。