NetworkX加权有向图算法

时间:2019-03-01 01:12:40

标签: python networkx

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

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

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

当球滚下坡时,它会获得动力(即边缘的重量为正值)。

示例:

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

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

等等。

因此,在第一个路径中,球仅到达节点4。在第二个路径中,球未经过节点1。

2 个答案:

答案 0 :(得分:1)

bellman_ford_predecessor_and_distance算法似乎起作用。如果距离<= -100,则球停在前一个节点处,因此我复制了图形,删除了相关的边,然后再次运行算法进行检查。

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)

答案 1 :(得分: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]