addDivisionEquality with Java google or-tools CP-SAT

addDivisionEquality with Java google or-tools CP-SAT

我需要使用 google CP-SAT solver 添加以下约束:

(x+y+z)/(x+y+z+k) < 10

addDivisionEquality 方法签名是:

Constraint addDivisionEquality (IntVar target, IntVar num, IntVar denom)    

在哪里

IntVar target = model.newIntVar(0, 10, "(x+y+z)/(x+y+z+k)");

但现在我需要将分子和分母定义为 IntVar 类型,而它们是多个 intVars 的总和。

Java 软件包提供了一个名为 SumOfVariables to sum intVars but the addDivisionEquality method requires IntVar. I would expect it to get LinearExpr 的 class。

如何将分子和分母定义为 IntVar 类型?

IntVar numerator = model.newIntVar(0, 10, "(x+y+z)");
model.addEquality(target, LinearExpr.sum(new IntVar[] {x, y, z}));

话虽这么说

model.addLessThan(LinearExpr.sum(new IntVar[] {x, y, z}), 
                  LinearExpr.scalProd(new IntVar[] {x, y, z, k}, new int[] {10, 10, 10, 10}));

简单多了。

最后,如果所有变量都是正数,

(x + y + z) / (x + y + z + k) is always <= 1