addDivisionEquality with Java google or-tools CP-SAT
Posted
技术标签:
【中文标题】addDivisionEquality with Java google or-tools CP-SAT【英文标题】: 【发布时间】:2020-06-14 12:56:39 【问题描述】:我需要使用google CP-SAT solver添加以下约束:
(x+y+z)/(x+y+z+k)
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
类型?
【问题讨论】:
【参考方案1】: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
【讨论】:
以上是关于addDivisionEquality with Java google or-tools CP-SAT的主要内容,如果未能解决你的问题,请参考以下文章