一、规划问题
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接口
pulp调包:
import pulp
#目标函数的系数
z = [2, 3, 1]
#约束
a = [[1, 4, 2], [3, 2, 0]] b = [8, 6]
#确定最大化最小化问题,最大化只要把Min改成
#定义三个变量放到列表中 x = [pulp.LpVariable(f'x{i}', lowBound=0) for i in [1,2,3]]
#定义目标函数,lpDot可以将两个列表的对应位相乘再加和
#相当于z[0]*x[0]+z[1]*x[0]+z[2]*x[2]
m += pulp.lpDot(z, x)
#设置约束条件
for i in range(len(a)):
m += (pulp.lpDot(a[i], x) >= b[i])
m.solve() #求解
三、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:创建整数变量
四、Santa服务调度
Step1, 数据加载
Step2,数据预处理 1)计算Perference Cost矩阵 pcost_mat 2)计算Accounting Cost矩阵 acost_mat 3)计算每个家庭的人数 FAMILY_SIZE 4)每个家庭的倾向选择(choice_) DESIRED
Step3,使用LP和MIP求解 规划方案 1)先使用LP 对绝大部分家庭进行规划 2)再使用MIP 对剩余家庭进行规划 3)汇总两边的结果 => 最终规划方案
Step4, 结果评估 按照evaluation标准,计算 Score = preference cost + accounting penalty
Step5,方案优化 通过更换family_id的选择,查找更好的score 每次更换后,都对方案进行评估,选择更小的score方案