常见的规划问题都包括哪些?
LP:Linear Programming 线性规划
研究线性约束条件下线性目标函数的极值问题
ILP:Integer Linear Programming 整数线性规划
全部决策变量必须为整数
MIP:Mixed Integer Programming 混合整数规划
混合整数规划是LP的一种,其中部分的决策变量是整数(不要求全部都是整数)
VRP:Vehicle Routing Problem 车辆路径问题
常用的规划工具包都有哪些?
pulp
只用于线性模型,包括如整数规划、01规划,还是混合整数线性规划 MILP
ortools
Google开发,用于优化的开源软件
可以解决车辆路径、流程、整数和线性规划等问题
提供了C++,Python,Java,.NET接口
TSP与VRP问题的关系是怎样的?
旅行商问题(Traveling Salesman Problem, TSP)
字面上的理解是:有一个推销员,要到n个城市推销商品,他要找出一个包含所有n个城市的具有最短路程的环路。
多回路运输问题(Vehicle Routing Problem, VRP)
多回路运输问题在物流中的解释是对一系列客户的需求点设计适当的路线,使车辆有序地通过它们,在满足一定的约束条件下,如货物需求量、发送量、交发货时间、车辆载重量限制、行驶里程限制、时间限制等等,达到一定的优化目标,如里程最短、费用最少、时间最短,车队规模最少、车辆利用率高。
VRP问题和TSP问题的区别在于:客户群体的数量大,只有一辆车或一条路径满足不了客户的需求,必须是多辆交通工具以及运输工具的行车顺序两个问题的求解。相对于TSP问题,VRP问题更复杂,求解更困难,但也更接近实际情况。
Ortools求解器:
线性规划,默认使用GLOP
整数规划,默认使用CBC(Coin-or branch and cut),还包括SCIP、GLPK、Gurobi等
开源求解器,在计算性能和规模上弱于商业求解器,适用于中小企业及普通问题
# 求解器定义
solver = pywraplp.Solver.CreateSolver('SCIP')
solver= pywraplp.Solver('AssignmentProblem', pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
solver = pywraplp.Solver('AssignmentProblem', pywraplp.Solver.CBC_MIXED_INTEGER_PROGRAMMING)
ortools:
整数规划求解器,默认使用CBC(Coin-or branch and cut),还包括SCIP、GLPK、Gurobi等
Solver创建
solver = pywraplp.Solver.CreateSolver('SCIP')
变量设置
solver.NumVar:创建普通变量
solver.IntVar:创建整数变量
infinity = solver.infinity() # 正无穷
x = solver.IntVar(0.0, infinity, 'x')
print('变量数量:', solver.NumVariables())
添加约束条件
solver.Add(x + 7 * y <= 17.5)
print('约束的数量:', solver.NumConstraints())
Solve求解
# 求解最大值问题
solver.Maximize(x + 10 * y)
status = solver.Solve()
Solve的结果
print('目标值 =', solver.Objective().Value())
print('x =', x.solution_value())
print('y =', y.solution_value())