PYOMO: LP 热储存优化问题,我想定义一个离散浮点数的变量域

-3 投票
2 回答
59 浏览
提问于 2025-04-12 17:12

我正在优化一个区域供热网络的热量调度模型。在这个模型中,我有不同的热源,它们生产热量的价格各不相同。问题在于,联合热电厂(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)

撰写回答