2016-10-21 18 views
0

私はCPLEX(Eclipse上のJavaと連携して)を使用して時間ウィンドウで標準の車両ルーティング問題を解決しています。最初は、1台の車両をモデリングしているので、TSPになると思います。私は車両がiからjに移動するかどうかを示すために2次元ブール配列を使用しました。問題は解決されており、私は目的関数の値を受け取りますが、2D配列の値は読み込まれていません。目標値は、明らかに問題が解決されることを意味し表示されるEclipseを使用してCPLEXの2D配列からブール値を抽出する

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

、しかし:私が書いた最後で

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

:ここ

は、配列を定義するためのコードです次のエラーメッセージが表示されます。

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

私はJavaを使用しています。 –

+1

まず、あなたの問題はプレビュー版を使用するのに十分小さいと考えています(つまり、1000のvarsまたはcst未満)。第2に、コンサートモデリングレイヤーは、制約や目的で参照されている変数のみをCPLEX自体に入れます。CPLEXからLPファイルにモデルをエクスポートすることで、そこにあるものがわかります。 – TimChippingtonDerrick

答えて

0

投稿されたコードにはモデルが表示されません。しかし、おそらくモデル内のすべての変数が含まれていないと思います。たとえば、VRPでは変数x[1][1]はゼロにする必要がありますが、単純に制約や目的に追加しなかった場合、モデルはそれが存在することさえも認識しません。したがって、解決後に値を照会しようとすると、例外がスローされます。 モデルに含まれていないの値を照会すると、次のコードで例外がスローされます。

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

このコードでは、i = jの場合、VRPに完全に適した 'if(j!= i)'を追加することにより、変数 'x [i] [j]'の包含を注意深く省略しました。ただし、モデルを解決した後で、これらの変数をforループから除外する必要があります。また、目的に含まれている 'x [n-1] [0]'のような、モデル中にすべきではないいくつかの変数があります。 – Hernan

関連する問題