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

Pyomo GDP时间序列数组析取实现报错及用法咨询

Pyomo GDP光伏供电设备模型问题解决

报错原因及解决

你遇到的LP求解器无法处理pyomo.gdp.disjunct.Disjunct的问题,本质是LP求解器仅支持线性规划问题,而GDP模型包含析取逻辑,属于混合整数规划范畴。必须先通过Pyomo的GDP转换工具,将析取结构转换为MILP(混合整数线性规划)形式,再用支持MILP的求解器(如CBC、Gurobi、CPLEX)求解。

常用转换方法:

  • BigM转换:TransformationFactory('gdp.bigm'),适配绝大多数场景
  • Hull转换:TransformationFactory('gdp.hull'),生成更紧凑的约束,但计算量可能更大

约束放置原则

通用约束是否放入析取,取决于约束是否仅在特定状态下生效:

  • ON状态专属约束:比如设备运行时功率≥PV峰值的50%、功率≤当前PV出力,必须放入ON对应的Disjunct中
  • OFF状态专属约束:设备停机时功率=0,放入OFF对应的Disjunct中
  • 全局约束/目标函数:比如目标最大化总功率使用,属于全局逻辑,无需放入析取结构

修改后的完整代码

from pyomo.environ import ConcreteModel, Var, Objective, maximize, NonNegativeReals, Constraint, TransformationFactory, SolverFactory
from pyomo.gdp import Disjunct, Disjunction
import numpy as np

# 构建模型
model = ConcreteModel()

# 时间序列参数(示例:10个时段,标幺制PV出力)
T = range(10)
P_PV = {t: np.random.uniform(0.3, 1.0) for t in T}  # 随机生成PV出力
P_PV_peak = max(P_PV.values())  # PV峰值功率
min_on_power = 0.5 * P_PV_peak  # ON状态最小功率要求

# 变量定义
model.P_load = Var(T, domain=NonNegativeReals)  # 设备使用功率
model.on = Disjunct(T)  # 每个时段的ON状态析取
model.off = Disjunct(T)  # 每个时段的OFF状态析取

# 析取约束:每个时段必须选择ON或OFF
model.time_disjunction = Disjunction(T, rule=lambda m, t: [m.on[t], m.off[t]])

# ON状态约束:挂载到on析取内
def on_rule(m, t):
    m.P_load[t] >= min_on_power
    m.P_load[t] <= P_PV[t]
model.on_constraint = Constraint(T, rule=on_rule)
for t in T:
    model.on_constraint[t].parent_component().parent_block(model.on[t])

# OFF状态约束:挂载到off析取内
def off_rule(m, t):
    return m.P_load[t] == 0
model.off_constraint = Constraint(T, rule=off_rule)
for t in T:
    model.off_constraint[t].parent_component().parent_block(model.off[t])

# 目标函数:最大化总功率使用
model.obj = Objective(expr=sum(model.P_load[t] for t in T), sense=maximize)

# 将GDP模型转换为MILP(采用BigM转换)
TransformationFactory('gdp.bigm').apply_to(model)

# 调用MILP求解器(以CBC为例,需提前安装)
solver = SolverFactory('cbc')
result = solver.solve(model, tee=True)

# 输出结果
print("求解状态:", result.solver.status)
for t in T:
    print(f"时段{t}:PV出力={P_PV[t]:.2f},设备功率={model.P_load[t]():.2f},ON状态={model.on[t].indicator_var():.0f}")

关键说明

  1. 每个时段的析取通过Disjunction绑定,确保on和off状态二选一
  2. 状态专属约束必须通过parent_block挂载到对应Disjunct下,否则会被视为全局约束
  3. 转换GDP模型后,必须使用MILP求解器,不能再用LP求解器
  4. 完全保留标幺制下的参数逻辑,匹配你的需求

内容的提问来源于stack exchange,提问作者CodingEngineer787

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:35:07