为什么我只能获得LP的整数解?

时间:2012-02-28 02:30:42

标签: c++ integer boolean linear cplex

我有一个整数编程模型,我想用CPLEX解决它的线性松弛问题。最初,我将变量定义为:

BoolVarMatrix X(env,I);
for(IloInt i = 0; i < I; i++){
  X[i] = IloBoolVarArray(env, J);
}

IloBoolVarArray y(env,J);

但是现在我应该将它们放宽到0 <= x <= 1,0 <= Y <= 1的范围。为此,我将定义更改为:

NumVarMatrix X(env,I, 0, 1);
for(IloInt i = 0; i < I; i++){
  X[i] = IloNumVarArray(env, J, 0, 1);
}

IloNumVarArray y(env,J, 0, 1);

但它仍然给我一个整数解决方案。我该怎么做呢?

3 个答案:

答案 0 :(得分:1)

很有可能你的轻松LP也有一个整数的最佳解决方案。一种快速验证方法是添加绑定剪切以强制它采用某些小数值。

修改X1的lb和ub:取0 <= x1 <= 1并使它(比如说)0.01 <= x1 <= 0.99然后解决LP。对原始配方中二进制的所有变量执行此操作。

换句话说,让IloNumVarArray ub lb 为小数,如果在最优解中得到小数值,就知道你了已经放松了。

答案 1 :(得分:1)

您无需将二进制变量转换为ILOFLOAT。定义一个新的模型实例,如LPRelax,并使用IloConversion,如下所示:

$.getScript(chrome.extension.getURL('script.js'), function () {
    console.log("Script loaded")
});

如果您仍然可以获得完整的解决方案,那么您的问题可能是完整的。我的意思是你的coefficinet具有特殊属性,如TOTALY UNIMODULARITY,以及整体RHS产生一个完整的解决方案。

希望它可以提供帮助: - )。

答案 2 :(得分:0)

也许你的约束系数矩阵A(AX = b)是单模的。