我正在尝试解决与以下所述类似的问题。您能否提出解决方案或推荐一些算法来尝试在NetworkX中使用。非常感谢。
假设一个球的起始动量为100。在失去所有动量并停止之前,该球能落到所有可能的路径多远?
当球上坡时,它会失去动量(即边缘负重)。
当球滚下坡时,它会获得动力(即边缘的重量为正值)。
示例:
第一条路径:(1)-[重量:-50]->(2)-[重量:40]->(3)-[重量:-50]->(4) -[体重:-90]->(5)
第二条路径:(1)-[重量:-105]->(6)
等等。
因此,在第一个路径中,球仅到达节点4。在第二个路径中,球未经过节点1。
答案 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]