2013-07-29 2 views
0

Я использую Cplex на Java, и у меня есть проблема с настройкой ограничения.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); 
     } 

за 4-й строке кода Java показывает эту ошибку: «оператор + = не определено для типа аргумента (ы) IloNumExpr, IloNumVar "

Возможно ли, что присвоение op такие как «+ =» работают для 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, поэтому я ожидал, что это будет полезно для java/cpley при просмотре кода на C++. – Hendrik

ответ

1

Помню, что мне очень трудно найти пример того, как делать линейные выражения в API CPLEX Java, хотя документация в целом для 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

Смежные вопросы