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求解器。