Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CPLEX将目标系数为零的变量设置为正值_Cplex - Fatal编程技术网

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

CPLEX将目标系数为零的变量设置为正值,cplex,Cplex,我需要阻止CPLEX这么做,但我不知道怎么做 我有一个min问题,它是一个MIP 目标中有一个系数为零的变量x 所有约束均为“小于或等于”-约束 x仅在约束矩阵中以非负系数出现 CPLEX返回一个解决方案,其中x设置为正值,这很奇怪,因为它没有改善目标函数值,并且在约束矩阵中,x仅“带走容量” 该模型在迭代过程中多次求解。在每次迭代中,目标都会发生变化。因此,我检查了上一次迭代的模型和解决方案,发现x当时有一个负系数,并被设置为正值。我的结论是,这种行为一定与CPLEX的某些热启动有关 如何

我需要阻止CPLEX这么做,但我不知道怎么做

  • 我有一个min问题,它是一个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
试一试


如果一个变量根本不在目标中,那么您实际上是在告诉CPLEX您对它的取值没有偏好。因此,您可以得到任何可行的值,并且与您的(最佳)解决方案的其余部分兼容。@TimChippingtonDerrick当然。但是,解算器没有理由增加该变量的值,除非它使用一些起始解。(想想单纯形从一个基本可行解到下一个。)我不想在目标中包含像x这样的变量,以减少求解器的计算工作量。公认的答案解决了这个问题,因为它正是这样做的:热启动。
cplex.setParam(IloCplex.Param.Advance, 0);