1

Cplex Java API를 처음 사용하는데 대개 GAMS 만 사용합니다. 나는 x [i] 변수와 x [k]와 double 유형 인 매개 변수 rl [k]의 곱인 목적 함수를 생성하려고합니다. 나는 항상 내가 이해하지 못한다는 오류를 얻는다.Cplex Java API에서 변수 생성

public void variable() throws IloException{ 
    int i=0; 
    this.rl = new double [(int)Data.Count+1]; 

    IloCplex cplex = new IloCplex(); 

    IloNumVar[] x = new IloNumVar[Data.Count+1]; 

     for(int Pnr = 0; Pnr <= Data.PCount; Pnr++) 
     { 
      if(Data.X[Pnr]==1) 
      { 
       i++; 

       x[i] = cplex.boolVar(); 
       rl[i]=Data.RL[Pnr]; 

      } 
     } 

    // Optimization problem 
     IloLinearNumExpr obj = cplex.linearNumExpr(); 

     for(int k=0; k<=i; k++){ 
      obj.addTerm(x[k], rl[k]); 
     } 

     cplex.addMaximize(obj); 

    } 

및 오류 : [0] 초기화되지 않은 X를 떠나

Exception in thread "main" java.lang.NullPointerException 
at ilog.cplex.CpxLinearExpr.unmarkVars(CpxLinearExpr.java:402) 
at ilog.cplex.CpxLinearExpr.removeDuplicates(CpxLinearExpr.java:515) 
at ilog.cplex.CpxLinearExpr.removeDuplicates(CpxLinearExpr.java:489) 
at ilog.cplex.CpxObjective.setExpr(CpxObjective.java:115) 
at ilog.cplex.CpxObjective.<init>(CpxObjective.java:369) 
at ilog.cplex.IloCplexModeler.objective(IloCplexModeler.java:706) 
at ilog.cplex.IloCplexModeler.addObjective(IloCplexModeler.java:768) 
at ilog.cplex.IloCplexModeler.addMaximize(IloCplexModeler.java:810) 
at ObjCplex.report1(ObjCplex.java:52) 
at ObjCplex.<init>(ObjCplex.java:20) 
at Main104.main(Main104.java:11) 

답변

0

인해 fencepost error에 다음은 코드입니다. 첫 번째 for 루프에서 시작은 0이지만 인덱스로 사용하기 전에 숫자를 증가 시키므로 x 1은 null이 아닌 x의 첫 번째 요소입니다. 두 번째 룩이 필요없고 첫 번째 루프에서 obj 표현식을 만들 수 있습니다. 또한 for 루프는 '< ='대신에 연속 기준으로 엄격한 < (또는 !=)을 사용하는 관용어입니다.

당신은 첫 번째 루프에서 OBJ 수식을 만들 두 개의 루프를 방지하고 배열 X

IloCplex cplex = new IloCplex(); 
int i = 0; 
this.rl = new double [(int)Data.Count+1]; 
IloLinearNumExpr obj = cplex.linearNumExpr(); 
for(int Pnr = 0; Pnr <= Data.PCount; Pnr++) 
    { 
    if(Data.X[Pnr]==1) 
     { 
      IloNumVar x = cplex.boolVar(); 
      obj.addTerm(Data.RL[Pnr], x); 
      this.rl[i++] = Data.RL[Pnr]; 
     } 
    } 
cplex.addMaximize(obj); 
을 만드는 피할 수 있습니다