CPLEX-降低成本

时间:2018-11-28 16:10:29

标签: c++ linear-programming cplex

我目前正在与cplex合作,并试图确定LP降低的成本。结果令我有些困惑。我目前对降低成本的理解是,它描述了在变量可以成为解决方案的一部分(值= 1)之前目标函数系数必须提高的量。

因此,所有基本变量(解决方案中的非零值)的成本降低为零。我读到,如果不是当前解决方案一部分的变量处于其极限之一,那么其成本也可以降低为零。是真的吗?

以下LP的成本降低使我感到困惑:

minimize 100*x1 + 3*x5
0 <= x0, x1, x2, x3, x4, x5, x6, x7, x8
x0 = 1
x0 - x1 - x2 = 0
x3 = 1
x3 - x4 = 0
x1 - x6 = 0
x2 - x7 = 0
-x4 + x5 - x8 = 0
-x5 + x6 + x7 + x8 = 0

如果使用cplex计算降低的成本,则会得到以下结果。

Objective Value = 3
Solution = [1, 0, 1, 1, 1, 1, 0, 1, 0]
Reduced Cost = [0 0 0 0 0 0 100 0 3]

我不明白为什么变量x1的成本降低为零,它既不是解决方案的一部分,也不是上限。 x1的减少值不应该像变量x7那样为100。如果我将x1的值增加一,我得到的解决方案将恶化100(成本),对吧?

在这里,我的C ++代码:

#include <ilcplex/ilocplex.h>

int main () {
  IloEnv             env;
  IloModel     model(env);
  IloNumVarArray   x(env);
  x.add(IloNumVar(env)); //default: between $0$ and $+\infty$ 
  x.add(IloNumVar(env));
  x.add(IloNumVar(env)); 
  x.add(IloNumVar(env));
  x.add(IloNumVar(env)); 
  x.add(IloNumVar(env));
  x.add(IloNumVar(env));
  x.add(IloNumVar(env));
  x.add(IloNumVar(env));
  model.add(x[0] == 1);
  model.add(x[0]-x[1]-x[2] == 0);
  model.add(x[3] == 1);
  model.add(x[3]-x[4] == 0);
  model.add(x[1]-x[6] == 0);
  model.add(x[2]-x[7] == 0);
  model.add(-x[4]+x[5]-x[8] == 0);
  model.add(-x[5]+x[6]+x[7]+x[8] == 0);
  model.add(IloMinimize(env, 100*x[1] + 3*x[5]));
  IloCplex cplex(model);
  cplex.solve();
  std::cout << "Min=" << cplex.getObjValue() << std::endl;
  IloNumArray v(env);
  cplex.getReducedCosts(v, x);
  std::cout << v << std::endl;
  env.end();
}

1 个答案:

答案 0 :(得分:0)

  

我读到,如果当前变量不在其极限之一,则不属于当前解决方案的变量也可以将成本降低为零。是真的吗?

是的。如果变量不在限制范围内,则它们的成本降低为零。如果它们处于其极限之一,那么在存在多个原始最优解的情况下,它们仍然可以将成本降低为零。

然后,您的问题可以看作是以下网络上的流量问题:

enter image description here

每个弧表示其输入的节点的变量值(例如1 = x0)。最优解对应于路径0-2-7-5-4-3,其总成本为3。如果您强制x1(或x6)等于1,则解决方案将更改为x0=x1=x6=x5=x4=x3=1

现在,双重价值和影子价格只有在最佳基础保持不变的情况下才有意义。强制x1=1会更改最佳基础(因为不同的路径是最佳路径),因此相应的对偶值可能没有意义。

对降低的成本的另一种解释是将其视为非负约束的双重价格(即,显示在一个单位的非基本或零级基本中,目标函数将增加多少)假设非负约束,则将变量强制为第1级的基础。同样,如果此更改更改了最佳基础,则其值可能不正确。

由于降低的成本是相应的非负约束的对偶值,因此您可以尝试的另一个实验是显式添加非负约束作为约束,然后检查其对偶值。对于x6>=0,我得到对偶值100,并且右边的允许增量= 1,而对于x1>=0我得到对偶值0,并且右边的允许增量-的0边。这实际上意味着对偶值(在这种情况下为降低的成本)没有意义。

我希望这会有所帮助。