Pyomo调用CPLEX求解时如何禁止自动生成.sol解决方案文件
解决方案
核心问题原因
默认情况下Pyomo调用CPLEX的命令行接口时,会先生成临时的模型文件(.lp/.mps),再调用CPLEX命令行工具求解,生成.sol解文件,再读取解析结果,大量磁盘IO是你上千次运行耗时高的主要原因。
修改方法
1. 前置依赖安装
首先安装CPLEX Python API,版本需要和你本地安装的CPLEX求解器版本一致:
pip install cplex
2. 修改求解方法代码
调整你代码中的solve_instance方法,改用内存交互的CPLEX Python API,完全避免临时文件生成:
def solve_instance(self, solver, instance): # 指定solver_io为python,所有和CPLEX的交互都在内存中完成,不生成任何临时磁盘文件 opt = pyo.SolverFactory(solver, solver_io="python") # keepfiles显式设为False确保不保留临时文件,不需要求解日志可把tee改为False,能进一步提速 results = opt.solve(instance, tee=True, keepfiles=False) # 可选:添加求解状态检查,避免不可行/报错时取目标值异常 from pyomo.opt import SolverStatus, TerminationCondition if not (results.solver.status == SolverStatus.ok and results.solver.termination_condition == TerminationCondition.optimal): raise Exception(f"求解异常,状态:{results.solver.status},终止条件:{results.solver.termination_condition}") return results
修改后就不会再生成.sol格式的临时文件了。
额外优化建议(针对上千次批量运行)
- 如果所有segment的集合(FIELDS/SCENARIOS/PRODS/SUSTAINABILITY)结构一致,只是参数数值不同,不要每次循环都重新生成实例,只需要更新实例中可变参数的数值即可,能节省大量实例创建时间。
- 可使用
cplex_persistent持久化求解器,把求解器初始化和实例绑定放到循环外,不需要每次重建求解器、重新传递模型,运行效率能提升数倍。 - 如果只需要目标函数值,不需要变量的具体取值,可以不用把解加载到实例,直接从返回的results对象中提取目标值:
def get_OBJ_value(self, results): # 最大化问题最优解的上下界一致,直接取下界即可 return results['Problem'][0]['Lower bound']
内容的提问来源于stack exchange,提问作者user16830227
相关产品推荐
相关产品推荐

