如何自动多次运行CPLEX(OPL)求解同一模型并计算平均运行时间?
问题分析与解决方法
原代码存在两个核心问题:
- 重复累加了两次同一求解时间,导致最终平均值计算错误。
- 每次循环调用
thisOplModel.generate()重复生成模型,且CPLEX在第一次求解后会保留解状态,后续调用solve()会直接返回已有最优解,不会重新执行完整求解流程,因此看起来只完成了一次求解。
修正后的代码
main { var totalRT = 0; // 仅生成一次模型(模型和数据固定,无需重复生成) thisOplModel.generate(); var model = thisOplModel.model; for (var i = 0; i < 10; i++) { // 每次创建新的CPLEX实例,确保从头开始求解 var cplex = new IloCplex(model); cplex.solve(); var currentRT = cplex.getSolvedTime(); totalRT += currentRT; writeln("第", i+1, "次求解时间: ", currentRT); // 销毁CPLEX实例,释放资源 cplex.end(); } var avgRT = totalRT / 10; writeln("平均求解时间: ", avgRT); }
关键修改说明
- 将
thisOplModel.generate()移到循环外部:模型和数据固定,只需生成一次,避免重复生成带来的内存开销和状态干扰。 - 每次循环创建新的
IloCplex实例:确保每次求解都是独立的全新流程,不受之前求解状态的影响,保证10次求解都完整执行。 - 修正求解时间累加逻辑:仅累加一次当前求解时间,避免计算错误。
- 每次求解后销毁CPLEX实例:及时释放资源,避免内存占用过高。
内容的提问来源于stack exchange,提问作者Beng Beng
相关产品推荐
相关产品推荐

