Pyomo中为约束对偶变量设上限遇KeyError,求技术解决方案
Pyomo对偶变量上限约束报错解决方案
错误原因
- 模型构建阶段直接访问
model.dual:model.dual是求解器返回对偶变量后才会填充的ComponentMap,在定义约束规则时(模型未求解),约束还未被求解器处理,对偶变量不存在,因此触发KeyError。 - 约束语法错误:直接用
<符号写约束不符合Pyomo规范,Pyomo约束需通过变量和表达式定义,不能直接引用model.dual。
正确实现方案
通过显式定义变量绑定对偶变量,再对该变量施加约束,步骤如下:
- 定义与约束索引匹配的变量,用于代表对偶变量
- 通过
Suffix将新变量与目标约束的对偶变量绑定 - 给新变量添加上限约束
修正后代码示例
import pyomo.environ as pyo # 创建模型 model = pyo.ConcreteModel() # 定义时间索引集(示例) model.h = pyo.RangeSet(0, 23) # 定义决策变量与参数(根据你的模型调整) model.generation = pyo.Var(model.h, domain=pyo.NonNegativeReals) model.demand = pyo.Param(model.h, initialize=100) # 1. 定义原充足性约束 def adequacy_constraint_rule(model, h): return model.generation[h] >= model.demand[h] model.adequacy_constraint = pyo.Constraint(model.h, rule=adequacy_constraint_rule) # 2. 定义代表对偶变量的新变量 model.dual_var = pyo.Var(model.h, domain=pyo.NonNegativeReals) # 3. 配置Suffix绑定对偶变量 model.dual = pyo.Suffix(direction=pyo.Suffix.IMPORT_EXPORT) for h in model.h: model.dual[model.adequacy_constraint[h]] = model.dual_var[h] # 4. 添加对偶变量上限约束 def voll_constraint_rule(model, h): return model.dual_var[h] <= 1e9 model.voll_constraint = pyo.Constraint(model.h, rule=voll_constraint_rule)
说明
dual_var是显式变量,求解器会通过Suffix将约束的对偶值赋值给它,我们可直接对其施加约束。- 确保使用支持对偶变量输出的求解器(如CBC、Gurobi),求解后
model.dual_var[h]会等于对应约束的对偶变量值。
内容的提问来源于stack exchange,提问作者Maryam Kadkhodaie
相关产品推荐
相关产品推荐

