Pyomo添加约束时报Cannot iterate over AbstractOrderedScalarSet错误求解
Pyomo运行报错修复方案
错误原因
- 未正确实例化ConcreteModel:你写的
seq=pe.ConcreteModel是将ConcreteModel类本身赋值给了变量seq,而非创建具体模型实例,导致后续挂载的集合、参数都是未构造的抽象组件,遍历的时候触发报错,正确写法是加括号完成实例化seq = pe.ConcreteModel() - 目标函数调用缺少前缀:直接写
Objective会报未定义错误,需补充pyomo.environ前缀改成pe.Objective - 缺失参数定义:目标函数中用到的
C_fuel、rho_heat两个参数未提前声明初始化,需补充这两个参数的定义和测试值保证程序正常运行。
修正后完整代码
import pandas as pd import pyomo.environ as pe import pyomo.opt as po #DATA T=3 CH=2 time = ['t{0}'.format(t+1) for t in range(T)] CHP=['CHP{0}'.format(s+1) for s in range(CH)] #Technical characteristic heat_maxprod = {'CHP1': 250,'CHP2': 250} #Only for CHPS # 补充缺失的参数测试值 C_fuel = {'CHP1': 10, 'CHP2': 12} rho_heat = {'CHP1': 0.9, 'CHP2': 0.85} #MODEL 加括号完成实例化 seq=pe.ConcreteModel() ### SETS seq.CHP = pe.Set(initialize = CHP) seq.T = pe.Set(initialize = time) ### PARAMETERS seq.heat_maxprod = pe.Param(seq.CHP, initialize = heat_maxprod) #Max heat production # 注册新增的两个参数到模型 seq.C_fuel = pe.Param(seq.CHP, initialize = C_fuel) seq.rho_heat = pe.Param(seq.CHP, initialize = rho_heat) ### VARIABLES seq.q_DA=pe.Var(seq.CHP, seq.T, domain=pe.Reals) ### CONSTRAINTS ##Maximum and Minimum Heat Production seq.Heat_DA1 = pe.ConstraintList() for t in seq.T: for s in seq.CHP: seq.Heat_DA1.add( 0 <= seq.q_DA[s,t]) seq.Heat_DA2 = pe.ConstraintList() for t in seq.T: for s in seq.CHP: seq.Heat_DA2.add( seq.q_DA[s,t] <= seq.heat_maxprod[s]) ### OBJECTIVE 补充pe前缀 seq.obj=pe.Objective(expr=sum( seq.C_fuel[s]*(seq.rho_heat[s]*seq.q_DA[s,t]) for t in seq.T for s in seq.CHP))
修正后的代码可以正常完成模型构造,不会再抛出你遇到的初始化相关错误。
内容的提问来源于stack exchange,提问作者errenmike1806
相关产品推荐
相关产品推荐

