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

能否在OR-Tools CpModel中设置多组变量最大值之和的约束

OR-Tools CP-SAT 多组变量最大值求和约束实现方案

核心方法:使用内置AddMaxEquality精确实现(无需近似)

CP-SAT 模型原生支持最大值约束,不需要用对数/指数近似,直接通过官方提供的AddMaxEquality接口即可精确构造该约束,你的场景里所有项都是整数线性表达式,完全满足接口要求。

具体实现步骤

  • 对每一组变量,新建一个整数变量存储该组的最大值
  • 调用AddMaxEquality将上述整数变量与组内所有k*v表达式绑定,强制该变量等于组内表达式的最大值
  • 对所有组的最大值变量求和,添加你需要的上限约束即可

可运行的完整代码

from ortools.sat.python import cp_model

model = cp_model.CpModel()

foo = {x: model.NewBoolVar(f"var{x}") for x in range(1, 6)}
bar = {x: model.NewBoolVar(f"var{x}") for x in range(6, 11)}

# 为每组变量新建存储最大值的整数变量,上界对应组内k的最大值即可
max_foo = model.NewIntVar(0, 5, 'max_foo')
max_bar = model.NewIntVar(0, 10, 'max_bar')

# 绑定最大值约束
model.AddMaxEquality(max_foo, [k * v for k, v in foo.items()])
model.AddMaxEquality(max_bar, [k * v for k, v in bar.items()])

# 添加最大值求和的约束
model.Add(max_foo + max_bar <= 20)

# 测试求解
solver = cp_model.CpSolver()
status = solver.Solve(model)
print(f"求解状态:{solver.StatusName(status)}")
if status == cp_model.OPTIMAL:
    print(f"max_foo = {solver.Value(max_foo)}")
    print(f"max_bar = {solver.Value(max_bar)}")
    print(f"求和结果 = {solver.Value(max_foo) + solver.Value(max_bar)}")

原方案报错原因

你之前调用的max()、log()、prod()都是Python原生的数学函数,只能处理实际数值,无法识别OR-Tools定义的线性表达式对象,所以会触发类型错误。CP-SAT的所有约束必须通过模型提供的内置API构造。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:45:00