常见规划问题

一、规划问题

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方案

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值