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的主要内容,如果未能解决你的问题,请参考以下文章

With的用法?

with的用法

在 SQL 中是不是可以在 WITH 中使用 WITH

SQL:with 查询

mac 下完全安装 ffmpeg

SQL 中with的用法