如何使用Networkx在MultiDigraph中查找含正向、反向边的路径?
实现方法:允许反向遍历边的路径查找
当然可以实现!你要找的是允许反向遍历原有边的路径——也就是把原图中3→2的边反过来走成2→3,再配合1→2的正向边,形成1→2→3的路径。下面给你两种基于NetworkX的实现方案:
方案1:构建包含反向边的新图
这种方法会创建一个新的有向图,同时包含原图的所有边和它们的反向边,之后直接在新图里执行常规的路径查找:
import networkx as nx # 初始化你原有的MultiDiGraph G = nx.MultiDiGraph() G.add_edge(1, 2, attr=0.5) G.add_edge(3, 2, attr=1.0) # 创建包含原边和反向边的新图 G_with_reverses = nx.MultiDiGraph() # 添加原图的所有边 for u, v, attrs in G.edges(data=True): G_with_reverses.add_edge(u, v, **attrs) # 添加对应反向边,这里保留了原边的属性,你也可以根据需求修改 G_with_reverses.add_edge(v, u, **attrs) # 查找从1到3的最短路径 try: path = nx.shortest_path(G_with_reverses, source=1, target=3) print(f"找到的路径: {path}") # 输出: 找到的路径: [1, 2, 3] except nx.NetworkXNoPath: print("不存在符合条件的路径")
方案2:自定义邻居生成器(无需创建新图)
如果你不想额外创建图,可以在路径查找时自定义邻居规则,允许同时遍历当前节点的出边邻居(正向走)和入边邻居(反向走):
import networkx as nx # 初始化原图 G = nx.MultiDiGraph() G.add_edge(1, 2, attr=0.5) G.add_edge(3, 2, attr=1.0) # 自定义邻居生成函数:返回正向和反向可到达的节点 def allow_reverse_neighbors(graph, node): # 合并出边邻居(successors)和入边邻居(predecessors) return set(graph.successors(node)) | set(graph.predecessors(node)) # 查找所有从1到3的简单路径 paths = list(nx.all_simple_paths(G, source=1, target=3, neighbor=allow_reverse_neighbors)) print(f"所有符合条件的路径: {paths}") # 输出: 所有符合条件的路径: [[1, 2, 3]]
方案对比
- 方案1适合需要多次执行此类路径查询的场景,一次构建新图后可以重复使用;
- 方案2更轻量化,单次查询时无需额外占用内存存储新图,效率更高。
内容的提问来源于stack exchange,提问作者softProcess
相关产品推荐
相关产品推荐

