在Ortools中用两变量线性表达式作分子添加除法约束致MODEL_INVALID
Google CP-SAT除法约束导致MODEL_INVALID的问题分析与解决
问题原因
你使用的9.11.4210版本CP-SAT solver中,AddDivisionEquality方法对分子表达式有严格限制:分子只能是单个变量,或单个变量与常数的加减组合,不支持两个变量相加这类多变量线性表达式。当传入v1 + v2作为分子时,求解器无法识别该结构,直接判定模型无效;而v1 + 1属于变量加常数的合法形式,符合方法输入要求,因此不会触发报错。
解决方法
方法1:引入中间变量替代多变量和
通过创建中间变量存储两个变量的和,再将该变量作为分子传入AddDivisionEquality,绕过旧版本限制。示例代码如下:
model = CpModel() v1 = model.NewIntVar(1, 1, "var1") v2 = model.NewIntVar(1, 1, "var2") # 新增中间变量存储v1+v2的结果 sum_v = model.NewIntVar(2, 2, "sum_v") model.Add(sum_v == v1 + v2) div = model.NewIntVar(2, 2, "div") # 使用中间变量作为分子 model.AddDivisionEquality(div, sum_v, v2) solver = CpSolver() status = solver.Solve(model) if status == MODEL_INVALID: print("The model is invalid") else: print("Solution found")
方法2:升级CP-SAT版本
Google后续更新的CP-SAT版本(如9.15及以上)已移除该限制,支持分子为任意线性表达式(包括多变量相加)。若项目允许,直接升级solver版本即可,原代码无需修改就能正常运行。
内容的提问来源于stack exchange,提问作者RM Ts
相关产品推荐
相关产品推荐

