CPLEX将目标系数为零的变量设置为正值
我需要阻止CPLEX这么做,但我不知道怎么做CPLEX将目标系数为零的变量设置为正值,cplex,Cplex,我需要阻止CPLEX这么做,但我不知道怎么做 我有一个min问题,它是一个MIP 目标中有一个系数为零的变量x 所有约束均为“小于或等于”-约束 x仅在约束矩阵中以非负系数出现 CPLEX返回一个解决方案,其中x设置为正值,这很奇怪,因为它没有改善目标函数值,并且在约束矩阵中,x仅“带走容量” 该模型在迭代过程中多次求解。在每次迭代中,目标都会发生变化。因此,我检查了上一次迭代的模型和解决方案,发现x当时有一个负系数,并被设置为正值。我的结论是,这种行为一定与CPLEX的某些热启动有关 如何
- 我有一个min问题,它是一个MIP
- 目标中有一个系数为零的变量x
- 所有约束均为“小于或等于”-约束
- x仅在约束矩阵中以非负系数出现
- CPLEX返回一个解决方案,其中x设置为正值,这很奇怪,因为它没有改善目标函数值,并且在约束矩阵中,x仅“带走容量”
IloCplex cplex = new IloCplex();
/* Variables */
IloNumVar x = cplex.intVar(0, Integer.MAX_VALUE, "x");
/* Objectiv */
IloLinearNumExpr objExpr = cplex.linearNumExpr();
objExpr.addTerm(1.0, x);
IloObjective objective = cplex.addMaximize();
objective.setExpr(objExpr);
/* Constraints */
IloLinearNumExpr expr = cplex.linearNumExpr();
expr.addTerm(1.0, x);
cplex.addLe(expr, 2.5);
System.out.println(cplex.getModel().toString());
cplex.solve();
System.out.println("x = " + cplex.getValue(x) + "\n"); // x = 2.0
objective.clearExpr();
IloLinearNumExpr newObjexpr = cplex.linearNumExpr();
objective.setExpr(newObjexpr);
System.out.println(cplex.getModel().toString());
cplex.solve();
System.out.println("x = " + cplex.getValue(x) + "\n"); // x = 2.0
试一试
如果一个变量根本不在目标中,那么您实际上是在告诉CPLEX您对它的取值没有偏好。因此,您可以得到任何可行的值,并且与您的(最佳)解决方案的其余部分兼容。@TimChippingtonDerrick当然。但是,解算器没有理由增加该变量的值,除非它使用一些起始解。(想想单纯形从一个基本可行解到下一个。)我不想在目标中包含像x这样的变量,以减少求解器的计算工作量。公认的答案解决了这个问题,因为它正是这样做的:热启动。
cplex.setParam(IloCplex.Param.Advance, 0);