如何用NetworkX实现单源多目标(子串匹配节点)的路径查找
解决NetworkX单源多子串匹配目标的路径查找问题
步骤1:筛选匹配子串的目标节点
先从图中提取所有包含指定子串(如'IASW'、'IUPE')的节点,用列表推导式即可快速实现:
import networkx as nx # 假设你已创建好图G target_substrings = ['IASW', 'IUPE'] # 筛选所有包含任一目标子串的节点 target_nodes = [node for node in G.nodes() if any(sub in node for sub in target_substrings)]
步骤2:批量计算单源到目标节点的最短路径
针对多目标场景,有两种高效处理方式:
方式一:逐个遍历目标节点(适合小规模图)
循环每个筛选出的目标节点,调用nx.shortest_path,同时处理路径不存在的情况:
source_node = 'C0111' path_results = {} for target in target_nodes: if nx.has_path(G, source_node, target): path = nx.shortest_path(G, source_node, target) path_results[target] = path else: path_results[target] = "无可达路径" # 输出结果 for node, path in path_results.items(): print(f"从{source_node}到{node}的路径: {path}")
方式二:单源路径树优化(适合大规模图)
如果图节点数量较多,先调用nx.single_source_shortest_path获取源节点到所有可达节点的路径字典,再从中提取目标节点的路径,避免重复计算:
# 获取源节点到所有可达节点的路径集合 all_reachable_paths = nx.single_source_shortest_path(G, source_node) # 提取目标节点对应的路径 optimized_path_results = { target: all_reachable_paths[target] for target in target_nodes if target in all_reachable_paths } # 补充无路径的节点记录 for target in target_nodes: if target not in optimized_path_results: optimized_path_results[target] = "无可达路径"
示例验证
用你给出的示例节点构建测试图,验证代码逻辑:
# 构建测试图 G = nx.Graph() nodes = ['C0111', 'N6186', 'C5572', 'N6501', 'C0850-IASW-NO01', 'C1182-IUPE-NO01'] G.add_nodes_from(nodes) # 添加示例边(根据你的实际边集调整) G.add_edges_from([ ('C0111', 'N6186'), ('N6186', 'C5572'), ('C5572', 'C0850-IASW-NO01'), ('C0111', 'N6501'), ('N6501', 'C1182-IUPE-NO01') ]) # 执行代码后会输出: # 从C0111到C0850-IASW-NO01的路径: ['C0111', 'N6186', 'C5572', 'C0850-IASW-NO01'] # 从C0111到C1182-IUPE-NO01的路径: ['C0111', 'N6501', 'C1182-IUPE-NO01']
内容的提问来源于stack exchange,提问作者user36605
相关产品推荐
相关产品推荐

