使用现有的线性编程工具查找所有其他基本解决方案

时间:2015-02-16 02:45:04

标签: linear-programming glpk lpsolve

我必须找到一些微小的线性编程问题的所有基本解决方案。

以下是一个示例(采用lp_solve格式):

max: x1 + x2;
x1 + x2 <= 1;
x1 <= 0.8;
x2 <= 0.8;

所有2种基本解决方案:

  • x1 = 0.2,x2 = 0.8
  • x1 = 0.8,x2 = 0.2

当然有a way找到替代解决方案,但我更喜欢使用现有的库而不是制作我自己的单纯形代码。

我正在使用Python作为我的编程语言,希望lp_solveGLPK的C API中有一些方法可以做到这一点。

感谢。

1 个答案:

答案 0 :(得分:2)

glpk没有例行公事;恕我直言,任何真实世界的解算器都不太可能实现类似的东西,因为它在实践中并不是很有用,而且肯定不是一个简单的问题。

使用单纯形算法达到最优性后,确实很容易找到一个其他基本解决方案,这并不意味着很容易将它们全部列出。

考虑一个域名为n的LP;最优解的集S是凸多面体,其维m可以是0n-1之间的任何值。 你想要一个方法来列出问题的所有基本解决方案,即S的所有顶点:只要m大于2,你就需要小心避免骑行另一个基本解决方案。

然而,(幸运的是!)不需要编写自己的单纯形代码:您可以使用glpk库访问当前基础的内部,也可以使用lpsolve。

编辑:两种可能的解决方案

  1. 更好的方法是使用其他库,例如PPL。 假设您遇到以下形式的问题:

    min cx; subject to: Ax <= b
    

    首先使用glpk解决您的问题,这将为您提供问题的最佳值V。从这一点开始,您可以使用PPL来获得最佳值的多面体描述:

    cx = V and Ax <= b
    

    作为其极端点的凸包,对应于您正在寻找的BFS。

  2. 您可以(可能)使用glpk simplex例程。一旦获得最佳BFS,您就可以使用例程glp_get_row_dual获得与所有非基本列相关联的降低成本(变量的基础状态可以通过glp_get_row_stat获得),因此您可以找到一个非基本变量,其成本降​​低。然后,我认为您可以使用函数glp_set_row_stat来更改此列的基本状态,以便让它进入基础。 (然后,只要你避免骑车,你就可以重复这个过程。)

  3. 请注意,我自己没有尝试过任何这些解决方案;我认为第一个是迄今为止最好的,尽管它需要你学习PPL API。如果您想要第二个,我强烈建议您发送电子邮件给glpk维护者(或查看源代码),因为我真的不确定它是否会按原样运行。