[英]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.