cplex - 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
解决方案
尝试
cplex.setParam(IloCplex.Param.Advance, 0);
推荐阅读
- codeigniter - Codeigniter 4.0.4 重定向到 404 - 找不到文件
- node.js - 如何在 ExpressJs 应用程序上配置 Content-Policy-Security 标头?
- c# - Unity 2D 画布缩放器
- python - Pandas 系列 str 拆分方法因负前瞻而中断
- android - 在 Android Management API 中扫描 QR 以注册 Android 设备后,如何使设备连接到 wifi?
- c# - 当我在 Visual Studio 中单击发布时如何知道发布完整命令
- java - 如何在 Cucumber 框架中实现 Dev 和 Staging 的代码
- swift - SwiftUI 构建列表和导航 - 遵循教程时无法渲染画布 - 更新时间超过 5 秒/崩溃
- c# - 升级项目 Unity 2019 -> 2020
- prolog - Prolog中的Powerset oa set(list)