【问题标题】:NetworkX weighted digraph algorithmsNetworkX 加权有向图算法
【发布时间】:2019-03-01 01:12:39
【问题描述】:

我正在尝试解决类似于我在下面描述的问题。您能否提出解决方案或推荐一些算法以在 NetworkX 中尝试。非常感谢。

假设有一个球的起始动量为 100。在失去所有动量并停止之前,球在所有可能的路径中能走多远?

当球滚上坡时,它会失去动量(即边缘的重量为负)。

当球滚下坡时,它会获得动量(即边缘具有正权重)。

例子:

第一条路径:(1)--[weight: -50]-->(2)--[weight: 40]-->(3)--[weight: -50]-->(4) --[体重:-90]-->(5)

第二条路径:(1)--[权重:-105]-->(6)

等等

因此,在第一条路径中,球只能到达节点 4。在第二条路径中,球不会经过节点 1。

【问题讨论】:

  • 您好 W3LS ...一些示例代码显示您到目前为止所尝试的内容会有所帮助。
  • 您可能希望在能量方面做到这一点。球在上坡/下坡时获得或失去的动量部分取决于它到达山坡时的速度。

标签: python networkx


【解决方案1】:

我没有在Networkx 中找到任何为此目的的特殊算法。您可以使用以下函数,该函数使用 Bellman-Ford 算法:

import networkx as nx

G = nx.DiGraph()
G.add_weighted_edges_from([(1, 2, -50), (2, 3, 40), (3, 4, -50),
                           (4, 5, -90), (1, 6, -105)])

def func(graph, source, target, start_weight):
    total = start_weight
    path = []
    p = nx.bellman_ford_path(graph, source, target)
    for u, v in zip(p, p[1:]):
        total += G[u][v]['weight']
        path.append(u)
        if total < 0:
            return path
    else:
        return path

print(func(G, 1, 5, 100))
# [1, 2, 3, 4]

print(func(G, 1, 6, 100))
# [1]

【讨论】:

    【解决方案2】:

    bellman_ford_predecessor_and_distance 算法似乎有效。如果距离

    import networkx as nx
    
    G = nx.DiGraph()
    
    G.add_edge(1, 2, weight= -50)
    G.add_edge(2, 3, weight= 40)
    G.add_edge(3, 4, weight= -50)
    G.add_edge(4, 5, weight= -90)
    G.add_edge(1, 6, weight= -105)
    G.add_edge(6, 7, weight= 110)
    
    pred, dist = nx.bellman_ford_predecessor_and_distance(G, 1)
    
    print(pred, dist)
    
    F = G
    
    for x, y in dist.items():
     if y <= -100:
      z = pred.get(x)[0]
      F.remove_edge(z,x)  
    
    pred, dist = nx.bellman_ford_predecessor_and_distance(G, 1)
    
    print(pred, dist)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-24
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      相关资源
      最近更新 更多