在 Java 中乘/加 Google OR Tools IntVar 和常量

Posted

技术标签:

【中文标题】在 Java 中乘/加 Google OR Tools IntVar 和常量【英文标题】:Multiply / add Google OR Tools IntVar's and Constants in Java 【发布时间】:2021-05-07 13:45:56 【问题描述】:

我目前开始使用 Java 中的 Google OR Tools CP-Sat Solver 并面临简单的数学方程式问题,包括常量和 OR-Tools 内部“IntVar”。

我的问题的一个小例子:

    // Variables
    IntVar a = model.newIntVar(0, 5, "a");
    IntVar b = model.newIntVar(0, 5, "b");
    int c = 1;

    // Constraint
    model.addEquality(a, a * c); // Cannot apply * with IntVar and int
    model.addEquality(a, a + b); // Cannot Apply + with IntVars
    
    // What I want to achieve
    model.addEquality(a, a * c + b);
    

我习惯了 Python,这些类型的问题并不真正存在,有一个简单的model.Add(a == a * c + b) 完成了这项工作。

Or-Tools LinearExpr.sum 或 LinearExpr.term 根本没有帮助我。

有没有人处理过 Java 中的 CP-Sat 优化问题并知道解决方法?

【问题讨论】:

【参考方案1】:

java 中没有运算符重载。 所以你被 LinearExpr 方法困住了。

【讨论】:

据我了解,我也坚持使用 LinearExpr,因为我无法将 LinearExpr 对象转换为 IntVar。使用d = LinearExpr.term(a,c),我做了乘法部分,最后得到了一个我不能在LinearExpr.sum(d, b) 中使用的LinearExpr 对象,因为它只需要IntVar 对象。 所以 LinearExpr.ScalProd(new IntVar[]a, b, new int[]c, 1)。笨重,但这是java。我不想支持嵌套表达式。 就是这样。非常感谢:)

以上是关于在 Java 中乘/加 Google OR Tools IntVar 和常量的主要内容,如果未能解决你的问题,请参考以下文章

在 Anaconda 的 Windows 上安装 witwidget(google what-if too)时面临问题

Caused by: java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block

baksmali反编译出现:UNEXPECTED TOP-LEVEL ERROR:....Too many open files

Too many authentication failures for

cropperjs的高度过大(container height too much)

如何解决错误 java.net.SocketException: Too many open files