首页 > 数据库 > 数据库开发技术 > Or-tools调用求解器介绍(三)
Or-tools作为谷歌运筹优化系列最流行的求解工具之一,其解决常见的规划问题也是非常方便。本文主要介绍其如何调用求解器。
举一个简单线性规划问题。
目标函数:max(x0+x1+x2)
约束条件:
以上是个简单的线性规划(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安装完成后,其实已封装了部分求解器,另外部分求解器若要使用需重新安装),现在一一试验看是否可行。
可求解(Or-tools已封装CLP的LP求解器)
无法求解(使用GLPK求解,需提前安装GLPK)
可求解(Or-tools已封装GLOP的LP求解器)
可求解(Or-tools已封装了SCIP的MIP求解器)
不支持GLPK的MIP求解,需要重新安装。
可求解(Or-tools已封装了CBC的MIP求解器)
无法求解(使用GUROBI求解,需提前安装GUROBI)
无法求解(使用CPLEX求解,需提前安装CPLEX)
无法求解(使用XPRESS求解,需提前安装XPRESS)
可求解(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学习杂记;如有侵权,请联系管理员删除。