如何在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
相关产品推荐
相关产品推荐

