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

Pyomo索引变量域设置求助:按索引指定整数/实数域

Pyomo动态设置变量域的正确实现

问题分析

你原代码存在两个关键错误:

  • 条件判断误用了赋值运算符=,正确的比较应该用==
  • 直接在domain参数中写三元表达式不可行,因为此时p未被定义,Pyomo无法针对每个索引元素动态匹配对应域

正确实现方式

方法1:字典映射索引到对应域

先创建字典,将每个索引元素映射到对应的变量域,再传递给Var的domain参数:

new_units_built_set = pyo.Set(initialize=list(params.Installable_units))

# 定义索引与变量域的映射关系
domain_map = {
    "GasPowerplant": pyo.NonNegativeIntegers,
    "batterystorage": pyo.NonNegativeReals
}

# 为每个索引元素匹配对应域
model.New_UnitsBuilt = pyo.Var(new_units_built_set, domain=lambda model, p: domain_map[p])

方法2:lambda表达式直接判断

如果索引元素仅包含这两类,也可以直接在lambda中完成条件判断:

new_units_built_set = pyo.Set(initialize=list(params.Installable_units))

model.New_UnitsBuilt = pyo.Var(
    new_units_built_set,
    domain=lambda model, p: pyo.NonNegativeIntegers if p == "GasPowerplant" else pyo.NonNegativeReals
)

注意事项

  • 确保params.Installable_units中的元素只有"GasPowerplant"和"batterystorage",若有其他元素,需在映射或判断逻辑中补充对应域,否则会触发报错
  • 引用NonNegativeReals时要加上pyo.前缀,与NonNegativeIntegers保持一致,避免未定义错误

内容的提问来源于stack exchange,提问作者Gerhard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:25:32