我正在解决标准的LP问题:
min C'*x
S.t. A*x=b;x>=0;
通过linprog
获得解决方案后,我想获得对应于该解决方案的最佳基础B.除了MATLAB提供的单工代码对于大规模问题来说非常慢。
我的问题有堕落。
答案 0 :(得分:1)
非退化LP的最佳基础由λ= 0给出,其中,λ是拉格朗日乘数。在MATLAB中,lambda可用作最终输出,即
[x,fval,exitflag,output,lambda] = linprog(___)
所以要找到基础,只需输入k = find(lambda == 0)
。
但是,从数值的角度来看,零值是有问题的(在浮点运算中几乎没有任何值完全为0),所以你可能想要满足像k = find(lambda <= 1e-5)
这样的东西。但是,再次,根据问题(以及它的表现如何),这可能也不正确。
那么,你能做什么?基本上有两种方法:
k = find(x > 1e-5)
,并查看它为结果提供的内容。这与使用拉格朗日相同的挫折,但它可能会有所帮助。 然而,如果它发生,你仍然需要处理原始和双重简并。不要太过分,但基本上你需要经常检查你是否有n
个有效约束(n
是优化变量的数量)。如果你有更多或更少,你有问题,你需要对你的代码进行适当的检查。