【问题标题】:How to obtain optimal basis matrix B for LP in MATLAB?如何在MATLAB中获得LP的最佳基矩阵B?
【发布时间】:2017-12-04 13:56:49
【问题描述】:

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

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

通过linprog得到解后,我想得到那个解对应的最优基B。 MATLAB 提供以外的单纯形代码对于大规模问题非常慢。

我的问题是退化。

【问题讨论】:

  • Cplex、Gurobi、Xpress 或 Mosek 等求解器在大型问题上比 Matlabs linprog 慢吗?那真是令人惊讶。无论如何,几乎所有 LP 求解器都会返回基础状态数组。
  • 我说的是在 MATLAB 中完成的单纯形代码。我猜 CPLEX 不返回基础索引数组。如果是这样,我怎样才能获得它?
  • 是的。请查阅文档。

标签: matlab linear-programming


【解决方案1】:

非退化 LP 的最优基由 lambda = 0 给出,其中 lambda 是拉格朗日乘数。在 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 是优化变量的数量)。如果你有更多或更少,你就有问题,你需要在你的代码中进行适当的检查。

【讨论】:

  • 其实我的问题确实退化了。我尝试了 Meggido 的算法来获得基础,但由于我的编程风格,我猜这需要太多时间,即使是 1000x1000 的问题也是如此。是否有任何求解器提供最佳基础?
  • 使用 Gurobi 或 CPLEX,然后尝试。检查解决方案中的非零变量。
  • 我已经尝试过 CPLEX,但是,lambda 值的零个数小于变量数。
  • 那么你需要重新审视你的问题表述。要么你有数值问题(缩放,接近零的东西等),要么你必须适当地分析一些结构退化。一种常见的方法是进行敏感性分析(即稍微改变你的系数 b 和 c),看看会出现什么解决方案。
猜你喜欢
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
  • 2013-05-06
  • 1970-01-01
  • 2019-05-08
  • 2011-06-18
相关资源
最近更新 更多