如何在PuLP中添加二选一约束:调度场景变量取值控制
在PuLP中实现二进制变量全0或全1的二选一约束
要实现每小时4个二进制变量要么全部为1、要么全部为0的约束,你需要引入辅助二进制变量来将OR逻辑转化为线性规划可处理的约束条件,具体步骤如下:
核心思路
对每个小时j,新增一个二进制辅助变量y[j](取值仅为0或1),通过两个线性约束强制:
- 当
y[j] = 1时,4个变量的和必须等于4(全1) - 当
y[j] = 0时,4个变量的和必须等于0(全0)
约束转化
将你的OR条件转化为以下两个等价的线性约束:
sum(x[i,j] for i in 1-4) ≤ 4*y[j]- 若
y[j]=0,则左边的和必须≤0,结合x是二进制变量的特性,只能全为0 - 若
y[j]=1,此约束不做限制,允许和达到4
- 若
sum(x[i,j] for i in 1-4) ≥ 4*y[j]- 若
y[j]=1,则左边的和必须≥4,结合x是二进制变量的特性,只能全为1 - 若
y[j]=0,此约束不做限制,允许和为0
- 若
PuLP代码实现
首先定义辅助变量,再替换原单一约束为上述两个约束:
# 先定义辅助二进制变量,每个小时对应一个 y = LpVariable.dicts("hour_choice", day, cat='Binary') # 遍历每个小时添加约束 for j in day: # 计算当前小时4个变量的和 x_sum = lpSum(x[i,j] for i in [1,2,3,4]) # 添加第一个约束:和 ≤4*y[j] model.addConstraint(x_sum <= 4 * y[j]) # 添加第二个约束:和 ≥4*y[j] model.addConstraint(x_sum >= 4 * y[j])
这两个约束组合起来,等价于sum(x[i,j]) = 4*y[j],而y[j]仅能取0或1,完美实现了你需要的“全0或全1”的二选一逻辑。
内容的提问来源于stack exchange,提问作者Fawzi
相关产品推荐
相关产品推荐

