You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:45:01