圆弧裁剪算法c++_优化 | 从集合划分问题到列生成算法

8aaaca323d3e1a7e83a933c943f0d560.png

作者:高源

f06389e603974637e60e71d790ec2aab.png

编者按:

本文由传统集合划分优化问题入手,结合工业背景,引入列生成技术在路径优化选择中的运用,并使用经典例子解释特殊结构在列生成算法中的重要使用。

一、集合划分问题

集合划分问题是组合优化中的一类经典问题,其大框架可被定义为将一组集合中的元素划分多个互斥非空集合。其数学表达可以为:对于集合

和集合
,找到一个划分
满足

0ea80b49a288ed0e720152c2a44ab1fa.png

约束条件即意味着划分集合的并集等于原集合,且用于划分的任意两个不同集合不相交。

当集合

被赋予成本
时,该问题就转化为一个优化问题,即找到成本最小的分割。

二、集合划分到路径优化选择

于上述理论,当我们把集合I看做一系列分布在不同地理位置的订单集合S看做是一系列途经其中某些地理位置的路线,成本c定义为经营每条路径的成本(包括使用成本,运营成本),该问题则成为了一个传统的路径优化问题之一,即找到覆盖所有订单的成本最小路径集合
首先,我们将该问题用数学模型表示

2357f739eefd93ca4dbbc692ec788e1c.png

其中变量为

,代表着路径r是否被选择使用,如果选择那么
,否则等于0。

参数
为每条路径的成本,则目标函数代表成本最小化路径选择。而
即代表该路径特征,如果路径r经过订单i所在位置,则
,否则等于0。

我们将使用一个小例子来帮助理解,
每条路径的成本:

936e5686c51b15a25d21a9baec3cc946.png

每条路径的特征:

6f7f2e47900fe3f62c02d28da928b204.png

每条路径的决策变量:

97d429ba1e75d6d79e9541eb0f03cae6.png

同时,我们可以对此整数规划进行松弛,即去掉整数约束使得其成为线性优化,以更方便理解和阐释列生成算法。
通常而言,如果规划问题为IP(integer programming, 整数规划)或者MIP(mixed integer programming, 混合整数规划)则算法过程将更为复杂,基于不同问题运用到的算法有Branch and Bound(分枝定界), Cutting plane(割平面), Danzig-Wolf, Column Generation(列生成)等或其他组合算法例如branch and cut(分枝裁剪法), branch and pricing(分枝定价)等。
松弛后在处理实际问题时,我们会面临两个问题:
1) 订单数目增长导致可行路径的数目N通常十分巨大,我们如何找到所有的可行路径?
2) 如果已找到N条可行路径,如何快速求解这一庞大的整数规划?
通常我们有针对该问题的解决办法为:
1)使用启发式算法,比如Local Search: Hill Climbing, 2-opt, 3-opt, k-opt或者Metaheuristics: Genetic Algorithm (GA), Simulated Annealing (SA), Tabu Search (TS)去找寻“可行最优”路径。
2)使用列生成算法,计算成本降低数值后仅加入有效的路径进行求解。或同时在列生成算法过程中,找寻具有特殊结构的Pricing Model(之后将会展现例子)求解出最优被加入的列(路径)。
本篇文章将主要简单介绍如何使用列生成技术,基于已有所有可行路径的情况下,加速算法过程,得到最优解。同时会介绍针对另一经典问题(cutting stock problem) ,阐述如何使用pricing model的特殊结构更加快速有效的求解。

三、单纯形法回顾

首先在介绍列生成前,我们需要回顾一下基于线性规划的单纯形法与我们将会使用到的一些变量定义:

定义1:基础可行解(b.f.s.) x:即为满足

1)有n个线性无关的约束在x为等式

2)所有等式约束在x处成立

3)满足所有约束条件

定义2:极点(extreme point):即为b.f.s.的几何表示,也有人形象的描述它为corner point。

我们可以用一个简单的例子来阐述,在二维平面用

05a8f808790e22ddaa54699733d330c2.png

所围成的区域内(2,0) 即为唯一的极点。

ebecc9a931afe08bbf54aef6fa64f0d3.png

定理:若线性规划(L)的可行域非空,且(L)存在有限最优解,则目标函数的最优值可在某个极点达到。

单纯形法步骤说明与利用上述路径分配例子进行定义的可视化:

步骤1:

对于线性规划问题,我们首先需要进行PhaseΙ单纯形法以得到一个b.f.s., 否则该问题无解。

例子1

即上述例子中最直观的

483dc51fa199414ea5c0fe60b6e18a0f.png

步骤2:

基于b.f.s.与其对应的基矩阵,对于非基础解变量,计算reduced cost以判断是否已得最优解,如果reduced cost均非负则停止,否则判断哪一个列j需要加入到基础矩阵

例子2:

b.f.s.对应的基矩阵:

d580f3a24ce9a85e60408a29ca731904.png

基础解变量:

0582c3ef0f3001999cbeb13dc4053443.png

非基础解变量:

45bd942cd06178f154dfa990e8b4e0fd.png

reduced cost:

4942b4a3154574d1120b6a3c4f50b5ad.png

其中r∈{6,7,8,9,10}

步骤3:

计算解的更新方向与步长

例子3:

更新方向:

b2c930c9833c417fcfac83cb98369393.png

其中

为被选中加入的非基础解列

步长:

7cc45509238d0a0efa5c71ae9731e818.png

步骤4:

判断哪个列将移出基础矩阵

例子4:

达到最小步长,则
移出基矩阵

步骤5:

更新基矩阵

9d9db7acfe3b67579d916d021dd5e80f.png

四、列生成算法流程

列生成顾名思义即对于原问题(Master Problem, MP)一开始仅适用部分列(基矩阵)进行计算(Restricted Master Problem, RMP),基于基矩阵建立pricing model,基于计算结果,选择下一循环需要加入的列或者判断已达到最优解。

在该例子中MP即为:

2357f739eefd93ca4dbbc692ec788e1c.png

RMP:

0f1d1a1c0c08bb88602246dfb24b22f5.png

其中R'为R的子集

Pricing Model 即为寻找具有最小reduced cost 的非基础列加入求解矩阵中,即求解

9b706f76aa965ab5f5d0ebbe81207c73.png

如果w≥0, 则目前可行解为最优解,否则加入使得reduced cost最小的列进入求解矩阵进行求解。

即其算法流程图为:

34a8542286b92a7e60f0dd5889a839a8.png

因为这一算法流程,我们将保证其可以停止(不会重复循环)且总是能计算得出最优解。

五、小规模基于路径优化问题执行列生成

现在将继续适用上述例子模拟该算法:

  1. 选择路径1,2,3,4,5,即基矩阵

16456f9b72d66ae96ecde7996953ca65.png

建立RMP

bddb2c5abb1bfd88a0fd9a63a29c6f64.png

2.计算reduced cost

30bc709076bbc3393c698f69c193042b.png

加入基矩阵进行求解

3. 重复上述过程,移入

后w≥0

4.因此,我们得到了最优解

0fb26b8abddaba7b55e6e19d48b8c3ab.png

但是求解pricing model, reduced cost与求解原模型是同等困难的

因此对于Pricing Model:

2ccace056059b6f2d0a06c548a1b5468.png

我们可以通过其对偶问题(Constraint generation)以及强对偶定理,将此步骤替换为计算

fa63ab21652586ce78dcea8e749b48dc.png

y为其对偶变量,对于多数求解器例如CPLEX而言是非常容易获得的,这将使得计算变得容易。

由于此处提及了对偶问题,因此在此列举对偶问题的对应模型但不过多介绍,如果感兴趣可以更深入的研究:

35c25277a1dc411a2a1af48c72eb0fd5.png

(MP: Master Problem; DMP: Dual Master Problem; RMP: Restricted Master Problem; DRMP: Dual Restricted Master Problem)

六、特殊结构在列生成算法中的作用

同时,我们还可以对某些具有特殊结构的Pricing Model进行再构造,直接计算出需要加入的列,而无需一开始通过其他算法得到所有可行列。

比如经典问题cutting stock problem,以下用以数值化小例子帮助理解:

某公司生产长度为100的纸张,而其订单来自于三个拥有不同长度需求的客户,他们需要长度为25,35,45的纸张各150,200,300张。那么为了满足需求,应该如何剪裁使得使用的纸张数最少呢?

bafc0a151cf4558bc3c8ef944be54a9f.png

对此,我们有以下的模型:

5d736397db420f6e2c60fc680b4c5b43.png

因为,该篇文章主要介绍列生成,因此首先对该问题进行松弛,使其成为线性规划。

当我们开始进行列生成时,我们选择{9,10,11}作为解矩阵,那么可以得到

1a653adbd34cb0f1895b174f7a5c10c7.png

紧接着,针对该问题进行Pricing Model的建立:

ba15cb7417c24f7476d5bc43c4f51c3d.png

即该问题转化为找到可行的列

使得
最大,
即为对偶变量。

因为该问题的特殊结构,它变为了经典的knapsack problem,可迅速求解问题。

首先该轮目标函数为:

eb5b12531c440f6aa75ad254d5f10d89.png

其约束条件为:其剪裁不可以超过总长度100,且每一种长度类型的剪裁数目必须为整数且大于等于0:

6ba836ac45ed67c5e34b0a9ff96f2816.png

那么第一轮求解可得:

7a9d69aa9512562db4f09fc3bdeb1b17.png

因此,我们需要循环重复上述过程直到reduced cost非负。

f2b4ba4953aa5c66dbc2ec9f48e8e0c1.png

最终经过4次求解,我们得到了最优解。

如果大家对Cutting Stock Problem + Column Generation感兴趣的话,下述链接为开源的Julia实例与更为具体的求解过程。

https://www.juliaopt.org/notebooks/Chiwei%20Yan%20-%20Cutting%20Stock.html

七、最后的一点碎碎念

发现Pricing Model的特殊结构对于更充分的利用列生成算法是非常有利的,像上述例子,当剪裁长度达到一定长度或需求长度变化过多时,我们很难将可行的所有列都先找出,因此,利用该特殊结构的Pricing Model,我们很好的解决了这一问题。

但对于路径问题而言,很多时候基于现实因素,其Pricing Model是十分复杂且困难的,因此除了建立Pricing Model 直接找寻加入的列以外,我们可以通过一些巧妙的方法找到所有或大部分可行的线路,以直接计算每一循环的reduced cost。

参考文献:

Lecture Notes from Dr. Sun - Derterministic Optimization 2017 in Georgia Tech

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值