AnyLogic按计划统计资源利用率:洗车模型每10小时存储资源池数据方法
AnyLogic固定时间区间统计资源池利用率实现方案
1. 搭建数据存储载体
提前创建用于存储统计结果的数据集(DataSet),设置4个列分别对应:
- 时间区间起始值
- 时间区间结束值
- 资源池名称
- 区间平均利用率
如果需要直接导出到本地文件,可以额外添加Excel导出组件,绑定该数据集。
2. 配置周期触发事件
在Main代理中拖入Event组件,参数配置如下:
- 触发类型选择Cyclic(循环触发)
- 首次触发时间设为
10.0(单位和仿真时间单位统一为小时) - 循环周期设为
10.0
3. 编写统计逻辑
先创建一个元素类型为ResourcePool的集合targetPools,把所有需要统计的资源池全部加入该集合,避免后续重复编码。
在Event的触发动作栏写入以下代码:
// 计算当前统计区间的起止时间 double start = time() - 10; double end = time(); // 遍历所有目标资源池统计区间利用率 for (ResourcePool pool : targetPools) { // 调用AnyLogic原生方法获取指定时间区间的平均利用率(8.5及以上版本支持) double util = pool.utilization(start, end); // 将统计结果写入提前创建的数据集 statsDataSet.add(start, end, pool.getName(), util); } // 仿真运行到100小时结束时自动导出数据到本地 if (time() >= 100) { statsDataSet.exportToExcel("D:\\洗车仿真利用率统计.xlsx"); }
4. 低版本兼容方案
如果你使用的AnyLogic版本低于8.5,没有utilization(start, end)方法,可以通过累计工作时间差值计算区间利用率:
- 先在Main代理中添加一个HashMap变量
lastWorkTimeMap,变量类型写java.util.Map<ResourcePool, Double>,初始值设为new java.util.HashMap<>() - 将Event的触发动作替换为以下代码:
double start = time() - 10; double end = time(); for (ResourcePool pool : targetPools) { double currentWorkTime = pool.getUtilizationTotal(); double lastWorkTime = lastWorkTimeMap.getOrDefault(pool, 0d); // 区间利用率=区间内累计工作时长/区间长度 double util = (currentWorkTime - lastWorkTime) / 10; statsDataSet.add(start, end, pool.getName(), util); // 更新存储的累计工作时间 lastWorkTimeMap.put(pool, currentWorkTime); }
内容的提问来源于stack exchange,提问作者HARSH GOYAL
相关产品推荐
相关产品推荐

