Java 在或工具中为MIP编写线性表达式

Java 在或工具中为MIP编写线性表达式,java,or-tools,mixed-integer-programming,Java,Or Tools,Mixed Integer Programming,我正在尝试使用Java在或工具中编写一个线性表达式,然后将其添加到约束中 正如已经在文档和中看到的,有一种方法可以做到这一点 然而,我不清楚如何将其用于这样的示例: linear_expr: offset + sum_{i in S} a_i*x_i constraint: linear_expr <= y_j x和y是决策变量 我认为应该是这样的 /*define variables and parameters*/ double offset = Math.random();

我正在尝试使用Java在或工具中编写一个线性表达式,然后将其添加到约束中

正如已经在文档和中看到的,有一种方法可以做到这一点

然而,我不清楚如何将其用于这样的示例:

linear_expr: offset + sum_{i in S} a_i*x_i
constraint: linear_expr <= y_j
x和y是决策变量

我认为应该是这样的

    /*define variables and parameters*/
double offset = Math.random();
int S = 10;
ArrayList<Double> aList = new ArrayList<Double>();
/*define variable x and parameter a*/
HashMap<Integer,LinearExpr> x = new HashMap<Integer,LinearExpr>();
for (int i = 0; i < S; i++) {
LinearExpr x_variable = solver.makeBoolVar("x_variable_" + i);
    x.put(i,x_variable);
    aList.set(i,Math.random());
}
int K = 20;
/*define variable y*/
HashMap<Integer,LinearExpr> y = new HashMap<Integer,LinearExpr>();
for (int j = 0; j < K; j++) {
    LinearExpr y_variable = solver.makeNumVar(0,MPSolver.infinity(),"y_variable_" + j);
    y.put(j,y_variable);
}
/*linear_expr: offset + sum_{i in S} a_i*x_i
constraint: linear_expr <= y_j
*/
LinearExpr linear_expr = 0;
for (int i = 0; i < S; i++) {
linear_expr = linear_expr + x.get(i) * aList.get(i)
}
linear_expr = linear_expr + offset;
/*define constraint*/
for (int j = 0; j < K; j++) {
    MPConstraint constraint = solver.makeConstraint(linear_expr,MPSolver.infinity(),"constraint_"+j);
    constraint.setCoefficient(y.get(j),1);
}
此外,不可能创建LinearExpr变量


java中没有这样的API,您不能像编写时那样实现它,因为您不能重载+和*运算符

您需要在约束对象上使用SetConference

现在,您可以创建一个包含3个字段的类:变量列表、系数列表、常量以及相应的addTerm、addVar和setConstant方法

也就是说,您使用的API建议您只使用布尔变量和整数系数

您可以看看CP-SAT API,它提供了一个。
请参见此和

我确实使用了setCoefficient方法:constraint.setCoefficienty.getj,1;。如果我做对了,为了在S}a_I*x_中编写下面的表达式offset+sum_{I,我需要编写我自己的类?如果不使用linearxpr类,是否就没有其他方法来编写它?变量x是否仍然可能是MPVariable类型?在Python中这是可能的吗?LeaReXPR只是C++。您可以用Java重写它,并添加一个solver.add方法进行解析。我计划在下一个主要版本中实现这一点,但我还没有时间表。