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

OR-Tools CP-SAT布尔数组互斥和条件约束实现求助

布尔变量分段互斥约束的实现方案

你的需求本质是要求前m个布尔变量的和与后n-m个布尔变量的和不能同时大于0,即两段中最多只有一段存在为1的变量。下面提供两种基于Gurobi API的实现方式:

方法一:使用辅助布尔变量(直观易维护)

通过两个辅助变量分别标记两段是否存在为1的变量,再约束这两个变量互斥:

import gurobipy as gp
from gurobipy import GRB, LinearExpr

n = 10  # 示例总长度
m = 4   # 示例分段点
model = gp.Model()

# 创建布尔变量列表
x = model.addVars(n, vtype=GRB.BINARY, name="x")

# 1. 定义辅助变量:标记前段/后段是否有变量为1
front_has_one = model.addVar(vtype=GRB.BINARY, name="front_has_one")
back_has_one = model.addVar(vtype=GRB.BINARY, name="back_has_one")

# 2. 关联辅助变量与对应分段的和
# 前段有1 → sum(x[:m]) ≥1;前段无1 → sum(x[:m])=0
model.addConstr(LinearExpr.sum(x[:m]) >= front_has_one)
model.addConstr(LinearExpr.sum(x[:m]) <= m * front_has_one)

# 后段有1 → sum(x[m:]) ≥1;后段无1 → sum(x[m:])=0
model.addConstr(LinearExpr.sum(x[m:]) >= back_has_one)
model.addConstr(LinearExpr.sum(x[m:]) <= (n - m) * back_has_one)

# 3. 核心约束:两段不能同时有1
model.addConstr(front_has_one + back_has_one <= 1)

方法二:直接使用OnlyEnforceIf(无需额外辅助变量关联逻辑)

利用OnlyEnforceIf让约束仅在特定条件满足时生效,直接实现原需求中的两个推导逻辑:

import gurobipy as gp
from gurobipy import GRB, LinearExpr

n = 10
m = 4
model = gp.Model()
x = model.addVars(n, vtype=GRB.BINARY, name="x")

# 约束1:若后段和>0,则前段和必须为0
back_non_zero = model.addVar(vtype=GRB.BINARY, name="back_non_zero")
model.addConstr(LinearExpr.sum(x[m:]) >= back_non_zero)
model.addConstr(LinearExpr.sum(x[m:]) <= (n - m) * back_non_zero)
# 仅当back_non_zero=1时,强制执行前段和为0的约束
model.addConstr(LinearExpr.sum(x[:m]) == 0).OnlyEnforceIf(back_non_zero)

# 约束2:若前段和>0,则后段和必须为0
front_non_zero = model.addVar(vtype=GRB.BINARY, name="front_non_zero")
model.addConstr(LinearExpr.sum(x[:m]) >= front_non_zero)
model.addConstr(LinearExpr.sum(x[:m]) <= m * front_non_zero)
model.addConstr(LinearExpr.sum(x[m:]) == 0).OnlyEnforceIf(front_non_zero)

逻辑补充

如果你的求解器支持AddImplication,也可以用它替代OnlyEnforceIf,写法逻辑一致:

# 示例:用AddImplication实现约束1
model.addImplication(back_non_zero, model.addConstr(LinearExpr.sum(x[:m]) == 0))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 06:33:17