能否在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
相关产品推荐
相关产品推荐

