1

我需要使用谷歌 CP-SAT 求解器添加以下约束:

(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类型,而它们是多个 intVar 的总和。

Java 包提供了一个名为SumOfVariables的类来对 intVars 求和,但该addDivisionEquality方法需要IntVar. 我希望它会得到LinearExpr

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

4

1 回答 1

2
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
于 2020-06-14T13:22:53.253 回答