我想从A和D计算图形中的最短路径,但仅考虑具有给定属性的节点。例如:
import pandas as pd
import networkx as nx
cols = ['node_a','node_b','travel_time','attribute']
data = [['A','B',3,'attribute1'],
['B','C',1,'attribute1'],
[ 'C','D',7,'attribute1'],
['D','E',3,'attribute1'],
['E','F',2,'attribute1'],
['F','G',4,'attribute1'],
['A','L',4,'attribute2'],
['L','D',3,'attribute2']
]
edges = pd.DataFrame(data)
edges.columns = cols
G=nx.from_pandas_dataframe(edges,'node_a','node_b', ['travel_time','attribute'])
如果我想计算从A到D的最短路径,默认方法是
nx.shortest_path(G,'A','D',weight='travel_time')
哪个可以给我['A', 'L', 'D']
,但是如果我只想考虑带有attribute1
的节点,情况就不会这样。我看不到如何修改它,有没有一种规范的方法来代替编码我自己的最短路径?
谢谢!
答案 0 :(得分:1)
我不知道一个开箱即用的解决方案,但是您可以从具有所需属性(快速而肮脏的实现)的所有节点制作一个子图:
edges = [(a,b) for (a,b,e) in G.edges(data=True) if e['attribute']=='attribute1']
nodes = []
for a,b in edges:
nodes += [a,b]
nx.shortest_path(G.subgraph(nodes),'A','D',weight='travel_time')
编辑: @Joel正确指出,此答案可能会给出错误的结果。 为了避免这种情况,您可以查询只有具有正确属性边的图的重复项:
H = G.copy()
edges_to_remove = [e for e in H.edges(data=True) if not e['attribute']=='attribute1']
H.remove_edges_from(edges_to_remove)
nx.shortest_path(H,'A','D',weight='travel_time')
Edit2 :遵循这个想法,我认为可以通过删除原始图形中的边并重新添加它们而无需复制来使其更快一点:
edges_to_remove = [e for e in G.edges(data=True) if not e['attribute']=='attribute1']
G.remove_edges_from(edges_to_remove)
nx.shortest_path(G,'A','D',weight='travel_time')
G.add_edges_from(edges_to_remove)