Python 在NetworkX图形中指定边的深度

Python 在NetworkX图形中指定边的深度,python,graph,networkx,traversal,Python,Graph,Networkx,Traversal,我有一个无向图,我想在不知道源和汇的情况下找到它的最短路径NeworkX的所有对dijkstra_路径允许在不知道源和汇的情况下发现所有最短路径,只要给定长度截止(测量遍历深度) 当前,每个遍历的边都会向深度添加+1。是否有方法指定边缘属性,以便 每条边都带有一个权重w,通过该权重计算路径长度(和最短路径) 每条边还带有一个深度d,指定的总深度通过该深度终止路径搜索 创建图形时,需要为每条边指定一个表示距离的属性: G.add_edge(0, 1, distance=0.4) 计算最短路径

我有一个无向图,我想在不知道
的情况下找到它的最短路径
NeworkX
所有对dijkstra_路径
允许在不知道源和汇的情况下发现所有最短路径,只要给定长度
截止
(测量遍历深度)

当前,每个遍历的边都会向深度添加
+1
。是否有方法指定边缘属性,以便

  • 每条边都带有一个权重
    w
    ,通过该权重计算路径长度(和最短路径)
  • 每条边还带有一个深度
    d
    ,指定的总深度通过该深度终止路径搜索

创建图形时,需要为每条边指定一个表示距离的属性:

G.add_edge(0, 1, distance=0.4)
计算最短路径时,可以指定该属性,以便计算加权最短路径:

paths = nx.shortest_path(G, weight='distance')
所有对最短路径
只计算未加权的情况;但是,如果不指定源节点和目标节点,
shortest_path
也会计算所有对

编辑 networkx中没有任何东西符合要求(AFAIK)。但是,您可以使用
nx.simple\u paths.shortest\u simple\u paths
为按总“深度”排序的两个节点之间的所有路径创建生成器,然后根据权重计算最短路径:

import itertools
import networkx as nx
import numpy as np

def path_cost(G, path, attr='weight'):
    return sum([G[path[i]][path[i+1]][attr] for i in range(len(path)-1)])

G = ...

cutoff = 3
output = dict()
for source, target in itertools.combinations(list(G.nodes), 2):
    minimum_cost = np.inf
    for path in nx.simple_paths.shortest_simple_paths(G, source, target, weight='depth'):
        if path_cost(G, path, 'depth') > cutoff:
            continue # to next source, target pair
        else:
            if path_cost(G, path, 'weight') < minimum_cost:
                output[(source, target)] = path
导入itertools
将networkx导入为nx
将numpy作为np导入
定义路径_成本(G,路径,attr='weight'):
返回和([G[path[i]][path[i+1]][attr]用于范围内的i(len(path)-1)])
G=。。。
截止值=3
输出=dict()
对于源,itertools.组合中的目标(列表(G.nodes),2):
最低成本=np.inf
对于nx中的路径。简单路径。最短简单路径(G,源,目标,权重='depth'):
如果路径成本(G,路径,“深度”)>截止:
继续#到下一个源、目标对
其他:
如果路径成本(G,路径,“重量”)<最小成本:
输出[(源、目标)]=路径

谢谢您的回答,很抱歉我的含糊不清。在我的图中,每条边都有一个权重,我想尊重最短路径本身。我希望能够做到的是,将某些边设置为也有一个步长-因此,即使它可能穿过一个边(承载特定重量),它也可以在深度上行走x步。由于搜索根据深度而不是重量停止,因此走一条边,但“深度”越大,搜索越早终止。这更清楚吗?是的,那更清楚。我已相应地更新了我的答案。