繁体   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