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

Pyomo中为约束对偶变量设上限遇KeyError,求技术解决方案

Pyomo对偶变量上限约束报错解决方案

错误原因

  • 模型构建阶段直接访问model.dual:model.dual是求解器返回对偶变量后才会填充的ComponentMap,在定义约束规则时(模型未求解),约束还未被求解器处理,对偶变量不存在,因此触发KeyError。
  • 约束语法错误:直接用<符号写约束不符合Pyomo规范,Pyomo约束需通过变量和表达式定义,不能直接引用model.dual。

正确实现方案

通过显式定义变量绑定对偶变量,再对该变量施加约束,步骤如下:

  1. 定义与约束索引匹配的变量,用于代表对偶变量
  2. 通过Suffix将新变量与目标约束的对偶变量绑定
  3. 给新变量添加上限约束

修正后代码示例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:18:20