运行main程序时如何在问题浏览器与解决方案窗口获取模型求解结果
CPLEX Optimization Studio main流程运行模型无法在Problem Browser/Solutions Window展示完整数据的配置方法
自定义main控制流接管模型执行逻辑后,IDE默认不会自动采集模型结构、求解中间数据,仅捕获脚本标准输出,按以下步骤配置即可恢复完整展示能力:
- 单模型通过main运行时,显式将模型实例绑定到当前执行上下文
不要在main中创建独立的匿名模型实例运行,要将实例赋值给当前作用域的thisOplModel,IDE会自动识别该实例的结构、求解结果,参考代码:main { // 初始化模型定义、求解器 const modelDef = thisOplModel.modelDefinition; const runModel = new IloOplModel(modelDef, cplex); // 此处编写自定义数据加载、参数调整逻辑 runModel.generate(); // 绑定实例到上下文,供IDE采集数据 thisOplModel = runModel; if (cplex.solve()) { // 自定义求解后业务逻辑 } // 等待IDE完成数据采集后再释放资源 runModel.end(); } - 多模型通过main调度运行时,主动调用发布接口推送每个模型的结果
多模型场景下无法通过绑定单个thisOplModel实现全展示,需要在每个模型求解完成后,调用内置的IloOpl.publishSolution()方法将模型数据推送到UI面板,注意要等推送完成后再销毁模型实例,参考代码:main { // 初始化并求解第一个模型 const m1 = new IloOplModel(m1Def, new IloCplex()); m1.generate(); m1.cplex.solve(); // 推送第一个模型数据到面板,自定义标签用于区分不同模型结果 IloOpl.publishSolution(m1, "模型1-排产结果"); // 初始化并求解第二个模型 const m2 = new IloOplModel(m2Def, new IloCplex()); m2.generate(); m2.cplex.solve(); IloOpl.publishSolution(m2, "模型2-路径优化结果"); // 所有模型结果推送完成后统一释放资源 m1.end(); m2.end(); } - 检查IDE运行配置项
- 打开对应运行配置的Execution标签页,取消勾选Run in headless mode,无头运行模式会禁用所有UI数据采集能力,仅输出脚本日志
- 打开Problem Browser面板的右上角设置菜单,勾选Show elements from main flow published models,允许面板加载main流程中主动发布的模型数据
- 结构定义规范注意
所有决策变量、约束、目标函数的定义必须放在.mod格式的模型文件中,main脚本中仅编写流程控制、数据赋值、求解调度逻辑,不要在main的闭包作用域内动态定义模型结构,否则IDE无法完成静态解析,会导致面板展示内容缺失。
低版本OPL存在IDE数据采集延迟问题,如果配置完成后仍有部分数据缺失,可以在调用
publishSolution或完成求解后,加java.lang.Thread.sleep(100)的短延迟再销毁模型实例,避免实例提前释放导致数据读取失败。
内容的提问来源于stack exchange,提问作者MO MO MA
相关产品推荐
相关产品推荐

