我必须找到一些微小的线性编程问题的所有基本解决方案。
以下是一个示例(采用lp_solve格式):
max: x1 + x2;
x1 + x2 <= 1;
x1 <= 0.8;
x2 <= 0.8;
所有2种基本解决方案:
当然有a way找到替代解决方案,但我更喜欢使用现有的库而不是制作我自己的单纯形代码。
我正在使用Python作为我的编程语言,希望lp_solve或GLPK的C API中有一些方法可以做到这一点。
感谢。
答案 0 :(得分:2)
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 simplex例程。一旦获得最佳BFS,您就可以使用例程glp_get_row_dual
获得与所有非基本列相关联的降低成本(变量的基础状态可以通过glp_get_row_stat
获得),因此您可以找到一个非基本变量,其成本降低。然后,我认为您可以使用函数glp_set_row_stat
来更改此列的基本状态,以便让它进入基础。
(然后,只要你避免骑车,你就可以重复这个过程。)
请注意,我自己没有尝试过任何这些解决方案;我认为第一个是迄今为止最好的,尽管它需要你学习PPL API。如果您想要第二个,我强烈建议您发送电子邮件给glpk维护者(或查看源代码),因为我真的不确定它是否会按原样运行。