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

如何在OR-Tools中直接创建整数与布尔变量对的乘积和等式约束?

在OR-Tools中直接创建变量乘积求和的等式约束?

不行,你不能像示例代码那样直接写出myNewintvar == sum(a[0]*a[1] for a in pairlist)这样的约束。原因是OR-Tools的CP-SAT求解器(整数规划类求解器普遍如此)仅支持线性约束,而整数变量与布尔变量的乘积属于非线性项,求解器无法直接解析这种表达式,直接运行会抛出错误。

正确的实现方式

要实现等价的约束,必须通过OR-Tools提供的AddMultiplicationEquality约束来显式处理变量乘积,即使你不想使用命名的中间变量,也需要创建临时的乘积变量来构建求和逻辑。示例代码如下:

from ortools.sat.python import cp_model

model = cp_model.CpModel()

# 定义示例变量
newintvar1 = model.NewIntVar(0, 100, "int1")
booleanvar1 = model.NewBoolVar("bool1")
newintvar2 = model.NewIntVar(0, 100, "int2")
booleanvar2 = model.NewBoolVar("bool2")
newintvar3 = model.NewIntVar(0, 100, "int3")
booleanvar3 = model.NewBoolVar("bool3")
myNewintvar = model.NewIntVar(0, 300, "my_int")

pairlist = [
    [newintvar1, booleanvar1],
    [newintvar2, booleanvar2],
    [newintvar3, booleanvar3]
]

# 构建乘积项并求和
sum_terms = []
for int_var, bool_var in pairlist:
    # 创建临时乘积变量(无需显式命名也可,但建议命名方便调试)
    prod = model.NewIntVar(0, int_var.UB(), f"prod_{int_var.Name()}")
    model.AddMultiplicationEquality(prod, [int_var, bool_var])
    sum_terms.append(prod)

# 最终约束:myNewintvar等于所有乘积项的和
model.Add(myNewintvar == sum(sum_terms))

为什么不能省略中间变量?

变量乘积的本质是非线性关系,CP-SAT求解器只能处理线性约束。引入中间变量是将非线性关系转化为线性约束组合的必要步骤——AddMultiplicationEquality内部会生成一组线性约束来模拟prod = int_var * bool_var的逻辑(比如当bool_var=0时强制prod=0,当bool_var=1时强制prod=int_var)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:33:14