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
我需要使用 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