分支定价算法入门

这篇具有很好参考价值的文章主要介绍了分支定价算法入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分支定价法(branch and price)

组成

       ~~~~~~       分支定价由分支定界(branch and bound,B&B)和列生成算法(column generation)组成,它适用于求解大规模线性规划问题,其中B&B作为主体。branch and price的算法流程与B&B非常相似,不同的是在求解线性规划问题的过程中子节点采用column generation进行定界,通过削减变量减少复杂度,提高求解效率。

分支定界法

       ~~~~~~       作为五大算法之一,B&B可以解决整数线性规划和混合整数线性规划问题。通常单纯形法可以解线性规划的松弛模型,但是由于部分变量的整数约束条件,像 x ⊆ N x\subseteq\mathbb{N} xN x = 0 o r 1 x=0 or1 x=0or1,只求解松弛模型并未达到最终目标。
       ~~~~~~       这时候使用branch and bound在可行解空间中搜索,找出最优整数解,反应到数据结构中就是对二叉树进行搜索。

算法逻辑

1求解线性松弛的原问题
1.1 判断是否可行
a. 如果不可行,则原问题不可行
b. 如果可行,原问题得到整数解,线性松弛后的原问题的解是该问题的最优解,终止算法
c. 如果可行,线性松弛后的原问题没有得到整数解,则线性松弛后的原问题的目标函数值作为当前根节点的上界,选择原问题的可行解对应的目标函数值作为当前根节点的下界。根据分支策略进行分支得到子问题,并添加至未被探索的问题集中
2当未被探索的问题集不为空,且上下界的gap大于阈值,则根据搜索策略选择子问题进行探索
2.1 子问题不可行,剪枝
2.2 子问题可行
2.3 子问题得到整数解,子问题的线性松弛的解是该子问题的最优解,剪枝;线性松弛的子问题得到整数解,且线性松弛的子问题所求的目标函数值大于所有叶子结点的上界,算法终止
2.4 子问题没有得到整数解
当子问题的上界不超过原问题当前所求得的下界,剪枝。否则将线性松弛后的子问题的目标函数值作为当前根节点的上界,选择子问题的可行解对应的目标函数值作为当前节点的下界。根据分支策略进行分支得到子问题,并添加至未被探索的问题集中。
3算法的终止条件
当未被探索的问题集不为空;如果上界等于下界,或者上界-下界的gap很小,则算法终止。

列生成算法

列生成算法与单纯形法一样,是针对连续模型求解的(先将整数变量或者0-1变量松弛为连续变量得到松弛模型)。

  1. 为什么使用列生成而不是单纯形法`
    在面对大规模问题时,变量数量极多,单纯形法寻找进基出基变量的速度非常慢,仅仅在寻找进基变量时,就需要对每一个非基变量进行reduced cost的计算,挑选最小的RC。(所谓reduced cost个人理解为某个变量使得目标函数下降的速度,对于优化方向为最小的问题来说,当然这个下降速度越快越好,因此需要寻找reduced cost的最小值)

  2. 列生成法与单纯形法的关系
    个人认为列生成法就是单纯形法的改进版,它的优势主要体现在充分的削减变量,降低模型复杂度。相较于单纯形法在所有的变量里寻找最优策略,列生成算法首先寻找一组可行解,并将其余变量强制置零来生成一个小规模模型(RMP,restricted master problem),然后通过subproblem寻找要生成的列,加入到RMP中,直到不能寻找到使RC<0的列,此时,求解生成的RMP即可得到最优解。列生成算法流程图以及subproblem生成新列的方式均在下文中有所展示。

列生成算法流程

下面是列生成算法的简单流程图
分支定价算法入门

列生成算法要点

1.如何生成RMP
通常使用启发式算法寻找一个初始解,以经过启发式算法寻找的次优解构造RMP,在一定程度上也会加快求解速度。
2.subproblem建立
列生成算法中子问题的功能是寻找使reduced cost<0的列,将此列添加到RMP中,以进一步优化问题。因此它的目标函数即为检验数,检验数计算方法为 c j − C B B − 1 a j c_j-C_BB^{-1}a_j cjCBB1aj ,也就是变量 x j x_j xj在主问题目标函数中对应的系数减去对偶变量与系数矩阵相乘。这里的 a j a_j aj为主问题系数矩阵中对应变量 x j x_j xj的系数, c j c_j cj为目标函数中 x j x_j xj对应的系数, C B B − 1 C_BB^{-1} CBB1为对偶变量组成的向量。另外,subproblem中还有约束,主要是对生成规则的约束,当然由于subproblem中的变量为待生成的主问题系数,因此这些约束自然也是针对这些系数的规则。比如在经典的纸卷生成问题中(cutting stock problem),各个切割方案长度的加和不能超过单个纸卷的总长度。
不了解cutting stock problem的小伙伴可以参考博客这位大佬的https://www.cnblogs.com/codejiaoer/archive/2021/11/24/Column_Geration.html,并且这篇博文还给出了具体的计算步骤,非常有助于理解。
3.subproblem的求解
subproblem求解也是一个优化问题,当然这比直接求解主问题要快多了,因为subproblem中的变量为系数,数量为约束的个数,所以变量数相较于主问题要少很多。话说回来,如果不快也不用这么麻烦了。文章来源地址https://www.toymoban.com/news/detail-457040.html

到了这里,关于分支定价算法入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 问题:git branch -a 看不到所有的远程分支

    问题:通过git branch -a 查看分支时,看不到所有的远程分支(我这里缺少master 远程分支) 解决:通过 git fetch 将本地远程分支保持一致 再次 git branch -a,就可以看到所有的分支

    2024年02月12日
    浏览(47)
  • Python学习-流程图、分支与循环(branch and loop)

    1、流程图(Flowchart) 流程图是一种用于表示算法或代码流程的框图组合,它以不同类型的框框代表不同种类的程序步骤,每两个步骤之间以箭头连接起来。 好处: 1)代码的指导文档 2)有助于规划高效率的程序结构 3)便于与他人交流 流程图的思维是至上往下走的,线性逻

    2024年02月21日
    浏览(54)
  • Jenkins List Git Branches插件 构建选择指定git分支

    List Git Branches Parameter | Jenkins plugin Adds ability to choose from git repository revisions or tags https://plugins.jenkins.io/list-git-branches-parameter/ 1)新建任务  2)新增构建参数  3)选择git仓库 我这里选择gitee,其他类似。仓库如果不是公开的,需要配置key  4)jenkins配置git仓库 5)开始构建 点击

    2024年02月08日
    浏览(58)
  • TiDB Serverless Branching:通过数据库分支简化应用开发流程

    2023 年 7 月 10 日,TiDB Serverless 正式商用。这是一个完全托管的数据库服务平台(DBaaS),提供灵活的集群配置和基于用量的付费模式。紧随其后,TiDB Serverless Branching 的测试版也发布了。 TiDB Serverless Branching 功能使用户能够为其 TiDB Serverless 集群创建分支。这些分支可以实现并

    2024年02月10日
    浏览(48)
  • git 新建分支 推送到远程 首次pull代码报错 git branch --set-upstream-to=origin/<branch>

    在本地创建新分支后,上传到远程仓库,首次pull 的时候,会提示: 当前分支与远程分支并未建立联系,需要执行一下 git branch --set-upstream-to=origin/ 操作 解决办法: git branch --set-upstream-to=origin/远程分支名 建立完联系之后,就可以进行 git pull、git push 等操作啦~

    2024年02月16日
    浏览(55)
  • Git删除分支不成功,提示:error: Cannot delete branch......的问题解决

    一 问题来源       本地的代码仓库里面,有很多分支,随着项目的不断迭代,这样的分支变得越来越多。于是想把这样的分支给删掉,在删除分支的时候,报错: error: Cannot delete branch \\\'\\\' checked out at \\\'/Users/GoProject/src/code ,对应的提示如下: 二 解决问题       首先需要说

    2024年02月12日
    浏览(54)
  • 【微命令】git 如何修改某个分支的名字(git branch -m newbranch)

    简要信息,快速记录 假设作为git设计者,要用来修改branch的命令,那么就是 git branch作为前缀,然后进一步修改的命令是branch相关的对象处理,应该就有 增删查改,帮助等,但一定都是在branch这个域下面,这样容易记住比如: git branch --help

    2024年04月26日
    浏览(38)
  • gitlab代码合并(merge request )取消 [默认删除分支(Delete source branch)] 选项

    几个人开发不同的项目,需要合并到一个共同的转测分支。 我们在开发完代码需要一起合并到另一个总分支时,提交 merge 请求会默认勾选Delete source branch选项,如下图所示: 因为每个人开发的是不同的项目,所以各个分支代码不同,假使需要合并到相同的转测分支时,而默

    2024年02月12日
    浏览(57)
  • git操作--->在远程删除了某个分支,但本地使用git branch -r的时候还是会显示某个分支存在是什么原因

    💕又迷糊了哈哈,以为自己命令执行错了,结果可能是缓存的原因:💕 😂如果你发现使用 git branch -r 命令显示了一个远程没有的分支,这可能是由以下几个原因造成的:😂 缓存的远程分支信息: 当你克隆一个仓库或者与远程仓库交互时,Git 会在本地保存远程分支的缓存信

    2024年02月19日
    浏览(55)
  • 第三节:Git分支管理(关键词:git branch、git checkout、git diff、git merge、查看、创建、切换、对比分支)

    本节涉及Git命令 git branch :列出全部分支 git branch name :创建分支 git checkout name :切换分支 git diff branch1 branch2 :对比两个分支 git diff --quiet branch1 branch2 :对比两个分支是否存在差异,但不显示细节 git diff branch1 branch2 filename :对比两个分支中某个具体文件差异 git merge :合并

    2023年04月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包