列生成(Column Generation)算法

转载自:https://mp.weixin.qq.com/s/y4rojEP3M8Ow3pLKQUKgLw

列生成算法的背景

  列生成算法通常被应用于求解大规模整数规划问题的分支定价算法(branch-and-price algorithm)中,其理论基础由Danzig等于1960年提出。当求解一个最小化问题时,列生成算法主要的作用是为每个搜索树节点找到一个较优的下界(lower bound)本质上而言,列生成算法就是单纯形法的一种形式,是用来求解线性规划问题的

列生成算法已被应用于求解如下著名的NP-hard优化问题:机组人员调度问题(Crew Assignment Problem)、切割问题(Cutting Stock Problem)、车辆路径问题(Vehicle Routing Problem)、单资源工厂选址问题(The single facility location problem )等。

列生成算法的基本思想

  在某些线性优化问题的模型中,约束的数目有限,但是变量的数目随着问题规模的增长会爆炸式的增长,因此不能把所有的变量都显性的在模型中表达出来。在用单纯形法求解这类线性规划问题时,基变量(basic variable)只与约束的个数相关,每次迭代只会有一个新的非基变量(non-basic variable)进基,因此,在整个求解过程中其实只有很少一部分变量会被涉及到。

  简单来说,列生成算法通过求解子问题(pricing problem),来找到可以进基的非基变量,该非基变量在模型中并没有显性的写出来(可以看成是生成了一个变量,每个变量其实等价于一列,所以该方法被称为列生成算法)。如果找不到一个可以进基的非基变量,那么就意味着所有的非基变量的检验数(reduced cost)都满足最优解的条件,也就是说,该线性规划的最优解已被找到,即使很多变量没有在模型中写出来。

列生成算法实例——板材切割问题(Cutting Stock Problem)

问题描述

木材厂卖木材,某顾客需要25根3英尺的木材、20根5英尺的木材和15根9英尺的木材,木材厂通过切17英尺的木材来满足顾客的需求。为了尽量减少木材的浪费,可以用线性规划方法来实现这个目标,同时用列生成来解这个线性规划问题。

切割方案

切割过程中,木材厂要确定木材的切割方案(cutting combination)。举例说明,一根17英尺的木材可以切成3根5英尺的,这种切割方案将造成2英尺木材的浪费,实际过程中有很多种可能的切割方案,但是不合理的切割方案不需要被考虑。例如,只把17英尺木材切成一根9英尺,然后扔掉8英尺的方案明显不合理,因为我们可以把它切成一根9英尺、5英尺和3英尺的木材。总的来说,任何一种切割方案浪费木材量超过3英尺,我们都认为是不合理的,因为可以用浪费的木材去获得一根或多根3英尺的木材。不合理的切割方案不会在最优解中出现,因此不需要考虑。根据以上规则,我们可以枚举出以下六种切割方案

Image

求解过程

1. 建立模型

(1)x_l:    选用第 i 个方案

(2)等量关系式:

(3)目标:

(4)板材切割问题约束:

          

结合(1)(2)(3)(4)得到最终线性规划模型

2. 模型求解

               

     定义第七种切割方法(只切出一个“9英尺”)

                                                          初始基为(x 1,6,7)

     

                                 

        由上到下依次是:目标值z,和 对应尺寸的个数 a3,a5,a9 (分支定价法

         

     找到最大的正检测数,从而找到对应需要进基的变量(x5)

       

    计算需要出基的变量(x7),(保证所有检测数均大于0,选择最小比值)

         

     

              

     

   

         

        变量值为整数(向上取整,允许适当浪费)

  • 12
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
生成是一种用于解决优化问题的算法。它适用于问题的解空间很大且具有稀疏结构的情况,例如线性规划问题。生成的基本思想是通过动态生成变量(也称为)来逐步改善目标函数值,直至找到最优解。 生成算法的步骤如下: 1. 初始解的生成:首先生成一个可行解作为初始解,可以通过一些启发式方法来得到。 2. 生成迭代:将初始解写成基本变量和非基本变量的形式,并定义一个目标函数。在每一次迭代中,通过求解对偶问题(也称为割平面问题)来生成新的。 3. 新生成:在对偶问题中,通过求解一系子问题来确定新的。这些子问题可以通过使用之前迭代的结果和对偶问题的松弛性质来求解。 4. 的价值评估:对于生成的每一,计算其对原始问题的贡献(例如通过求解原始问题来计算新的目标函数值)。根据贡献的大小对进行排序。 5. 的选择和更新:选择贡献最大的并将其添加到当前解中。同时更新目标函数并重新求解原始问题,以进一步改善解。 6. 收敛判断:检查当前解是否满足停止条件。如果满足,则停止迭代,否则返回步骤3。 生成算法的关键在于如何生成新的,并且如何将这些添加到当前解中。这需要通过解对偶问题来得到的更新方向,以及通过选择贡献最大的来保证算法的效率。 总的来说,生成是一种基于松弛问题和对偶问题的算法,通过动态生成和选择来逐步改善问题的解。它在解决大规模和稀疏优化问题时具有较好的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值