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