-1

我是pyomo的新手。我正在尝试运行一个简单的最大化问题,但我不断收到此错误消息:Error retrieving component Pd[1]: The component has not been constructed.. 只有最后 5 个约束给了我这个问题,前三个约束工作正常。我在 IPython 控制台上使用这个命令来运行它!pyomo --solver-manager=neos --solver=cbc battpyomo.py battpyomo.dat

在数据文件上,我只定义了集合 T 和参数 p。

设置 T := 1 2 3 4 5 6 7 8 9;

参数:p:=
1 51.12
2 48.79
3 39.56
4 36.27
5 36.16
6 34.90
7 33.33
8 21.16
9 24.42;

这是 battbyomo.py 的代码:

from pyomo.environ import *

model = AbstractModel()

########Sets#########
#Hours
model.T = Set()

#########Parameters##########
#Price
model.p = Param(model.T,within=PositiveReals)
#Variable OM cost Discharge
model.VOMd = Param(initialize=15)
#Varaible OM cost Charge
model.VOMc = Param(initialize=10)
#State of Charge min
model.SOCmin = Param(initialize=5)
#State of charge max
model.SOCmax = Param(initialize=25)
#ESS efficiency
model.m = Param(initialize=0.99)
#Max discharge rate
model.Pdmax = Param(initialize=20)
#Max charge rate
model.Pcmax = Param(initialize=20)
#Initial State of Charge
model.SOCini = Param(initialize=25)

###########Variables##########
#Power discharged
model.Pd = Var(model.T, within=NonNegativeIntegers)
#Power charged
model.Pc= Var(model.T, within=NonNegativeIntegers)
#Charging Status
model.Uc = Var(model.T, within=NonNegativeIntegers)
#Discharging status
model.Ud = Var(model.T, within=NonNegativeIntegers)
#State of Charge
model.SOC = Var(model.T, within=NonNegativeIntegers)

#######Objective##########
def profit_rule(model):
    return sum(model.Pd[i]*model.p[i]-model.Pd[i]*model.VOMd-model.Pc[i]*model.p[i]-model.Pc[i]*model.VOMc for i in model.T)
model.profit = Objective(rule=profit_rule, sense = maximize)    

#######Constraints##########

def status_rule(model,i):
    return (model.Ud[i] + model.Uc[i] <= 1)
model.status = Constraint(model.T,rule=status_rule)

def Cmax_rule(model,i):
    return model.Pc[i] <= model.Pcmax*model.Uc[i]
model.Cmax = Constraint(model.T,rule=Cmax_rule)

def Dmax_rule(model,i):
    return model.Pd[i] <= model.Pdmax*model.Ud[i]
model.Dmax = Constraint(model.T,rule=Dmax_rule)

def Dlim_rule(module,i):
    return model.Pd[i] <= model.SOC[i] - model.SOCmin
model.Dlim = Constraint(model.T,rule=Dlim_rule)

def Clim_rule(module,i):
    return model.Pc[i] <= model.SOCmax-model.SOC[i]
model.Clim = Constraint(model.T,rule=Clim_rule)

def Smin_rule(module,i):
    return model.SOC[i] >= model.SOCmin
model.Smin = Constraint(model.T,rule=Smin_rule)

def Smax_rule(module,i):
    return model.SOC[i] <= model.SOCmax
model.Smax = Constraint(model.T,rule=Smax_rule)

def E_rule(module,i):
    if i == 1:
        return model.SOC[i] == model.SOCini + model.Pc[i]*model.m -model.Pd[i]
    else:
        return model.SOC[i] == model.SOC[i-1] + model.Pc[i]*model.m - model.Pd[i]
model.E = Constraint(model.T,rule=E_rule)
4

2 回答 2

3

在上面列出的一些约束中,规则中的参数是“模块”,当表达式中使用“模型”时,例如,

def Dlim_rule(module,i):
    return model.Pd[i] <= model.SOC[i] - model.SOCmin
model.Dlim = Constraint(model.T,rule=Dlim_rule)

规则和约束的定义应该是,

def Dlim_rule(model,i):
    return model.Pd[i] <= model.SOC[i] - model.SOCmin
model.Dlim = Constraint(model.T,rule=Dlim_rule)

顺便说一句,第一个参数(用于模型对象)可以任意命名。但是,参数的名称必须与规则中模型的使用相匹配。例如,这也是有效的,

def Dlim_rule(m,i):
    return m.Pd[i] <= m.SOC[i] - m.SOCmin
model.Dlim = Constraint(model.T,rule=Dlim_rule)
于 2016-10-04T15:51:39.840 回答
0

你不应该需要第一个“import pyomo”行。您应该需要的唯一导入行是“from pyomo.environ import *”。如果这不能解决您的问题,那么您应该发布您正在使用的数据文件(或它的简化版本)。似乎数据没有正确加载到 Pyomo 模型中。

于 2016-10-04T13:43:02.090 回答