如何在CVXPY水泵运行优化问题中添加自定义冷却期约束
水泵冷却期约束实现方案
核心逻辑
你的需求本质是带最小停机时间的布尔约束:水泵单次运行后,后续指定周期内不允许再次启动。从你的代码定义可知,selection[:, 1]为1时代表对应周期水泵运行,selection[:, 0]为1代表停机,因此我们可以基于该运行状态变量直接构造约束。
实现步骤
- 首先提取水泵运行状态的指示变量,设置可自定义的冷却期参数:
# 提取各周期水泵运行状态:值为1即水泵运行 pump_running = selection[:, 1] # 自定义冷却周期:运行后需停机2个周期,可按需修改该数值 COOLING_PERIOD = 2
- 生成冷却约束:对于每一个运行的周期,后续
COOLING_PERIOD个周期的运行状态必须为0
n_periods = cost_.shape[0] cooling_constraints = [] for i in range(n_periods): # 遍历当前周期之后的冷却期 for offset in range(1, COOLING_PERIOD + 1): # 避免超出周期总数边界 if i + offset < n_periods: # 如果当前周期运行,后续冷却期内不能运行,两者和最大为1 cooling_constraints.append(pump_running[i] + pump_running[i + offset] <= 1)
- 将冷却约束加入原有约束列表,该约束为强制生效约束,无论哪种异常分支都需要添加:
在你原代码的constraints列表生成后,添加如下代码:
constraints.extend(cooling_constraints)
约束有效性说明
由于pump_running是布尔变量,取值只能为0或1,当某周期pump_running[i] = 1时,后续冷却期内的pump_running[i+offset]必须为0才能满足和小于等于1的约束要求,完全匹配你需要的冷却逻辑。如果后续扩展多档位水泵运行模式,只需要将pump_running修改为cp.sum(selection[:, 1:], axis=1)即可兼容多档位判定。
内容的提问来源于stack exchange,提问作者user3154966
相关产品推荐
相关产品推荐

