Pyomo中如何将变量定义设为约束以简化目标函数?
解决思路
首先,你出错的核心原因是:Pyomo的变量(Var)不能用另一个变量作为索引,索引必须是Pyomo的集合(Set)类型。你用model.x(一个Var)去定义model.avg_Price的索引,完全不符合Pyomo的规则,才会抛出那个错误。
正确的做法是把avg_Price定义为按model.N索引的变量,再通过约束明确它的计算逻辑,具体步骤如下:
定义avg_Price变量
因为你需要的是每个n对应的平均价格,直接用model.N作为索引集合:model.avg_Price = Var(model.N, domain=NonNegativeReals)添加约束定义avg_Price的表达式
针对每个n,avg_Price[n]等于你原来目标函数里内层的双重求和结果,也就是所有属于model.M中各t对应的MP[t]集合里的i,计算(1/12)*model.c[i]*model.allocation[i,n]的总和。约束写法如下:def avg_price_rule(model, n): return model.avg_Price[n] == sum( (1/12)*model.c[i]*model.allocation[i,n] for t in model.M for i in model.MP[t] ) model.avg_price_constraint = Constraint(model.N, rule=avg_price_rule)简化目标函数
现在目标函数可以直接用avg_Price变量,写法变得非常简洁,调试难度大幅降低:expr += sum(model.avg_Price[n] * model.demand_n[n] for n in model.N)
这样调整后,不仅解决了索引错误的问题,还把复杂的嵌套求和拆解成了变量加约束的形式,逻辑更清晰,后续调试时可以单独查看每个avg_Price[n]的值,定位问题更方便。
内容的提问来源于stack exchange,提问作者BenBernke
相关产品推荐
相关产品推荐

