Pyomo中CHP机组热负荷与对应价格离散约束实现问题
问题
我正在构建区域供热(DH)网络的热调度优化模型,模型包含多种不同供热成本的热源设备。其中热电联产(CHP)机组的供热价格与其热负荷相关,需将这一依赖关系纳入优化:约束CHP热负荷(model.CHP[t])及对应价格(model.price_CHP[t])取预定义离散点(chp.Line_PQ与chp.Price_PQ[0])。
模型相关变量、参数及目标函数如下:
Variables
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)
Parameters
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中正确实现这类约束?
解决方案
Pyomo不支持直接用in set的方式定义约束,这类离散选择且变量间存在关联的需求,需要引入二进制选择变量来实现,具体步骤如下:
定义离散点集合与参数
先将CHP的负荷-价格离散点整理为可索引的集合和参数,方便后续约束引用:# 假设离散负荷和价格是一一对应的,长度相同 model.CHP_Discrete = pyomo.Set(initialize=range(len(discrete_points_chp))) # 把离散负荷值定义为参数 model.chp_load_points = pyomo.Param(model.CHP_Discrete, initialize={i: discrete_points_chp[i] for i in model.CHP_Discrete}) # 把离散价格值定义为参数 model.chp_price_points = pyomo.Param(model.CHP_Discrete, initialize={i: discrete_prices_chp[i] for i in model.CHP_Discrete})引入二进制选择变量
定义二进制变量model.chp_select[t, i],表示时刻t是否选择第i组离散点:model.chp_select = pyomo.Var(model.T, model.CHP_Discrete, domain=pyomo.Binary)添加核心约束
- 每个时刻只能选择一组离散点:
def chp_single_select_rule(model, t): return sum(model.chp_select[t, i] for i in model.CHP_Discrete) == 1 model.constr_chp_single_select = pyomo.Constraint(model.T, rule=chp_single_select_rule) - 关联CHP负荷变量与选中的离散点:
def chp_load_match_rule(model, t): return model.CHP[t] == sum(model.chp_select[t, i] * model.chp_load_points[i] for i in model.CHP_Discrete) model.constr_chp_load_match = pyomo.Constraint(model.T, rule=chp_load_match_rule) - 关联CHP价格变量与选中的离散点:
def chp_price_match_rule(model, t): return model.price_CHP[t] == sum(model.chp_select[t, i] * model.chp_price_points[i] for i in model.CHP_Discrete) model.constr_chp_price_match = pyomo.Constraint(model.T, rule=chp_price_match_rule)
- 每个时刻只能选择一组离散点:
优化目标函数(可选)
若使用的求解器不支持非线性优化,可将目标函数中的model.CHP[t] * model.price_CHP[t]替换为离散点乘积的求和,避免连续变量相乘的非线性问题:def objective_func(model): chp_cost = sum(sum(model.chp_select[t, i] * model.chp_load_points[i] * model.chp_price_points[i] for i in model.CHP_Discrete) for t in model.T) other_costs = sum(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) return chp_cost + other_costs
通过以上修改,模型可正确约束CHP的负荷和价格只能从预定义离散点中选择,且两者始终一一对应。
内容的提问来源于stack exchange,提问作者PVM
相关产品推荐
相关产品推荐

