Dantizig-Wolfe分解算法
本章继续介绍大规模优化问题的求解方式。
Dantzig-Wolfe分解(又称列生成法)是一种用于求解大规模线性规划问题(尤其具有块对角结构)的算法,通过将原问题分解为:
主问题(Master Problem):协调全局资源分配。
子问题(Subproblems):生成可行的局部解(列),通过定价机制反馈给主问题。
核心思想:利用问题的可分解结构,避免直接处理所有变量,转而动态生成有效列(变量)以逼近最优解。
算法适用场景
约束矩阵呈块对角结构(如资源分配、多商品流问题)。
变量数量庞大,但大多数在最优解中取零值。
经典应用
切割库存问题(Cutting Stock)
车辆路径规划(VRP)
供应链优化
求解方法
原问题
mink=1∑Kckxks.t.k=1∑KAkxk>b(耦合约束)xk∈Xk
分解主问题
利用凸组合表示定理,将 xk表示为Xk的极点点集xkp^的线性组合:
xk=p∈Pk∑λkpxkp^p∈Pk∑λkp=1
主问题(RMP):
mink=1∑Kp∈Pk∑λkp(ckxkp)s.t.k=1∑Kp∈Pk∑^(Akxkp)λkpp∈Pk∑^λkp=1
子问题(定价问题)
对每个子问题 k,计算检验数(Reduced Cost):
ck^=ck−πTAk−μk
π主问题中耦合约束的对偶变量。μk凸性约束的对偶变量。子问题目标:找到极点xk∗^ 使得ck^xk∗^<0
min(ck−πTAk)xk
迭代优化流程
- 初始化:构建包含初始可行列的主问题(如人工变量或启发式解)。
- 求解主问题:得到当前解和对偶变量 (π,μ)
- 求解子问题:检查是否存在负检验数的列。若存在,将新列加入主问题。否则,当前解为最优。
- 终止条件:所有子问题的检验数非负。
Benders分解算法
Benders分解是一种用于求解混合整数规划(MIP)或大规模线性规划的算法,通过将问题分解为:
主问题(Master Problem):处理复杂变量(如整数变量)。
子问题(Subproblem):固定主问题的变量后,求解剩余线性问题,生成割平面(Benders割)反馈给主问题。
核心思想:利用对偶理论将问题分解为迭代求解的主问题和子问题,通过添加割平面逐步逼近最优解。
算法适用场景
问题特征:
- 变量可划分为“复杂变量”(如整数变量)和“简单变量”(如连续变量)。
- 约束可分离为与复杂变量直接相关的部分和剩余部分。
使用问题:
设施选址问题
供应链网络设计
多阶段随机规划
求解方法
原问题形式
假设原问题为混合整数规划:
minCTx+dTys.t.Ax+By>b(耦合约束)x∈Xy>0
分解为子问题和主问题
子问题(固定 x):给定主问题的解xk,求解连续变量y:
mindTys.t.By>b−Axky>0
若子问题可行,返回最优值Q(xk)和对偶变量πk
若子问题无界,返回极方向uk
利用子问题的信息生成Benders割,逐步逼近原问题:
minCTx+ηs.t.η>(b−Ax)Tπl(最优割)0>(b−Ax)Tμmx∈X
η 是子问题目标值的近似(辅助变量)。
迭代优化流程
- 主问题不含割平面(或添加初始可行割)。
- 设上界UB=+∞ 下界LB=-∞
- 得到当前解xk和下界LB=cTxk+η
- 固定x=xk,求解子问题:
- 若可行:得到Q(xk)和对偶变量πk, 更新上界UB=min(UB,cTxk+Q(xk))
- 若无界:得到极方向μk,添加可行性割到主问题。
- 生成割平面:若子问题可行,添加最优割:η>(b−Ax)Tπk
- 终止条件:当UB−LB<σ时停止,否则返回步骤2。
设施选址问题
选择开设工厂(二元决策xi),分配运输量(连续变量yij)以满足需求,最小化总成本(固定成本+运输成本)。
mini∑fixi+i,j∑cijyijs.t.i∑yij>dj0<yij<Mxixi∈[0,1]
Benders分解步骤
- 主问题:决定是否开设工厂xi.
- 子问题:固定工厂选址后,求解运输问题yij
迭代过程
- 主问题初始解:x=[0,1](假设)。
- 子问题:检查运输是否可行。
- 若不可行(如需求未满足),添加可行性割:“至少开设工厂1或2”。
- 主问题更新:添加割后重新求解,得到新解 x=[1,0]。
- 重复至收敛。
总而言之
咱们目前就把经常使用的优化方法进行了介绍。