如何将时序多层多路有向GraphML文件导入NetLogo?
可行的GraphML到NetLogo导入方案
一、预处理GraphML文件(Python脚本)
NetLogo原生解析带复杂属性的时序GraphML容易出现解析偏差,先用Python提取结构化数据,转成NetLogo易读取的CSV格式:
import networkx as nx import pandas as pd # 读取时序GraphML文件 G = nx.read_graphml("your_temporal_graph.graphml") # 提取静止节点数据:节点ID + 所有属性 nodes_data = [] for node_id, attrs in G.nodes(data=True): node_row = {"node_id": node_id} node_row.update(attrs) nodes_data.append(node_row) pd.DataFrame(nodes_data).to_csv("static_nodes.csv", index=False) # 提取边与车辆关联数据:源节点、目标节点、veh_type、edgeID、时间戳等 edges_data = [] for u, v, attrs in G.edges(data=True): edge_row = {"source": u, "target": v} edge_row.update(attrs) edges_data.append(edge_row) pd.DataFrame(edges_data).to_csv("edges_with_vehicles.csv", index=False)
二、NetLogo导入实现
1. 定义核心breed与全局变量
; 静止节点海龟breed breed [static-nodes static-node] ; 移动车辆海龟breed breed [vehicles vehicle] ; 两种有向链接breed(对应veh_type的两类) directed-link-breed [car-links car-link] directed-link-breed [truck-links truck-link] ; 存储节点ID到海龟的映射,用于快速关联边 globals [node-id-map]
2. 导入静止节点
to import-static-nodes set node-id-map make-dictionary file-open "static_nodes.csv" ; 跳过CSV表头 let header file-read-line while [not file-at-end?] [ let line file-read-line let parts split line "," let node-id item 0 parts ; 创建静止节点,若GraphML含坐标属性,可替换随机布局为对应属性值 create-static-nodes 1 [ set xcor random-xcor set ycor random-ycor set label node-id dict-put node-id-map node-id self ] ] file-close end
3. 导入边与对应车辆海龟
to import-edges-and-vehicles file-open "edges_with_vehicles.csv" let header file-read-line while [not file-at-end?] [ let line file-read-line let parts split line "," let source-id item 0 parts let target-id item 1 parts let veh-type item 2 parts ; 根据实际CSV列索引调整 let edge-id item 3 parts ; 根据实际CSV列索引调整 ; 获取源、目标节点的海龟实例 let source-turtle dict-get node-id-map source-id let target-turtle dict-get node-id-map target-id ; 根据veh_type创建对应有向链接 if veh-type = "car" [ create-car-link-from source-turtle to target-turtle [ set label edge-id ] ] if veh-type = "truck" [ create-truck-link-from source-turtle to target-turtle [ set label edge-id ] ] ; 创建对应edgeID的车辆海龟,默认放在链接中间位置 create-vehicles 1 [ set xcor ( [xcor] of source-turtle + [xcor] of target-turtle ) / 2 set ycor ( [ycor] of source-turtle + [ycor] of target-turtle ) / 2 set label edge-id ] ] file-close end
4. 时序切换逻辑(可选)
针对时序图需求,可添加时间戳控制逻辑,切换不同时间步的图结构:
globals [current-timestamp] to setup-temporal-graph import-static-nodes set current-timestamp 0 end to go-to-timestamp [target-ts] set current-timestamp target-ts ; 清除当前时间步的链接与车辆 ask vehicles [ die ] ask car-links [ die ] ask truck-links [ die ] file-open "edges_with_vehicles.csv" let header file-read-line while [not file-at-end?] [ let line file-read-line let parts split line "," let ts item 4 parts ; 假设时间戳在CSV第5列,按需调整 if ts = word target-ts [ ; 重复边与车辆的创建逻辑 let source-id item 0 parts let target-id item 1 parts let veh-type item 2 parts let edge-id item 3 parts let source-turtle dict-get node-id-map source-id let target-turtle dict-get node-id-map target-id if veh-type = "car" [ create-car-link-from source-turtle to target-turtle [ set label edge-id ] ] if veh-type = "truck" [ create-truck-link-from source-turtle to target-turtle [ set label edge-id ] ] create-vehicles 1 [ set xcor ( [xcor] of source-turtle + [xcor] of target-turtle ) / 2 set ycor ( [ycor] of source-turtle + [ycor] of target-turtle ) / 2 set label edge-id ] ] ] file-close end
三、关键注意事项
- 调整CSV列索引:需根据Python导出的CSV表头,修改NetLogo代码中
item的索引值,确保属性匹配。 - 节点位置配置:若GraphML含节点坐标属性,直接替换随机布局代码为对应属性读取逻辑即可。
- 多层图适配:若原GraphML含多层属性,预处理时需提取
layer字段,导入时可通过颜色、标签区分不同层的元素。
内容的提问来源于stack exchange,提问作者pandora
相关产品推荐
相关产品推荐

