Pyomo通过NEOS调用CPLEX无法获取MILP对偶变量求助
NEOS+CPLEX无法获取约束对偶变量的解决方法
问题场景
此前用CBC求解器时,通过定义model.dual = Suffix(direction=Suffix.IMPORT_EXPORT)可正常获取约束的对偶变量,但切换为NEOS作为SolverManager调用CPLEX后,无法读取对偶变量。相关代码如下:
model.balance = Constraint(model.N, model.T, rule=balance_rule) model.dual = Suffix(direction=Suffix.IMPORT_EXPORT) solver_manager = SolverManagerFactory('neos') results= solver_manager.solve(model, solver = "cplex") objective_value = model.obj() lmp=0 for n in model.N: for t in model.T: if t > 1: lmp += d[n-1,t-1]*model.dual[model.balance[n,t]]
解决方案
问题源于NEOS远程求解的特性与CPLEX的默认配置,按以下步骤修改即可解决:
- 给CPLEX添加参数,强制输出对偶变量
NEOS上的CPLEX默认可能执行对偶缩减或不输出对偶信息,需通过options参数传递配置,确保保留并返回对偶变量:
cplex_options = { "dualreductions": "0", # 禁用对偶缩减,避免对偶变量被丢弃 "write.dual": "1" # 明确要求输出对偶变量 }
求解后加载结果到本地模型
NEOS是远程求解,结果不会自动同步到本地模型,必须调用results.load(model)将求解数据(包括对偶变量)加载到模型中,否则model.dual会是空值。修改后的完整代码
from pyomo.environ import SolverStatus, TerminationCondition model.balance = Constraint(model.N, model.T, rule=balance_rule) model.dual = Suffix(direction=Suffix.IMPORT_EXPORT) # 配置CPLEX参数 cplex_options = { "dualreductions": "0", "write.dual": "1" } solver_manager = SolverManagerFactory('neos') results = solver_manager.solve(model, solver="cplex", options=cplex_options) # 先检查求解是否成功 if results.solver.status == SolverStatus.ok and results.solver.termination_condition == TerminationCondition.optimal: # 加载结果到模型 results.load(model) objective_value = model.obj() lmp = 0 for n in model.N: for t in model.T: if t > 1: lmp += d[n-1, t-1] * model.dual[model.balance[n, t]] else: print(f"求解终止原因:{results.solver.termination_condition}")
额外注意事项
- 确认NEOS平台上的CPLEX版本支持上述参数,若版本较低,可能需要调整参数名称。
- 如果部分约束的对偶变量仍为空,检查这些约束是否被CPLEX判定为冗余或自动松弛,可通过添加约束名称或调整模型避免冗余。
内容的提问来源于stack exchange,提问作者hmmauryc
相关产品推荐
相关产品推荐

