2013-07-29 2 views
0

Java에서 Cplex를 사용하고 있는데 제약 조건 설정과 함께 probem이 있습니다. 제가cplex Java 제약 조건이 할당 연산자를 사용하여 설정되었습니다. "+ ="

[N] 매트릭스 X있어

[N], 여기서 x는 0 일 수마다 또는 1. I (1..N) 모든 J (1..N)의 합계 = 1

이 게시물에 대한 답변과 관련

: Cplex c++ multidimensional decision variable, 나는 이런 식으로 내 코드를 설정 : 코드 자바의 4 번째 라인

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); 
     } 

이 오류를 보여줍니다 "운영자가 + = 인수 유형에 대해 정의되지 (들) IloNumExpr, IloNumVar "

할당 op "+ ="와 같은 erators는 cplex C++에서 작동하지만 cplex java에서는 작동하지 않습니까?

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) 

아무도 내 코드에 대해 무슨 잘못 말해 줄 수 : 실행할 때 이클립스이 오류 메모와 함께 등장이 경우

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); 
     } 

:

는 다른 방법으로, 나는이 시도 ?

미리 감사드립니다.

+0

자바에서 연산자 오버로딩이 지원되지 않습니다. C++ 코드를 받아서 java에서 작동 할 것으로 기대할 수 없습니다. 어둠 속에서 우연히 만나는 대신 자바 튜토리얼을 읽어야한다. null 포인터 예외에 대한 혼란을 없앨 수있다. – Voo

+0

일부 언어에서는 'null'이 '0'과 같지 않다는 점에 유의한다. . 'null'은 완전히 다른 무언가입니다. –

+0

답변 해 주셔서 감사합니다. "+ ="같은 작업을 자바에서 작동하므로 C++ 코드를 볼 때 java/cpley에서도 유용 할 것으로 예상됩니다. – Hendrik

답변

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 + ")");  
} 

할 것 이름은 제약 조건의 이름이지만 모델을 디버그하는 데 항상 도움이됩니다.

+0

고마워요! 이클립스에서 "lhs"에 대한 오류를 표시 했으므로 두 번째 줄을 "IloLinearNumExpr lhs = cplex.linearNumExpr();"으로 변경했습니다. 그리고 효과가있었습니다. – Hendrik

+0

감사합니다. 귀하의 수정을 반영하여 편집 됨. – raoulcousins