PYOMO: LP 热储存优化问题,我想定义一个离散浮点数的变量域
我正在优化一个区域供热网络的热量调度模型。在这个模型中,我有不同的热源,它们生产热量的价格各不相同。问题在于,联合热电厂(CHP)生产热量的价格是根据它的热负荷来决定的。
我想把这种依赖关系纳入优化过程中。具体来说,我希望将CHP的热负荷(model.CHP[t])和相应的价格($model.price_CHP[t]$)限制在一些离散的点上。在每个时间步骤中,我有预先定义的数组,里面包含不同的热负荷点($chp.Line_PQ$)和它们对应的价格($chp.Price_PQ[0]$)。
以下是我在Pyomo模型中使用的相关变量和参数:
变量
model.CHP = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
model.EB = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
model.HP = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
model.BO = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
model.price_CHP = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)```
model.CHP = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
model.EB = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
model.HP = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
model.BO = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
model.price_CHP = pyomo.Var(model.T, domain=pyomo.NonNegativeReals)
参数
model.price_EB = pyomo.Param(model.T, initialize=Day_price_EB)
model.price_HP = pyomo.Param(model.T, initialize=Day_price_HP)
model.price_BO = pyomo.Param(model.T, initialize=Day_price_BO)
这是我使用的目标函数:
def objective_func(model):
return sum([model.CHP[t]*model.price_CHP[t] + model.HP[t]*model.price_HP[t] + model.EB[t]*model.price_EB[t] + model.BO[t]*model.price_BO[t] for t in model.T])
对于约束条件,我尝试这样实现:
discrete_points_chp = chp.Line_PQ
discrete_prices_chp = chp.Price_PQ[0]
def constrain_chp_to_discrete_points(model, t):
return model.CHP[t] in set(discrete_points_chp)
model.constr_chp_discrete = pyomo.Constraint(model.T, rule=constrain_chp_to_discrete_points)
def constrain_price_chp_to_discrete_points(model, t):
return model.price_CHP[t] in set(discrete_prices_chp)
但是,当我运行优化时,遇到了一些关于这些约束的问题。有人能指导我如何在Pyomo中正确实现这些约束吗?
所以我想用一个集合来定义我的变量的离散选项,但这似乎不太奏效……
2 个回答
1
Erwin的方法对我有效,我在实现过程中遇到了一些困难,所以我想分享我的例子。我使用了一个叫做y(t,n)的二进制变量,这个变量会在我所有的时间点、工作负载点和相应的价格之间移动。
代码:
model.y = pyomo.Var(model.T, model.n , domain=pyomo.Binary)
def exactly_one_rule(model, t):
return sum(model.y[t, i] for i in model.n) == 1
def compute_Load_rule(model,t):
return model.CHP_Load[t] == sum(model.set_Loads[i+1] * model.y[t,i] for i in range(n))
model.compute_load_constraint = pyomo.Constraint(model.T, rule=compute_Load_rule)
model.compute_load_constraint.pprint()
# Compute x as the sum of p[i] * y[i]
def compute_Price_rule(model,t):
return model.Price_CHP[t] == sum(model.Price_CHP_Set[i+1] * model.y[t,i] for i in range(n))
model.compute_price_constraint = pyomo.Constraint(model.T, rule=compute_Price_rule)
model.compute_price_constraint.pprint()
如果你需要进一步的帮助,随时可以联系我!
0
这个限制条件
x ∈ {p[0],p[1],...p[n-1]} (p[i] are constants)
可以这样实现:
x = sum(p[i]*y[i])
sum(y[i]) = 1
y[i] ∈ {0,1} (binary variable)