使用赋值运算符“+ =”设置cplex java约束

时间:2013-07-29 02:02:06

标签: java cplex

我在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)

有人能告诉我我的代码有什么不对吗?

提前致谢。

1 个答案:

答案 0 :(得分: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 + ")");      
}

您不需要为约束设置名称,但它总是可以帮助您调试模型。