使用 NetworkX 的列表中所有路径的长度

问题描述 投票:0回答:2

我需要一些关于图表的帮助。我使用 NetworkX 模块,但了解它的一切并不那么重要。我是 Python 初学者。我开始创建一个普通的图表:

import networkx as nx

G = nx.Graph()

G.add_edge("Node1","Node2",length=140,sf=4)
G.add_edge("Node2","Node3",length=170,sf=3)
G.add_edge("Node1","Node4",length=300,sf=1)
G.add_edge("Node4","Node3",length=230,sf=10)

x = input('First Node: ')
y = input('Second Node: ')

paths = sorted(nx.all_simple_paths(G,x,y))

print(paths)

我添加了 2 个属性:length 和 sf(稍后我会需要它)。我运行这个程序并通过 Node1 和 Node3 得到:

[['Node1', 'Node2', 'Node3'], ['Node1', 'Node4', 'Node3']]

如何计算路径的长度?然后我需要将长度乘以属性“sf”。我把问题简化了,因为以后我有几百个节点,所以会更困难。

我开始考虑 for 函数,但我只是遇到错误。

python
2个回答
3
投票

你可以使用

for-loop
:

import sys
import networkx as nx

G = nx.Graph()

G.add_edge("Node1", "Node2", length=140, sf=4)
G.add_edge("Node2", "Node3", length=170, sf=3)
G.add_edge("Node1", "Node4", length=300, sf=1)
G.add_edge("Node4", "Node3", length=230, sf=10)

x, y = sys.argv[-2:]
paths = sorted(nx.all_simple_paths(G, x, y))

for path in paths:
    total_length = 0
    for i in range(len(path)-1):
        source, target = path[i], path[i+1]
        edge = G[source][target]
        length = edge['length']*edge['sf']
        total_length += length
    print('{}: {}'.format(path, total_length))

或者,更简洁地说,您可以用

 生成器替换内部 
for-loop 表情

import operator
length_sf = operator.itemgetter('length', 'sf')
for path in paths:
    total_length = sum(operator.mul(*length_sf(G[path[i]][path[i+1]])) 
                       for i in range(len(path)-1)) 
    print('{}: {}'.format(path, total_length))

两种选择都会产生(对于

x, y = 'Node1', 'Node3'

['Node1', 'Node2', 'Node3']: 1070
['Node1', 'Node4', 'Node3']: 2600

0
投票

您可以使用 path_weight 函数来计算列表“路径”的各个路径长度:

length_of_All_Paths
list
内每个列表长度的
paths

length_of_All_Paths = [nx.path_weight(G, temp_path, weight='length') for temp_path in paths]
© www.soinside.com 2019 - 2024. All rights reserved.