簡體   English   中英

使用Eclipse從CPLEX中的2D數組中提取布爾值

[英]Extracting Boolean values from 2D array in CPLEX using Eclipse

我正在使用CPLEX(與Eclipse上的Java一起)解決帶有時間窗的標准車輛路徑問題。 首先,我要為單個車輛建模,因此我猜想它會成為TSP。 我已經使用2D布爾數組表示車輛是否從i行駛到j。 問題已經解決,我收到了目標函數的值,但是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();
    }
    }
}

發布的代碼未顯示模型。 但是,我想您可能沒有在模型中包括所有變量。 例如,在VRP中,變量x[1][1]應該為零,但是如果您根本沒有將其添加到任何約束或目標中,則該模型甚至都不知道它的存在。 因此,如果您嘗試在求解后查詢該值,它將拋出異常。 以下代碼在查詢模型中未包含的x3值時引發異常。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM