2012-02-28 133 views
0

我有一个整数编程模型,我想用cplex解决它的线性松弛问题。本来,我已经定义我的变量为:用cplex解决LP问题

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); 

但它仍然给我整数解决方案。我应该做些什么呢?

回答

0

很可能您的宽松LP也有一个最佳的整数解决方案。验证的一个快速方法是添加约束剪切强制它假设一些小数值。

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

换句话说,使UBIloNumVarArray是分数,如果你在你的最佳解决方案中获得的分数值,你知道你做了正确的放松。

0

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

0

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

IloModel LpRelax(env); 
LpRelax.add(model); 
LpRelax.add(IloConversion(env, vars, ILOFLOAT)); 

IloCplex cplex(env); 
cplex.extract(LpRelax); 
cplex.solve(); 

如果你仍然得到整体解决方案,您的问题可能是积分。我的意思是您的coefficinet具有特殊属性,如TOTALY UNIMODULARITY,与整数RHS一起生成完整的解决方案。

希望它可以帮助:-)。