【问题标题】:binary linear programming solver in PythonPython中的二元线性规划求解器
【发布时间】:2010-07-24 17:22:02
【问题描述】:

我有一个 Python 脚本,我需要在其中解决一个线性规划问题。问题是解决方案必须是二进制的。换句话说,我需要一个等效于 MATLAB 的 bintprog 函数。 NumPy 和 SciPy 似乎没有这样的程序。有没有人对我如何做这三件事之一有建议:

  • 查找包含此类函数的 Python 库。

  • 约束问题,使其可以通过更通用的线性规划求解器求解。

  • 将 Python 与 MATLAB 连接,以便直接使用 bintprog

【问题讨论】:

    标签: python matlab linear-programming


    【解决方案1】:

    严格来说,如果问题是二元规划问题,那么它就不是线性规划。

    你可以试试CVXOPT。它具有整数编程功能(请参阅this)。要使您的问题成为二进制程序,您需要添加约束 0

    编辑:您实际上可以将变量声明为二进制,因此您不需要添加约束 0

    cvxopt.glpk.ilp = ilp(...)
    Solves a mixed integer linear program using GLPK.
    
    (status, x) = ilp(c, G, h, A, b, I, B)
    
    PURPOSE
    Solves the mixed integer linear programming problem
    
        minimize    c'*x
        subject to  G*x <= h
                    A*x = b
                    x[I] are all integer
                    x[B] are all binary
    

    【讨论】:

    • 添加约束0 &lt;= x &lt;= 1 不会生成二进制程序。它只是二进制程序的LP松弛,可以作为二进制程序求解方法的一部分。
    • 我是说将约束 0
    • 嗯....是的,不是的。仅具有二进制/整数变量的线性程序称为 ILP(整数线性程序)。具有二进制/整数变量和连续变量的线性程序称为 MILP(混合整数线性程序)。在这种情况下,术语“整数”和“二进制”可以互换使用,因为任何整数变量都可以使用多个二进制变量(即 SOS 类型 1)来表示。但是,如果将 x 声明为通用整数变量,则应该强加 0
    【解决方案2】:

    这是一个半答案,但您可以使用 Python 与 GLPK 交互(通过 python-glpk)。 GLPK 支持整数线性规划。 (二进制程序只是整数程序的一个子集)。

    http://en.wikipedia.org/wiki/GNU_Linear_Programming_Kit

    或者您可以简单地用 Python 编写问题并生成 MPS 文件(大多数标准 LP/MILP(CPLEX、Gurobi、GLPK)求解器都可以接受)。这可能是一条不错的路线,因为据我所知,没有任何 Python 原生的高质量 MILP 求解器(可能永远不会有)。这也将允许您尝试不同的求解器。

    http://code.google.com/p/pulp-or/

    至于 Python 与 MATLAB 的接口,我会推出自己的解决方案。您可以生成一个 .m 文件,然后从命令行运行它

    % matlab -nojava myopt.m
    

    注意事项

    1. 如果您是学术用户,您可以获得 Gurobi 的免费许可,这是一款高性能 LP/MILP 求解器。它有一个 Python 接口。 http://www.gurobi.com/
    2. OpenOpt 是一个 Python 优化套件,可与不同的求解器交互。 http://en.wikipedia.org/wiki/OpenOpt

    【讨论】:

      【解决方案3】:

      我开发了一个名为 gekko (pip install gekko) 的包,它解决了线性、二次、非线性和混合整数规划(LP、QP、NLP、MILP、MINLP)的大规模问题,并在 MIT 许可下发布。二进制变量声明为整数变量类型,其下限 0 和上限 1 为 b=m.Var(integer=True,lb=0,ub=1)。这里有一个更complete problem 使用m.Array() 来定义多个二进制变量:

      from gekko import GEKKO
      m = GEKKO()
      x,y = m.Array(m.Var,2,integer=True,lb=0,ub=1) 
      m.Maximize(y)
      m.Equations([-x+y<=1,
                   3*x+2*y<=12,
                   2*x+3*y<=12])
      m.options.SOLVER = 1
      m.solve()
      print('Objective: ', -m.options.OBJFCNVAL)
      print('x: ', x.value[0])
      print('y: ', y.value[0])
      

      【讨论】:

        猜你喜欢
        • 2015-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多