如何在 Java 中使用 OR-Tools 从多个 IntExpr 创建 IntExpr,与 Python 中相同

Posted

技术标签:

【中文标题】如何在 Java 中使用 OR-Tools 从多个 IntExpr 创建 IntExpr,与 Python 中相同【英文标题】:How to create IntExpr from multiple IntExpr in Java, using OR-Tools, same as in Python 【发布时间】:2020-06-22 12:31:19 【问题描述】:

在 Github 上的这个问题中,设置约束的解决方案需要用户从两个表达式创建一个新表达式 https://github.com/google/or-tools/issues/685

喜欢这个

dur_expr = time_dimension.CumulVar(delivery_index) - time_dimension.CumulVar(index)
solver.Add(dur_expr <= max_dur)

但是尝试在 Java 中做类似的事情会出现以下错误

The operator - is undefined for the argument type(s)com.google.ortools.constraintsolver.IntVar, com.google.ortools.constraintsolver.IntVar

知道如何在 Java 中做到这一点吗?

我设法在IntExpr 上找到了文档,但找不到关于如何组合表达式的任何内容

http://google.github.io/or-tools/java/classcom_1_1google_1_1ortools_1_1constraintsolver_1_1IntExpr.html

我想要实现的是确保总持续时间(即司机的值班时间)不超过时间限制......因为在第一个站点节点可能会有很长的等待时间,由于对于时间窗口,我不能简单地将时间维度限制为允许的值班时间,因为松弛将超过允许的总时间。

这就是为什么我想添加以下条件

for (int i = 0; i < data.vehicleNumber; ++i) 
    solver.addConstraint(solver.makeLessOrEqual(timeDimension.cumulVar(routing.end(i))-timeDimension.cumulVar(routing.start(i)), onDutyTimeLimit));
 

【问题讨论】:

【参考方案1】:

Java 不支持重载运算符。您需要使用 Solver 类的工厂方法。

在你的情况下:

http://google.github.io/or-tools/java/classcom_1_1google_1_1ortools_1_1constraintsolver_1_1Solver.html#a420d96c79d5d8c45667706d19d1942d9

【讨论】:

以上是关于如何在 Java 中使用 OR-Tools 从多个 IntExpr 创建 IntExpr,与 Python 中相同的主要内容,如果未能解决你的问题,请参考以下文章

在 Eclipse 中使用 google or-tools

在intellij中安装or-tools库

如何在 or-tools 中定义复杂的目标函数?

如何使用 or-tools 在 bool 数组中制作 K 个不同的元素?

如何在我们的 MIP 问题中使用 or-tools 设置像 y = max(x1,x2,x3) 这样的等式约束?

如何在 google or-tools vrptw 中设置时间窗口?