使用instant veins-4.7.1时如何获取所有或指定节点的指标均值
Veins 4.7.1 聚合统计节点指标平均值操作方法
以下两种方案可适配不同使用场景:
方法1:仿真运行阶段内置聚合统计(推荐,适合固定统计规则的场景)
直接在应用逻辑中加入聚合逻辑,仿真结束后会直接输出平均值结果:
- 首先在应用层模块的头文件中声明聚合统计变量,可使用OMNeT++自带的
cAverage类做全局统计,也可自定义容器存储指定节点的指标数据:// 示例:头文件中声明统计变量 cAverage globalEedAvg; // 存储所有节点端到端延迟的聚合统计 std::vector<double> targetNodeEedList; // 存储指定节点的延迟值 int targetNodeIds[] = {2,4,6}; // 按需修改为要统计的指定节点ID - 在你计算单节点端到端延迟的代码段(一般是
handleMessage函数中处理接收数据包的位置),添加聚合统计逻辑:// 假设你已经计算得到当前数据包的端到端延迟为endToEndDelay // 全局所有节点聚合 globalEedAvg.collect(endToEndDelay); // 指定节点聚合 int curNodeId = pk->getSenderModuleId(); // 按需替换为你需要匹配的节点ID字段 for (int id : targetNodeIds) { if (curNodeId == id) { targetNodeEedList.push_back(endToEndDelay); break; } } - 在应用层的
finish()函数中输出最终聚合结果,结果会自动写入仿真的.sca结果文件:recordScalar("全局平均端到端延迟", globalEedAvg.getMean()); if (!targetNodeEedList.empty()) { double targetAvg = std::accumulate(targetNodeEedList.begin(), targetNodeEedList.end(), 0.0) / targetNodeEedList.size(); recordScalar("指定节点平均端到端延迟", targetAvg); }
注意:如果是分布式并行运行仿真,需要使用OMNeT++的跨进程全局统计机制,避免统计变量仅在单个进程生效
方法2:仿真结束后处理已有结果文件
如果已经完成仿真无需重新运行,可直接解析生成的结果文件计算平均值:
- Veins 4.7.1仿真结束后默认生成
.sca(标量统计结果)和.vec(时序向量结果)两类文件,可使用OMNeT++自带的opp_scavetool工具批量提取指定指标:
示例命令(提取所有节点端到端延迟标量值导出为csv):
导出csv后可自行过滤指定节点ID的对应数据,计算平均值即可。如果需要处理opp_scavetool export -f 'name("end-to-end delay")' -F csv 你的仿真结果文件名.sca > eed_all.csv.vec格式的时序指标,调整命令中的文件名即可,处理逻辑一致。 - 若使用OMNeT++ IDE操作,可直接在结果分析的Analysis界面添加Filter规则,勾选需要统计的节点范围,添加
Mean统计函数,IDE会自动计算对应平均值。
内容的提问来源于stack exchange,提问作者Dalia Adly
相关产品推荐
相关产品推荐

