【问题标题】:Find all alternative basic solutions using existing linear-programming tool使用现有的线性规划工具查找所有替代的基本解决方案
【发布时间】:2015-04-16 12:22:26
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: linear-programming glpk lpsolve


    【解决方案1】:

    glpk 没有常规操作;恕我直言,任何现实世界的求解器都不太可能实现类似的东西,因为它在实践中不是很有用,而且肯定不是一个简单的问题。

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

    考虑一个 LP,其域的维度为 n;最优解的集合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来改变这个列的基础状态,让它进入基础。 (然后,只要避免循环,您就可以重复此过程。)

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

    【讨论】:

    • 感谢您的回答!我有非常小的(n
    • 我用两种可能的解决方案编辑了这个问题。请注意,我自己都没试过,所以我不保证任何事情!
    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多