0

我在 Java 中使用 Cplex,并且我有一个设置约束的问题。

我有一个矩阵 x[n][n],其中 x 可以是 0 或 1。对于每个 i(1..n),所有 j(1..n) 的总和 = 1

关于这篇文章中的答案:Cplex c++ multidimensional decision variable,我这样设置我的代码:

for (int i=0; i<n; i++){
            IloNumExpr sum_over_i;
            for(int j=0; j<n; j++){
                sum_over_i += x[i][j];
            }   
            cplex.addEq(sum_over_i, 1.0);
        }

对于代码的第 4 行,java 显示此错误:“运算符 += 未定义参数类型 IloNumExpr、IloNumVar”

像“+=”这样的赋值运算符是否可能适用于 cplex c++ 但不适用于 cplex java?

作为替代方案,我尝试了这个:

for(int i=0; i<n; i++){
            IloNumExpr sum_over_i = null;
            for(int j=0; j<n; j++){
                cplex.eq(sum_over_i, cplex.sum(sum_over_i, x[i][j]));
            }   
            cplex.addEq(sum_over_i, 1.0);
        }

在这种情况下,Eclipse 在运行时会出现以下错误提示:

Exception in thread "main" java.lang.NullPointerException
at ilog.cplex.CpxQextractor.visitLinkedExpr(CpxQextractor.java:73)
at ilog.cplex.CpxLinkedExpr.accept(CpxLinkedExpr.java:46)
at ilog.cplex.CpxRange.<init>(CpxRange.java:1337)
at ilog.cplex.IloCplexModeler.makeRange(IloCplexModeler.java:4316)
at ilog.cplex.IloCplexModeler.eq(IloCplexModeler.java:4902)
at TSP.main(TSP.java:57)

谁能告诉我我的代码有什么问题?

提前致谢。

4

1 回答 1

1

我记得也很难找到如何在 CPLEX Java API 中执行线性表达式的示例,尽管 CPLEX 的一般文档非常好。

要执行“对于每个 i(1..n) 所有 j(1..n) = 1 的总和”的约束,我会这样做

for(int i=0; i < n; i++) {
  IloLinearNumExpr lhs = cplex.linearNumExpr(); //lhs as in left hand side
  for(int j=0; j < n; j++) {
    lhs.addTerm(1.0, x[i][j]);        
  }   

  IloRange con = cplex.addEq(lhs, 1);
  con.setName("yourConstraintName(" + i + ")");      
}

你不需要为你的约束设置一个名字,但它总能帮助你调试你的模型。

于 2013-07-29T06:31:53.170 回答