2016-10-21 3 views
0

CPLEX (Eclipse의 Java와 함께 사용)를 사용하여 표준 차량 라우팅 문제를 해결하고 있습니다. 처음에는 하나의 차량을 모델링 했으므로 추측 할 수있는 TSP가됩니다. 나는 2D Boolean 배열을 사용하여 차량이 i에서 j로 이동하는지 여부를 나타냅니다. 문제가 해결되고 목적 함수의 값을 받지만 2D 배열의 값을 읽을 수 없습니다. I 작성한 끝에Eclipse를 사용하여 CPLEX에서 2D 배열로부터 부울 값 추출하기

try { 
      IloCplex cplex = new IloCplex(); 
      IloNumVar[][] x = new IloNumVar[n][]; 
      for(int i=0; i<n; i++){ 
       x[i] = cplex.boolVarArray(n); 
      } 

: 여기서

배열을 정의하기위한 코드

cplex.solve(); 

      System.out.print(cplex.getValue(obj)); 

      //decision matrix   
      for(int i=0; i<n; i++){ 
        for(int j=0; j<n; j++){ 
         System.out.print(cplex.getValue(x[i][j]) + " "); 

        }System.out.println(); 
      } 

      cplex.end(); 

      } 
      catch (IloException e) { 
       e.printStackTrace(); 
      } 
      } 
     } 

분명히 문제 수단 표시되는 목표치 해결되지만 다음과 같은 오류 메시지가 나타납니다.

Total (root+branch&cut) = 0.02 sec. (2.23 ticks) 
223.62126087689276ilog.cplex.IloCplex$UnknownObjectException: CPLEX Error: object is unknown to IloCplex 
    at ilog.cplex.IloCplex.getValue(IloCplex.java:6495) 
    at VRP01k.main(VRP01k.java:144) 
IBM ILOG CPLEX Optimization Studio Preview Edition good for 18 more days. 
The CPLEX Optimizers will solve problems up to 1000 variables and 1000 constraints. 

누군가가 문제를 지적 할 수 있습니까? 배열을 초기화하는 방법과 배열을 초기화하는 방법 사이에 불일치가 있습니까? 감사.

전체 모델입니다. 나는 목적지와 원점으로 저장소를 나눴다.

try { 
    IloCplex cplex = new IloCplex(); 
    IloNumVar[][] x = new IloNumVar[n][]; 
    for(int i=0; i<n; i++){ 
     x[i] = cplex.boolVarArray(n); 
    } 


    //variable definition 
    IloNumVar[] w = cplex.numVarArray(n, 0, Double.MAX_VALUE); /*arrival time*/ 

    //objective function 
    IloLinearNumExpr obj = cplex.linearNumExpr(); 
    for(int i=0; i<n; i++){ 
     for(int j=0; j<n; j++){ 
      if(j!=i){obj.addTerm(c[i][j], x[i][j]);}; 
     } 
    } 
    cplex.addMinimize(obj); 

    //path continuity 
    for(int i=1; i<n-1; i++){ 
     IloLinearNumExpr expr = cplex.linearNumExpr(); 
     for(int j=1; j<n; j++){ 
      if(j!=i){expr.addTerm(1.0, x[i][j]);}; 
     } 
     cplex.addEq(expr, 1.0); 
    } 

    //origin depot 
    IloLinearNumExpr expr0 = cplex.linearNumExpr(); 
    for(int j=1; j<n-1; j++){ 
     expr0.addTerm(1.0, x[0][j]); 

    }cplex.addEq(expr0, 1.0); 

    //destination depot 
    IloLinearNumExpr expr1 = cplex.linearNumExpr(); 
    for(int i=1; i<n-1; i++){ 
     expr1.addTerm(1.0, x[i][n-1]); 

    }cplex.addEq(expr1, 1.0); 

    for(int j=1; j<n-1; j++){ 
     IloLinearNumExpr expr2 = cplex.linearNumExpr();       
     for(int i=0; i<n-1; i++){ 
      if(j!=i){ 

       if(i!=0 && i!=n-1){ 
        expr2.addTerm(1.0, x[i][j]); 
        expr2.addTerm(-1.0, x[j][i]);} 

       else if(i==0){expr2.addTerm(1.0, x[i][j]);} 
       else if(i==n-1){expr2.addTerm(-1.0, x[j][i]);} 
       } 
      } 
     } 

    //time constraints 
    for(int i=0; i<n; i++){ 
     IloLinearNumExpr expr3 = cplex.linearNumExpr(); 
     expr3.addTerm(1.0, w[i]); 
     cplex.addGe(expr3, a[i]); 
     cplex.addLe(expr3, b[i]); 
    } 

    //travel time constraints 
    for(int i=0; i<n; i++){ 
     for(int j=0; j<n; j++){ 
      if(j!=i){ 
     IloLinearNumExpr expr4 = cplex.linearNumExpr(); 
     expr4.addTerm(1.0, w[i]); 
     expr4.addTerm(1000, x[i][j]); 
     expr4.addTerm(-1.0, w[j]); 
     cplex.addLe(expr4, 1000-s[i]-c[i][j]); 
     } 
     } 
    } 

    cplex.solve(); 

    System.out.print(cplex.getValue(obj)); 

    for(int i=0; i<n; i++){ 
      for(int j=0; j<n; j++){ 
       System.out.print(cplex.getValue(x[i][j]) + " "); 

      }System.out.println(); 
    } 

    cplex.end(); 

    } 
    catch (IloException e) { 
     e.printStackTrace(); 
    } 
    } 
} 
+0

Eclipse는 사용중인 개발 환경이며 다양한 프로그래밍 언어를 지원합니다. 어떤 언어입니까? 질문을 편집하고 적절한 언어 태그를 설정하십시오. –

+0

자바를 사용하고 있습니다. –

+1

먼저 문제가 미리보기 에디션 (예 : 1000 병 또는 cst 미만)을 사용할 수있을 정도로 작다고 가정합니다. 두 번째로 콘서트 모델링 레이어는 제약 조건 또는 목표에서 참조되는 변수 만 CPLEX 자체에 넣습니다. 모델을 CPLEX에서 LP 파일로 내보내는 방법을 볼 수 있습니다. – TimChippingtonDerrick

답변

0

게시 된 코드는 모델을 표시하지 않습니다. 그러나 모델의 모든 변수를 포함하지 않았을 수도 있습니다. 예를 들어, VRP에서 변수 x[1][1]은 0이어야하지만 단순히 제약 조건이나 목적에 추가하지 않으면 모델은 존재하지 않는다고합니다. 따라서 해결 후 값을 쿼리하려고하면 예외가 throw됩니다. 값을 쿼리 할 때 다음 코드는 예외를 throw합니다.이 값은 모델에 포함되지 않았습니다.

public static void main(String[] args) throws IloException { 
    IloCplex cplex = new IloCplex(); 
    IloNumVar x1 = cplex.boolVar(); 
    IloNumVar x2 = cplex.boolVar(); 
    IloNumVar x3 = cplex.boolVar(); 
    cplex.addMinimize(cplex.prod(10, x1)); 
    cplex.addEq(cplex.sum(x1,x2),1); 
    if (cplex.solve()) { 
     System.out.println(cplex.getValue(x1)); 
     System.out.println(cplex.getValue(x2)); 
     System.out.println(cplex.getValue(x3)); 
    } 
} 
+0

나는 이것을 검사했다. x [] [] 행렬의 모든 요소는 모델에 추가 된 것처럼 보입니다. 문제에 대한 통찰력을 줄 수 있다면 전체 모델을 업로드하고 있습니다. –

+0

코드에서 VRP에 대해 완전히 괜찮은 예를 들어'if (j! = i)'를 추가하여 i = j 일 경우 변수'x [i] [j]'의 포함을주의해서 생략했습니다. 그러나 모델을 해결 한 후 for 루프에서 이러한 변수를 제외해야합니다. 또한 목표에 포함되어있는'x [n-1] [0]'과 같은 일부 변수가 모델에 있으면 안된다는 점에 유의하십시오. – Hernan