You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的方式定义约束,这类离散选择且变量间存在关联的需求,需要引入二进制选择变量来实现,具体步骤如下:

  1. 定义离散点集合与参数
    先将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})
    
  2. 引入二进制选择变量
    定义二进制变量model.chp_select[t, i],表示时刻t是否选择第i组离散点:

    model.chp_select = pyomo.Var(model.T, model.CHP_Discrete, domain=pyomo.Binary)
    
  3. 添加核心约束

    • 每个时刻只能选择一组离散点:
      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)
      
  4. 优化目标函数(可选)
    若使用的求解器不支持非线性优化,可将目标函数中的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:03:17