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

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

这是一个例子(以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中有一些方法可以做到这一点.

谢谢.

最佳答案 使用glpk没有常规做法;恕我直言,任何真实世界的解算器都不太可能实现类似的东西,因为它在实践中并不是很有用,它肯定不是一个简单的问题.

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

考虑一个域名为n的LP;最优解的集合S是凸多面体,其维数m可以是从0到n-1的任何值.
您需要一种方法来列出问题的所有基本解决方案,即S的所有顶点:只要m大于2,当您从一个基本解决方案移动到另一个基本解决方案时,您将需要小心避免循环.

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

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

>更好的方法是使用另一个库,例如PPL.
假设您遇到以下问题:

min cx; subject to: Ax <= b

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

cx = V and Ax <= b

作为其极端点的凸包,对应于您正在寻找的BFS.
>你可以(可能)使用glpk单工程序.获得最佳BFS后,您可以使用例程glp_get_row_dual获取与所有非基本列关联的降低成本(可以使用glp_get_row_stat获取变量的基础状态),因此您可以找到一个带有null的非基本变量降低成本.然后,我认为你可以使用函数glp_set_row_stat来改变这个列的基础状态,以便让它进入基础.
(然后,只要你避免骑车,你就可以重复这个过程.)

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

点赞