基于边缘权重的2个节点之间的所有路径

时间:2019-04-13 07:29:46

标签: python graph networkx

我是编程新手,我试图找到2个节点之间的所有可能路径,其中边的权重之和小于给定值。我已经在NetworkX中实现了我的图形,并且节点没有任何权重。我可以使用NetworkX中的任何预定义功能,或者我需要为此编写自己的算法,如果这样做,那么最好的方法是什么?

编辑:现在的代码只是读取输入值,并通过NetworkX中定义的add_edge方法将边沿及其各自的权重相加。 我还试图理解NetworkX中定义的all_simple_paths_graph方法的代码,以便对其进行修改以保持重量级,但到目前为止进展甚微,这是Python的新手。

1 个答案:

答案 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()