【问题标题】:All Paths Between 2 Nodes on Basis of Edge Weight基于边权重的 2 个节点之间的所有路径
【发布时间】:2019-04-13 07:29:45
【问题描述】:

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

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

【问题讨论】:

  • 如果您发布一些代码会更容易帮助您
  • @simptri 代码现在仅根据从输入读取的值添加边及其权重。这就是为什么没有添加它。

标签: python graph networkx


【解决方案1】:

通过修改 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()

【讨论】:

    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2012-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多