分支定价算法(branch and price, B&P)

前言

简述分支定价算法原理,如有错误可私信,谢谢。部分截图来自本人汇报所用PPT以及参考文献。以下均以最小化问题为例。

分支定界算法

分支定价算法(branch and price, B&P)=分支定界(branch and bound, B&B)+列生成(column generation, CG, 线性规划)。其中列生成算法用于求节点的下界,即节点松弛模型的最优解。列生成算法因其求解方法的本质会大大减少计算量,求解的并非节点松弛模型本身,而是受限制的松弛模型,即减少了决策变量规模。分支定价算法其他步骤与分支定界算法相同,只是下界计算由列生成算法完成。如下为流程图。
在这里插入图片描述

列生成算法

在这里插入图片描述
列生成算法所求解的问题大都决策变量规模非常大,相应地其约束系数也非常多(如上图每个xj对应一组{a1j,…,aij,…,anj}),不可能同时表达出来一起求解,典型问题就是切卷纸的问题,顾客需要不同长度的卷纸若干,需要对固定长度的卷纸进行裁剪。对卷纸而言可行的裁剪方案的约束条件是不超过卷纸的固定长度(可能会有巨多种),对整个问题而言,就是找到一个解决方案(方案由裁剪方案与裁剪数量组成,如裁剪方案1裁剪5卷纸,裁剪方案2裁剪3卷纸可得到最终结果)得到顾客想要的若干不同长度卷纸,并使用最少的原固定长度的卷纸。
在这里插入图片描述
列生成特点为无需列出所有可行的裁剪方案(恢复成多)再进行求解,只需先列出几个裁剪方案然后随着求解这几个裁剪方案下的原问题(主问题,Master Problem)的受限问题(Restricted Master Problem),再不断迭代增加对问题有益的裁剪方案最终求出松弛问题的最优解。

步骤

(如上图)
1、根据原问题,选取几个可行列(可行裁剪方案),得到受限问题模型
2、通过受限问题RMP获得检验数以构建子问题的方程,子问题的约束条件即为可行列的生成条件(裁剪方案需要满足卷纸固定长度的限制,例如5米长的卷纸,只能裁剪成3米1个,2米1个;不能是4米1个,2米1个)
子问题表达:
在这里插入图片描述
子问题目标函数中检验数pi来自于RMP问题,通过RMP的基向量和非基向量划分后的对应参数c_B和B计算得到(参考单纯形法计算过程,参考[1])。需要将RMP问题标准化得到基变量非基变量,将其对应参数计算检验数,并用以求解子问题,得到新的可行列加入RMP问题。
在这里插入图片描述
3、求解子问题,子问题的解若对应目标函数(检验数)小于0,那么将解y(可行列)加入受限问题,循环步骤2~3,否则若子问题的解对应目标值不小于0,则循环结束
4、求当前受限问题RMP的最优解,即分支定价中该节点的下界

注:建议配合给出的参考[1]中的链接一起理解,步骤2~3的依据是单纯形法中进基出基的判断方法(进基出基后可得到子问题目标值中的检验数),当基确定后(通过每列的检验数判断),RMP问题最优解则可得出,也就是分支定价过程中该节点的下界。

参考文献

[1] 列生成:https://www.cnblogs.com/dengfaheng/p/11249879.html
https://www.jianshu.com/p/8be0083886ed
https://www.cnblogs.com/cruelty_angel/p/10493527.html

[2] 分支定界:https://www.cnblogs.com/dengfaheng/p/11225612.html
[3] 分支定价:https://my.oschina.net/u/4354879/blog/3432783
李播.基于分支定价的手术计划调度研究

### 分支定价算法应用于车辆路径问题 分支定价(branch-and-price)是一种求解大规模整数规划问题的有效方法,尤其适用于解决复杂的组合优化问题如车辆路径问题(VRP)[^2]。此方法结合了列生成(column generation, CG)技术与分支定界法(branch and bound),能够有效地处理含有大量决策变量的问题。 #### 列生成过程 在VRP背景下,列代表可行的单条路线。初始时只考虑少量候选路线构成主问题(master problem),随着计算推进不断引入新的潜在更优路线直到找不到能改善目标函数值的新列为止。具体来说: - **初始化**:构建一个简化版线性松弛模型作为起始点; - **子问题求解**:针对当前主问题的状态,寻找可能带来更好效益的价格最低负影子价格对应的未被加入到现有方案集里的新路由; - **更新主问题**:如果发现有效的新路由,则将其添加至主问题并重新评估整体性能指标;反之则停止迭代进入下一步骤。 当不再能找到改进型线路之后,即完成一轮完整的CG循环。此时得到的结果虽未必全局最优但也已经相当接近实际最佳情况下的表现水平。 #### 分支策略 为了进一步逼近甚至达到真正的全局最优点,需要借助于传统的BB思想对某些特定约束条件实施分枝操作从而形成多个子树分别考察其可能性范围内的所有情形直至最终收敛于确切答案位置。通常情况下会优先选取那些具有较大影响作用的关键因素来进行切割划分以便更快缩小搜索区间提高效率效果。 对于具体的实现细节而言,Gurobi和CPLEX这类商业求解器提供了强大的API接口支持用户自定义回调(callbacks)功能来自行控制整个运算流程中的各个环节动作,比如可以在每一步节点处动态调整参数设定或是监控内部状态变化趋势等等[^4]。 ```python from gurobipy import Model, GRB def solve_vrp_branch_and_price(data): model = Model('vrp') # Define variables, constraints, objective function here while not converged: subproblem_solution = generate_new_routes(model) if subproblem_solution.cost < threshold: add_column_to_master_problem(subproblem_solution.route) optimize_master_problem() if no_improvement_possible(): break return final_solution() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值