如何在MATLAB中获得LP的最优基矩阵?

时间:2017-12-04 13:56:49

标签: matlab linear-programming

我正在解决标准的LP问题:

min C'*x
S.t. A*x=b;x>=0;

通过linprog获得解决方案后,我想获得对应于该解决方案的最佳基础B.除了MATLAB提供的单工代码对于大规模问题来说非常慢。

我的问题有堕落。

1 个答案:

答案 0 :(得分:1)

非退化LP的最佳基础由λ= 0给出,其中,λ是拉格朗日乘数。在MATLAB中,lambda可用作最终输出,即

[x,fval,exitflag,output,lambda] = linprog(___)

所以要找到基础,只需输入k = find(lambda == 0)

但是,从数值的角度来看,零值是有问题的(在浮点运算中几乎没有任何值完全为0),所以你可能想要满足像k = find(lambda <= 1e-5)这样的东西。但是,再次,根据问题(以及它的表现如何),这可能也不正确。

那么,你能做什么?基本上有两种方法:

  • 使用商业求解器:商业求解器在拉格拉质乘数的准确性方面往往要好得多,特别是对于定义严重的问题。试试Gurobi或CPLEX,如果你是大学生,他们也是免费的。他们有类似的方法来获得lambda,但在我的经历中更可靠。
  • 使用约束值:您基本上执行k = find(x > 1e-5),并查看它为结果提供的内容。这与使用拉格朗日相同的挫折,但它可能会有所帮助。

然而,如果它发生,你仍然需要处理原始和双重简并。不要太过分,但基本上你需要经常检查你是否有n个有效约束(n是优化变量的数量)。如果你有更多或更少,你有问题,你需要对你的代码进行适当的检查。