如何编码由等式计算的参数Tij?是否需在param段定义?
Tij 实现方案
别直接用你写的那种Param形式定义,你搞混了不同建模组件的适用场景:
- 你写的
model.T=Param(model.i,model.j, within=PositiveReals)是用来存提前已知、不需要动态计算的固定输入参数的,而且你给的Tij计算规则是集合并集,结果是区间集合不是单个正实数,PositiveReals的域约束完全对不上。 - 如果Tij是不随优化决策变动的固定派生量:直接在定义完tn、tm、a、Tj这些前置基础集合/参数之后,按规则初始化就行,参考写法:
# 先完成基础量定义:model.i、model.j、tn、tm、a、model.Tj # 生成[tn, tm-a]区间集合 model.base_interval = RangeSet(tn, tm - a) # 按集合并集规则初始化Tij def init_tij(m, i_idx, j_idx): return m.base_interval.union(m.Tj[j_idx]) model.Tij = Set(model.i, model.j, initialize=init_tij) - 如果Tij是会随决策变量变动的量:它根本不属于参数范畴,要定义成
Var变量,再把你给出的计算规则转成对应约束,用Constraint类绑定等式关系,不能往Param上挂计算公式。
补个语法提醒:Pyomo里Param传索引维度用圆括号不是大括号,你原来写的大括号写法本身就不符合语法规范。
内容的提问来源于stack exchange,提问作者mary
相关产品推荐
相关产品推荐

