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
相关产品推荐
相关产品推荐

