Discrete Optimization课程笔记(4)—前沿与工具

目录

1.大规模邻域搜索(Large Neighborhood Search)

Case1: 带时间窗的非对称TSP(Asymmetric TSP with Time Windows)

2.列生成算法(Column Generation)

Case2: Cutting Stock

3.优化工具汇总


1.大规模邻域搜索(Large Neighborhood Search)

大规模邻域搜索是局部搜索和CP/MIP的结合,例如CP和局部搜索结合:

  • 从一个可行解开始(CP)
  • 选择邻域(LS)
  • 优化邻域(CP)
  • 重复第二步

局部搜索能解决大规模问题,而约束规划适合找到一个可行解和优化小规模的组合空间,将两者结合,用约束规划来优化每一次局部搜索的大规模邻域从而找到最佳的某个邻域解。如何找到大规模邻域?可以固定某些变量子集的取值,只改变其它变量生成邻域,这个子集的确定依赖于问题的结构。

Case1: 带时间窗的非对称TSP(Asymmetric TSP with Time Windows)

有一些需要到达的地方,每个位置有一个服务时间,其到达时间也有一个时间窗限制,某些位置之间的距离可能非对称,要求找到哈密尔顿回路,能满足时间窗要求并且最小化总距离。在CP模型中,增加每个activity开始和结束时间约束,用调度表可以表示如右图,横段代表时间窗,用LNS求解ATSPTW,则先固定某些点的位置,更改其它点的位置生成大规模的邻域,这些点可以是一起的,也可以是随机的。通过TSP benchmark,和branch cuts算法相比,LNS能更短时间内找到差不多解。

Discrete Optimization课程笔记(4)—前沿与工具_第1张图片

2.列生成算法(Column Generation)

总结MIP算法,以下均基于线性松弛

  • branch and bound:分支定界
  • cutting plane:割平面法
  • branch and cuts:分支割平面,BB+cut,按需在节点处对线性松弛切割
  • branch and price:分支定价,BB+列生成(CG),在节点生成列获得增强松弛

接下来通过Cutting Stock问题介绍列生成算法,该问题是由Gilmore and Gomory提出,Gomory提出了割平面算法中的Gomory切割

先回顾一下Reduced Cost 和 Dual Variables,根据LP的矩阵表示推导,目标函数cx=c_{B}^{T}B^{-1}b+(c_{N}^{T}-c_{B}^{T}B^{-1}N)x_{N},其中c_{N}^{T}-c_{B}^{T}B^{-1}N称为Reduced Cost,如果存在某个非基变量Xn使其对应的Reduced Cost<0,那么增加Xn的值就能使目标值再降低,表明还有优化空间,因此找到的解能实现Reduced Cost>=0时,证明找到了最优解

Discrete Optimization课程笔记(4)—前沿与工具_第2张图片

假设原问题最优解为[x_{B},0],如下图推导可知c_{B}^{T}B^{-1}为对偶问题最优解,因此可以得到Reduced Cost与对偶变量的关系,reduced cost=c_{N}^{T}-c_{B}^{T}B^{-1}N=c_{N}^{T}-dual*N

Discrete Optimization课程笔记(4)—前沿与工具_第3张图片

Case2: Cutting Stock

假设需要长度为3,7,9,16米的钢管各25,30,14,8根,目前只有长度为20米的钢管若干,请安排合理地切割方案,使得消耗的钢管数量最少。有两种建模思路

  • 常规思路:0/1变量表示为是否使用某根钢管,这种建模存在对称问题,线性松弛解不好
  • 列生成思路:不考虑是否选择某根钢管,而是决定某种切割模式(configuration)使用次数,这样建模没有容量约束,也没有决策变量对称性问题

切割组合有很多,不可能一次性枚举所有的组合集合,也没有必要,因此有些切割模式可能用不到,那么如何找到好的切割模式? 

Discrete Optimization课程笔记(4)—前沿与工具_第4张图片

用列生成求解cutting stock problem 

(1)首先给定初始的切割模式,求解模型得到对偶变量取值\lambda _{i}

Discrete Optimization课程笔记(4)—前沿与工具_第5张图片

(2)加入新的切割模式p_{new}能优化目标函数值,说明变量z_{new}的reduced cost<0,即reduced cost=c_{n}^{T}-c_{B}^{T}B^{-1}n=c_{n}^{T}-dual*n,在本问题中,c_{n}^{T}=1,dual取值为前面的\lambda _{i},n为变量z_{new}的系数矩阵,也就是新切割模式每种长度的数量,因此reduced cost=1-\sum \lambda _{i}c_{ipnew}<0,选择reduced cost最小的切割模式加入集合中

Discrete Optimization课程笔记(4)—前沿与工具_第6张图片

(3)重新构造一个子问题,找到reduced cost最小的组合,同时满足长度约束,最大程度优化目标值

Discrete Optimization课程笔记(4)—前沿与工具_第7张图片

综上可知,列生成的思路:和没有加入新切割的模型相比,可以看做z_{pnew}=0,因此即便在约束中没有体现也无关,通过子问题找到reduced cost最小的切割组合,重新优化模型,完整的实例求解过程如下: 

Discrete Optimization课程笔记(4)—前沿与工具_第8张图片

Discrete Optimization课程笔记(4)—前沿与工具_第9张图片

3.优化工具汇总

Constraint Programming Solvers

  • CHOCO - java库,开源
  • Gecode - c++,免费
  • ILog - binary,使用学术许可证免费
  • JACOP - java,开源
  • MiniZinc / G12 - binary,学生免费
  • or-tools - C++,开源,APIs - Java,Python和.NET

Mixed Integer Programming Solvers

  • BCP - c++,开源
  • CBC - c++,开源
  • CPlex - binary,使用学术许可证免费
  • GLPK - c,开源
  • gurobi - binary,使用学术许可证免费
  • LPSolve - c,开源
  • SCIP - binary,使用学术许可证免费

Linear Programming Solvers

  • CLP - c++,开源
  • SimplexSolver - java,开源

Local Search Solvers

  • Local Solver - binary,使用学术许可证免费
  • OptaPlanner - java,开源

SAT Solvers

  • cryptominisat - c++,开源
  • Glucose - c,开源
  • Lingeling - c,开源
  • MiniSat - binary,开源
  • UBCSAT - c,开源

Hybrid Solvers

  • SCIP - binary,学术使用免费

你可能感兴趣的:(Coursera,离散优化,运筹学,列生成算法)