You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:21:27