2013-07-29 23 views
0

我在Java中使用Cplex,并且设置了一个约束。使用赋值运算符设置cplex java约束“+ =”

我有一个矩阵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); 
     } 

对于代码的Java的第4行显示了这个错误:“运营商+ =未定义的参数类型(s)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) 

任何人能告诉我什么是错我的代码?

在此先感谢。

+0

运算符重载在java中不被支持,你不能只取得C++代码,并期望它在java中工作。你可能应该阅读一个java教程,而不是在黑暗中徘徊,这也将清除有关空指针异常的混淆。 – Voo

+0

请记住,'null'与'0'不同,因为它可能在某些语言中。 'null'是完全不同的东西。 –

+0

感谢您的回答。像“+ =”这样的操作在java中工作,所以我期望在看到C++代码时它也可以用于java/cpley。 – Hendrik

回答

1

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

要做到的约束“对于每一个我(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 + ")");  
} 

你并不需要设置一个你的约束名称,但它总是会帮助你调试你的模型。

+0

非常感谢! Eclipse向我展示了“lhs”的错误,所以我将第二行更改为“IloLinearNumExpr lhs = cplex.linearNumExpr();”它的工作。 – Hendrik

+0

谢谢。编辑以反映您的更正。 – raoulcousins