ITPub博客

首页 > 数据库 > 数据库开发技术 > Or-tools调用求解器介绍(三)

Or-tools调用求解器介绍(三)

原创 数据库开发技术 作者:derekwh 时间:2022-05-31 18:39:06 0 删除 编辑


Or-tools作为谷歌运筹优化系列最流行的求解工具之一,其解决常见的规划问题也是非常方便。本文主要介绍其如何调用求解器。

举一个简单线性规划问题。

目标函数:max(x0+x1+x2)

约束条件:

ortools求解

以上是个简单的线性规划(lp问题),调用ortools的规划求解函数。其求解代码如下:

from ortools.linear_solver import pywraplp
def solve_coexistence():
    t = 'model_1'
    s = pywraplp.Solver(t,pywraplp.Solver.CLP_LINEAR_PROGRAMMING)#选择求解器
    x = [s.NumVar(0,1000,'x[%i]' % i) for i in range(3)]#设置变量范围
    pop = s.NumVar(0,float('inf') ,'pop')# 目标函数限定范围(可不设置)
    s.Add(2*x[0] + x[1] + x[2] <= 1500)#约束1
    s.Add(x[0] + 3*x[1] + 2*x[2] <= 3000)#约束2
    s.Add(x[0] + 2*x[1] + 3*x[2] <= 4000)#约束3
    s.Add(pop == x[0] + x[1] + x[2])#目标函数
    s.Maximize(pop)#求最大值
    s.Solve()
    return pop.SolutionValue(),[e.SolutionValue() for e in x]
solve_coexistence()

本例调用的是CLP_LINEAR_PROGRAMMING求解器。可以查看pywraplp.py文档看看其底层代码如何调用求解器。

class Solver(object):
    thisown = property(lambda x: x.this.own(), lambda x, v: x.this.own(v), doc="The membership flag")
    __repr__ = _swig_repr
    CLP_LINEAR_PROGRAMMING = _pywraplp.Solver_CLP_LINEAR_PROGRAMMING
    GLPK_LINEAR_PROGRAMMING = _pywraplp.Solver_GLPK_LINEAR_PROGRAMMING
    GLOP_LINEAR_PROGRAMMING = _pywraplp.Solver_GLOP_LINEAR_PROGRAMMING
    SCIP_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_SCIP_MIXED_INTEGER_PROGRAMMING
    GLPK_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_GLPK_MIXED_INTEGER_PROGRAMMING
    CBC_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_CBC_MIXED_INTEGER_PROGRAMMING
    GUROBI_LINEAR_PROGRAMMING = _pywraplp.Solver_GUROBI_LINEAR_PROGRAMMING
    GUROBI_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_GUROBI_MIXED_INTEGER_PROGRAMMING
    CPLEX_LINEAR_PROGRAMMING = _pywraplp.Solver_CPLEX_LINEAR_PROGRAMMING
    CPLEX_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_CPLEX_MIXED_INTEGER_PROGRAMMING
    XPRESS_LINEAR_PROGRAMMING = _pywraplp.Solver_XPRESS_LINEAR_PROGRAMMING
    XPRESS_MIXED_INTEGER_PROGRAMMING = _pywraplp.Solver_XPRESS_MIXED_INTEGER_PROGRAMMING
    BOP_INTEGER_PROGRAMMING = _pywraplp.Solver_BOP_INTEGER_PROGRAMMING
    SAT_INTEGER_PROGRAMMING = _pywraplp.Solver_SAT_INTEGER_PROGRAMMING

该文件在安装的Or-tools包中。其支持的求解器较多(Or-tools安装完成后,其实已封装了部分求解器,另外部分求解器若要使用需重新安装),现在一一试验看是否可行。

CLP_LINEAR_PROGRAMMING

可求解(Or-tools已封装CLP的LP求解器)

GLPK_LINEAR_PROGRAMMING

无法求解(使用GLPK求解,需提前安装GLPK)

GLOP_LINEAR_PROGRAMMING

可求解(Or-tools已封装GLOP的LP求解器)

SCIP_MIXED_INTEGER_PROGRAMMING

可求解(Or-tools已封装了SCIP的MIP求解器)

GLPK_MIXED_INTEGER_PROGRAMMING

不支持GLPK的MIP求解,需要重新安装。

CBC_MIXED_INTEGER_PROGRAMMING

可求解(Or-tools已封装了CBC的MIP求解器)

GUROBI_LINEAR_PROGRAMMING

无法求解(使用GUROBI求解,需提前安装GUROBI)

CPLEX_LINEAR_PROGRAMMING

无法求解(使用CPLEX求解,需提前安装CPLEX)

XPRESS_MIXED_INTEGER_PROGRAMMING

无法求解(使用XPRESS求解,需提前安装XPRESS)

SAT_INTEGER_PROGRAMMING

可求解(Or-tools已封装了SAT整数规划(IP)求解器)

总结

OR-tools的pywraplp方法求解。可调用各类求解器。大部分商业求解器比如(groubi、cplex、xpress等需要安装和授权才能使用)。像CLP/SCIP/GLOP/SAT部分功能已封装至Or-tools可直接调用。已封装的求解器及功能有(无需再重新安装):CLP的LP求解器/SCIP的MIP求解器/GLOP的LP求解器/CBC的MIP求解器/SAT的IP求解器。

原文作者:Python学习杂记;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
央企算法工程师,微信公众号: python数智工坊

注册时间:2021-03-14

  • 博文量
    305
  • 访问量
    162323