2013-07-29 55 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