使用Eclipse

时间:2016-10-21 16:52:42

标签: java arrays eclipse cplex

我正在使用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();
    }
    }
}

1 个答案:

答案 0 :(得分:0)

发布的代码未显示模型。但是,我猜你可能没有在模型中包含所有变量。例如,在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));
    }
}