我是编程新手,我试图找到2个节点之间的所有可能路径,其中边的权重之和小于给定值。我已经在NetworkX中实现了我的图形,并且节点没有任何权重。我可以使用NetworkX中的任何预定义功能,或者我需要为此编写自己的算法,如果这样做,那么最好的方法是什么?
编辑:现在的代码只是读取输入值,并通过NetworkX中定义的add_edge方法将边沿及其各自的权重相加。 我还试图理解NetworkX中定义的all_simple_paths_graph方法的代码,以便对其进行修改以保持重量级,但到目前为止进展甚微,这是Python的新手。
答案 0 :(得分:0)
为此通过修改NetworkX的现有功能找到了一个简单的实现。 此功能将打印给定节点之间的所有路径,沿这些路径的边缘权重之和不超过给定值。
def all_paths(G, source, target, w):
cutoff = len(G)-1
visited = [source]
stack = [iter(G[source])]
weight = 0
while stack:
children = stack[-1]
child = next(children, None)
if child is None:
stack.pop()
visited.pop()
elif len(visited) < cutoff:
if child == target:
if (visited[-1],child) in G.nodes():
temp = G[visited[-1]][child]['weight']
else:
temp = G[child][visited[-1]]['weight']
if weight+temp <= w:
yield visited + [target]
elif child not in visited:
if (visited[-1],child) in G.nodes():
weight += G[visited[-1]][child]['weight']
else:
weight += G[child][visited[-1]]['weight']
visited.append(child)
stack.append(iter(G[child]))
else:
if child == target or target in children:
if (visited[-1],child) in G.nodes():
temp = G[visited[-1]][child]['weight']
else:
temp = G[child][visited[-1]]['weight']
if weight+temp <= w:
yield visited + [target]
stack.pop()
visited.pop()