• 列生成算法


    列生成是单纯形法的一种形式,其主要用途是用来求解变量多,但是大部分变量都是0的线性规划问题。

    主要思路是先忽略大部分变量,构造一个只使用小部分变量的模型(其他的变量为0),先求出一个解,在扩大求解范围,寻找一个能使目标值更优的变量,加入模型再次求解,重复这个过程,直到找不到更好的变量为止。

    问题是如何判断新增一个变量是否能使目标函数更优。

    我们用对偶的思想看待列生成算法

    原问题如果是包含一些约束的最小化问题,其对偶问题能够转化为包含一些新约束的最大化问题。还有一个比较重要的特征是:原问题的最优值和对偶问题的最优值相等。

    原问题的约束对应对偶问题的变量。原问题的变量对应对偶问题的约束。

    我们之前介绍的列生成是先引入一部分变量。转化为对偶问题后,相当于只包含部分约束。如果在原问题中引入了新的变量,则相应的对偶问题中的约束也变多了。

    我们的目标是新增了变量后能让原问题的目标函数值变小,相当于对于对偶问题新增了约束能让目标函数值更大。

    相当于在对偶问题中,新增加约束前的最优解不在新增约束后的可行域内

    也就是说在对偶问题中,新增约束前的最优解不满足新增的约束条件

    设增加约束前的最优解为w*,新增的约束是:aw\leqslant c

    如果新增约束前的最优解不满足新增的约束条件即:aw*> c

    c-aw^{*}< 0

    我们称上面的式子为检验数,reduced cost

    我们可以找到检验数中最小的一个或几个加入到包含部分变量的原问题中,不断迭代,直到所有未加入到模型中的变量的检验数都大于等于0,目标值无法再优化,已经得到最优解。

    应用实例可以看这个文章

    运筹说 第21期 | 算法介绍之列生成算法 - 知乎

    单纯形法和列生成算法

    和单纯形法相比,列生成算法步骤大体相同,单纯形法是求解所有非基变量的检验数,而列生成算法通过构造子问题,无需遍历所有变量,生成一个或多个变量,一点一点的提升优化效果。

    (有个问题,列生成算法每次扫描几个变量,万一这几个变量恰巧是的检验数都大于等于0,怎么办?)

    目前好多问题都是整数规划问题,先对整数变量进行松弛,然后用上面提到的方法进行求解。

    最后可以利用分支定界法对得到的解进一步处理成整数解。

    参考文章

    最清楚的-列生成算法简介_xinxing_Star的博客-CSDN博客_列生成算法

  • 相关阅读:
    Ubuntu搭建openvpn服务器
    Python3 面向对象,一篇就够了
    刷题笔记24——完全二叉树的节点个数
    【Unity3D】Shader Graph节点
    FITC-PSA豌豆凝集素,PSA-FITC,豌豆凝集素修饰绿色荧光素
    c++STL库
    vue重修之路由【上】
    算法基础学习|排序
    [西湖论剑 2022]real_ez_node
    数据结构系列学习(八) - 链式队列(Chain_Queue)
  • 原文地址:https://blog.csdn.net/CodeSavior/article/details/126568765