AnyLogic个人学习版如何导出模型带时间戳输出作为另一模型输入
AnyLogic拆分模型间带时间戳数据的导出导入方法
流程A模型(上游)数据导出操作
- 先明确需要传递的实体字段,至少包含仿真时间戳、实体唯一标识、业务属性(如加工状态、类型、优先级等)三类核心信息。
- 推荐使用CSV格式存储导出数据,无需额外依赖。你可以在流程A的最终Sink块的「On enter」触发逻辑中写入数据,提前在模型中创建
CSVWriter对象并初始化表头,示例写入逻辑如下:
// outputWriter为提前创建的CSVWriter实例,需配置好文件输出路径 outputWriter.writeLine( getEngine().time(), // 输出当前事件对应的仿真时间戳 agent.id, // 实体唯一ID agent.productType, // 自定义业务属性,按需调整 agent.priority // 其他需要传递的参数 );
- 流程A仿真结束时调用
outputWriter.close()关闭文件流,避免数据丢失。如果仿真运行时间长,也可以配置每写入1000条自动调用outputWriter.flush()刷入磁盘。
流程B模型(下游)数据导入操作
- 将流程A导出的CSV文件放入流程B模型的
resources文件夹下,确保模型运行时可以直接读取。 - 采用时间匹配的方式驱动实体生成,逻辑如下:
- 模型启动阶段,用
CSVReader一次性读取所有CSV数据存入自定义的ArrayList集合,按时间戳字段做升序排序。 - 维护一个全局读取指针,初始值为0,创建一个动态事件,每次触发时判断当前仿真时间是否等于指针指向数据的时间戳:如果匹配,就按数据的属性参数生成对应实体,送入流程B的起始Source块,指针加1后再触发下一次动态事件;如果不匹配,就将动态事件的下次触发时间设置为指针指向数据的时间戳。
- 模型启动阶段,用
- 示例启动读取逻辑如下:
// 提前定义实体数据存储类InputData,inputReader为提前创建的CSVReader实例 ArrayList<InputData> inputList = new ArrayList<>(); while (inputReader.hasNextLine()) { InputData row = new InputData(); row.timestamp = inputReader.readDouble(); row.entityId = inputReader.readInt(); row.productType = inputReader.readString(); // 其余字段赋值 inputList.add(row); } // 按时间戳升序排序,避免上游导出数据时序混乱 Collections.sort(inputList, (a, b) -> Double.compare(a.timestamp, b.timestamp));
注意:两个拆分模型的仿真时间单位必须完全一致,若使用日历时间作为基准,需要统一时间转换规则,避免时序错位。
内容的提问来源于stack exchange,提问作者Francisco Marques
相关产品推荐
相关产品推荐

