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

如何在Pyomo中构建设备固定运行时长的约束条件?

Pyomo建模:设备最小连续运行时间约束实现

问题拆解

你的需求是:设备一旦启动(I(g,t)=1且I(g,t-1)=0),必须连续运行至少T_ON[g]小时。由于Pyomo中无法直接对变量使用if条件判断(变量在求解前是未知的,约束必须是线性/凸形式),需要把逻辑转化为线性约束,常用方法是大M法。

核心建模思路

利用二进制变量的特性,结合大M约束实现启动后的强制连续运行:

  • 定义大M为一个足够大的常数(比如时间集合的总长度,确保约束在非启动场景下自动松弛)
  • 对每个设备g和时间t>0,构建约束:当设备在t时刻启动时,强制t到t+T_ON[g]-1时段内I(g,t2)的和等于T_ON[g](即全部为1)

代码实现

from pyomo.environ import *

# 假设End_uses和T_on是已定义的参数
End_uses = 2  # 示例:设备数量
T_on = {0: 3, 1: 2}  # 示例:各设备的最小运行时长
max_time = 49  # 对应原代码中50个时间点(0到49)

# 1. 构建模型与集合
model = ConcreteModel()
model.Gen = Set(initialize=RangeSet(0, End_uses-1), doc='设备集合')
model.T = Set(initialize=RangeSet(0, max_time), doc='时间点集合')
# 定义辅助集合:对每个t,获取后续T_ON个时段(不超过最大时间)
def get_post_periods(model, g, t):
    end_t = min(t + T_on[g] - 1, max_time)
    return RangeSet(t, end_t)
model.Post_T = Set(model.Gen, model.T, initialize=get_post_periods, doc='启动后需连续运行的时段集合')

# 2. 定义变量
model.I_test = Var(model.Gen, model.T, within=Binary, doc='设备启停状态(1=开,0=关)')

# 3. 最小运行时间约束
M = max_time + 1  # 大M值,取时间点总数+1确保足够大
def min_up_time_rule(model, g, t):
    if t == 0:
        return Constraint.Skip  # 初始时刻无前置状态,跳过
    # 启动标志:I(g,t) - I(g,t-1),仅当启动时为1,否则为0或-1(关闭时)
    start_flag = model.I_test[g,t] - model.I_test[g,t-1]
    # 约束:启动时,后续时段的运行状态和 >= T_ON[g] * 启动标志
    # 同时用大M处理非启动场景:当未启动时,右侧为0或负数,约束自动满足
    return sum(model.I_test[g, t2] for t2 in model.Post_T[g,t]) >= T_on[g] * start_flag - M * (1 - start_flag)
model.min_up_constraint = Constraint(model.Gen, model.T, rule=min_up_time_rule)

约束逻辑说明

  • 当设备在t时刻启动(start_flag=1):约束变为sum(I(g,t2)) >= T_ON[g],强制后续T_ON[g]个时段全部为1
  • 当设备未启动(start_flag=0或start_flag=-1):右侧为-M或负数,而左侧求和最小为0,约束自动满足,不会对变量造成限制
  • 辅助集合Post_T自动处理时间边界问题,避免超出时间集合的最后一个时刻

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:01:10