Python NetworkX加权有向图算法

Python NetworkX加权有向图算法,python,networkx,Python,Networkx,我试图解决一个类似于我在下面描述的问题。请您提出一个解决方案或推荐一些算法在NetworkX中试用。非常感谢 假设有一个起始动量为100的球。在失去所有动量并停止之前,球能沿着所有可能的路径走多远 当球滚上坡时,它失去动量(即边缘有负重) 当球滚下山时,它获得动量(即边缘具有正重量) 示例: 第一条路径:(1)-[weight:-50]-->(2)-[weight:40]-->(3)-[weight:-50]-->(4)-[weight:-90]-->(5) 第二条路径:(1)——[重量:-10

我试图解决一个类似于我在下面描述的问题。请您提出一个解决方案或推荐一些算法在NetworkX中试用。非常感谢

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

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

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

示例:

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

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

等等


因此,在第一条路径中,球只能到达节点4。在第二条路径中,球没有通过节点1。

贝尔曼·福特·前辈·距离算法似乎有效。如果距离bellman\u-ford\u-preference\u和\u-distance算法似乎有效。如果距离我在
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]
将networkx导入为nx
G=nx.DiGraph()
G.从([(1,2,-50),(2,3,40),(3,4,-50)中添加加权边,
(4, 5, -90), (1, 6, -105)])
def func(图形、源、目标、起始重量):
总重量=起始重量
路径=[]
p=nx.bellman\u ford\u路径(图、源、目标)
对于压缩中的u,v(p,p[1:]):
总重量+=G[u][v][‘重量’]
路径追加(u)
如果总数<0:
返回路径
其他:
返回路径
打印(func(G,1,5,100))
# [1, 2, 3, 4]
打印(功能(G,1,6,100))
# [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]
将networkx导入为nx
G=nx.DiGraph()
G.从([(1,2,-50),(2,3,40),(3,4,-50)中添加加权边,
(4, 5, -90), (1, 6, -105)])
def func(图形、源、目标、起始重量):
总重量=起始重量
路径=[]
p=nx.bellman\u ford\u路径(图、源、目标)
对于压缩中的u,v(p,p[1:]):
总重量+=G[u][v][‘重量’]
路径追加(u)
如果总数<0:
返回路径
其他:
返回路径
打印(func(G,1,5,100))
# [1, 2, 3, 4]
打印(功能(G,1,6,100))
# [1]

Hi W3LS。。。一些示例代码显示您迄今为止所做的尝试会很有帮助。您可能希望在能量方面这样做。一个球在上坡/下坡时获得或失去的动量部分取决于它到达山坡时的速度。嗨,W3LS。。。一些示例代码显示您迄今为止所做的尝试会很有帮助。您可能希望在能量方面这样做。一个球在上坡/下坡时获得或失去的动量部分取决于它到达山坡时的速度。