AnyLogic Cloud参数变异实验替代方案开发技术问询
AnyLogic Cloud 参数变异实验替代实现方案
问题1:循环代码的位置与语法
循环逻辑**必须写在Simulation Page的按钮点击事件(onClick)**中,因为需要用户主动触发批次仿真,而非页面加载时自动执行。
具体语法示例(基于Java):
首先在Simulation Page中定义结果存储结构,然后在按钮点击事件里实现循环调用主模型:
// Simulation Page内定义结果存储类 class SimResult { Dataset data; double numResult; String strResult; SimResult(Dataset d, double n, String s) { data = d; numResult = n; strResult = s; } } // 全局变量存储所有仿真结果 List<SimResult> allResults = new ArrayList<>(); // 按钮的onClick事件代码 allResults.clear(); // 定义要测试的参数组合(可根据需求动态生成) List<Object[]> paramList = Arrays.asList( new Object[]{"场景A", 0.3}, new Object[]{"场景B", 0.7}, new Object[]{"场景C", 1.0} ); // 循环执行每个参数组合 for (Object[] params : paramList) { String inputStr = (String) params[0]; double inputDouble = (double) params[1]; // 创建主模型实例 MainModel mainModel = new MainModel(); // 隐藏主模型窗口 mainModel.setVisible(false); // 传入参数(主模型需提前定义公共变量) mainModel.inputStr = inputStr; mainModel.inputDouble = inputDouble; // 运行仿真(阻塞式,确保顺序执行) mainModel.runSimulation(); // 收集输出结果(主模型需提前定义公共输出变量) Dataset outputData = mainModel.outputDataset; double outputNum = mainModel.outputDouble; String outputStr = mainModel.outputString; // 存入结果集合 allResults.add(new SimResult(outputData, outputNum, outputStr)); // 释放模型资源,避免内存泄漏 mainModel.dispose(); } // 结果展示:将allResults中的数据填充到Simulation Page的表格、图表等组件 // 示例:填充表格 resultTable.clearRows(); for (SimResult res : allResults) { resultTable.addRow(res.strResult, res.numResult, res.data.getRowCount()); }
问题2:隐藏主模型窗口并顺序运行
在创建主模型实例后,调用mainModel.setVisible(false)即可完全隐藏主模型窗口。同时,runSimulation()方法是阻塞式的——它会等待当前仿真完全结束后才执行下一次循环,天然满足顺序运行的需求,用户只需等待批次完成即可。
对应需求的具体实现
a. 不展示主模型
除了上述setVisible(false)的设置,还可以在主模型的onStartup事件中添加getEngine().setVisible(false),双重确保窗口不会弹出。
b. 点击按钮后顺序运行
如上述代码所示,循环写在按钮点击事件中,runSimulation()的阻塞特性会保证仿真按顺序执行,用户点击按钮后只需等待所有仿真完成即可。
c. 传入字符串与double参数
在主模型中定义公共变量:
// 主模型中的公共输入变量 public String inputStr; public double inputDouble;
在Simulation Page的循环中直接为这些变量赋值即可完成参数传递。
d. 收集Dataset、double与字符串输出
同样在主模型中定义公共输出变量,并在仿真结束时赋值:
// 主模型中的公共输出变量 public Dataset outputDataset; public double outputDouble; public String outputString; // 主模型的onEnd事件(仿真结束时触发) public void onEnd() { // 替换为你的仿真逻辑计算结果 outputDataset = yourGeneratedDataset; outputDouble = yourCalculatedValue; outputString = yourResultLabel; }
在Simulation Page的循环中,仿真运行完成后直接读取这些变量即可收集结果。
补充:AnyLogic Cloud 参数变异实验上传技巧
目前AnyLogic Cloud确实不支持直接上传Parameter Variation实验,但可以通过以下方式间接实现:
- 将参数变异的参数列表存入主模型的Dataset中,在主模型启动时自动循环执行所有参数组合,结果存入全局Dataset,最后在Simulation Page展示。
- 使用AnyLogic Cloud的Batch Run功能:上传通用仿真模型后,在Cloud控制台配置参数矩阵,批量运行并汇总结果(需确保模型支持从Cloud接收参数输入)。
内容的提问来源于stack exchange,提问作者Hemant_Bansal
相关产品推荐
相关产品推荐

