【问题标题】:Why do I only get integer solutions to my LP?为什么我只能得到我的 LP 的整数解?
【发布时间】:2012-02-28 02:30:42
【问题描述】:

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

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

IloBoolVarArray y(env,J);

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

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

【问题讨论】:

    标签: c++ integer boolean cplex


    【解决方案1】:

    很可能您的宽松 LP 也有一个整数的最优解。一种快速验证的方法是添加绑定切割以强制它采用一些小数值。

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

    换句话说,使IloNumVarArrayublb 为小数,如果您在最优解中得到小数,您就知道您已经完成了放松的权利。

    【讨论】:

      【解决方案2】:

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

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

      如果您仍然得到积分解决方案,那么您的问题可能是积分。我的意思是您的 coefficinet 具有特殊属性,例如完全单模性,与积分 RHS 一起产生积分解决方案。

      希望它可以帮助:-)。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-04
          • 1970-01-01
          • 1970-01-01
          • 2017-12-31
          • 2022-01-15
          • 1970-01-01
          • 2021-12-20
          相关资源
          最近更新 更多