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

如何在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条件转化为以下两个等价的线性约束:

  1. sum(x[i,j] for i in 1-4) ≤ 4*y[j]
    • 若y[j]=0,则左边的和必须≤0,结合x是二进制变量的特性,只能全为0
    • 若y[j]=1,此约束不做限制,允许和达到4
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:50:34