为什么我只得到LP的整数解

Why do I only get integer solutions to my LP?

本文关键字:整数 LP 为什么      更新时间:2023-10-16

我有一个整数规划模型,我想用CPLEX求解它的线性松弛。最初,我将变量定义为:

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

但现在我应该将它们放松到0<=x<=10<=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);

但它仍然给了我一个整数解。我该怎么办?

很可能您的松弛LP也有一个整数的最优解。验证这一点的一种快速方法是添加绑定剪切,迫使其采用一些分数值。

修改X1的lb和ub:取0 <= x1 <= 1,使其成为(比如)0.01 <= x1 <= 0.99,现在求解LP。对原始公式中的所有二进制变量执行此操作。

换句话说,使IloNumVarArrayublb是分数的,如果你在最优解中得到分数值,你就知道你做了正确的松弛。

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

IloModel LpRelax(env); 
LpRelax.add(model); 
LpRelax.add(IloConversion(env, vars, ILOFLOAT));
IloCplex cplex(env); 
cplex.extract(LpRelax); 
cplex.solve();

如果你仍然得到积分解,那么你的问题可能是积分。我的意思是,你的系数网有特殊的性质,比如TOTALY UNIMODULARITY,和积分RHS一起产生积分解。

希望它能有所帮助:-)。

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