CPLEX将目标系数为零的变量设置为正值

时间:2019-01-16 19:39:35

标签: cplex

我需要阻止CPLEX这样做,并且不知道如何做。

  • 我有一个最低限度的问题,这是一个MIP。
  • 物镜中的变量 x 的系数为零。
  • 所有约束都是“小于或等于”约束。
  • x 仅在约束矩阵中带有非负系数出现。
  • CPLEX返回一个解决方案,其中将 x 设置为正值,这很奇怪,因为它不能改善目标函数值,并且在约束矩阵中, x 只有“拿走容量”。

该模型在迭代过程中多次求解。在每次迭代中,目标都会改变。因此,我检查了上一次迭代的模型和解,发现 x 当时具有负系数,并设置为正值。我得出结论,此行为必须与CPLEX的一些热启动有关。

如何预防?

我宁愿不将具有正系数的变量添加到目标,因为有很多。

以下是Java中的示例:

    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

1 个答案:

答案 0 :(得分:2)

尝试

cplex.setParam(IloCplex.Param.Advance, 0);