自定义Networkx最短路径权重函数实现行人寻路仿真
行人寻路仿真权重函数实现方案
关键注意事项
- 原代码节点属性赋值写法有误:
add_nodes_from的关键字参数会给所有传入节点赋相同属性值,无法通过传列表实现按节点一一对应赋值,需要用(节点名, 属性字典)的元组格式批量定义节点属性。 - networkx要求传入的边权重回调必须接收3个位置参数:边的起点
u、边的终点v、边属性字典d。针对无向图寻路场景,算法遍历邻接边时会自动将当前路径的前驱节点作为u传入,正好匹配规则中「单段路段起点」的定义。 - 不要在权重函数内修改
passerby属性:最短路径算法(如Dijkstra)寻路时会多次调用权重函数试探不同路径,中途修改节点属性会导致权重动态错乱,输出错误路径。行人数量更新必须等完整最短路径计算完成后再执行。 - 示例原始代码中节点
f未与任何节点连边,图不连通无法计算路径,需要根据实际拓扑补充连边。
完整可运行代码
import networkx as nx G = nx.Graph() # 初始化带passerby属性的节点 nodes = [ ('a', {'passerby': 1}), ('b', {'passerby': 2}), ('c', {'passerby': 3}), ('d', {'passerby': 3}), ('e', {'passerby': 2}), ('f', {'passerby': 1}) ] G.add_nodes_from(nodes) # 初始化边,补充e到f的连边保证图连通,可按实际拓扑调整 G.add_edges_from([ ('a', 'b'), ('a', 'c'), ('b', 'c'), ('b', 'd'), ('c', 'e'), ('b', 'e'), ('e', 'f') ]) def weight(u, v, edge_attr): # 路段通行成本等于起点u的当前行人数量,v和edge_attr为必填参数无需处理 return G.nodes[u]['passerby'] # 计算最短路径 route = nx.shortest_path(G, source='a', target='f', weight=weight) print("计算得到的最短路径:", route) # 路径计算完成后更新途经节点的行人数量 move_pedestrian_num = 1 # 本次移动的行人群体规模,可按需修改 # 起点为出发位置无需累加,从路径第二个节点开始更新 for node in route[1:]: G.nodes[node]['passerby'] += move_pedestrian_num # 验证更新结果 print("更新后各节点行人数量:") for n in G.nodes: print(f"节点{n}: {G.nodes[n]['passerby']}")
仿真扩展说明
如果是多批次行人连续仿真,每一批次严格按照「基于当前节点passerby值计算最短路径 -> 按路径更新途经节点passerby值」的流程循环即可,不要跨步骤穿插修改属性。
内容的提问来源于stack exchange,提问作者sroand
相关产品推荐
相关产品推荐

