1.Bender decomposition分解算法的原理
2.Bender decomposition算法的python实现
最近在学习鲁棒优化的时候看到了一个新算法也就是本文的Bender 分解算法 本着求知的态度,看了网上的众多解释可教程,大概算是有点了解了,顺手写个blog记录一下吧,附上复现的python代码和matlab代码
一、Bender decomposition算法的原理
Bender分解算法是用来求解MIP问题的,特别是对于大规模混合整数规划问题有奇效,注:当然这也是我道听途说,gpt也是这样说的,实际上的求解效率笔者没有和其他精确算法进行对比过
其本质思想就是将复杂的变量给置换出来,考虑如下模型(MIP):
min x , y c x + f y s . t . A x + B y = b x ⩾ 0 y ∈ Y ⊆ R n \begin{aligned}&\min_{x,y}&&cx+fy\\&\mathrm{s.t.}&&Ax+By=b\\&&&x\geqslant0\\&&&y\in Y\subseteq\mathbb{R}^n\end{aligned} x,ymins.t.cx+fyAx+By=bx⩾0y∈Y⊆Rn
其中x是连续决策变量,y是整数变量
其中 c ∈ R 1 × m , f ∈ R 1 × n c\in\mathbb{R}^{1\times m},f\in\mathbb{R}^{1\times n} c∈R1×m,f∈R1×n ,是行向量,其维度分别为 m × 1 m\times1 m×1和 n × 1 n\times1 n×1。 A , B A,B A,B是约束矩阵,其维度分别为 A ∈ R r × m , B ∈ R r × n A\in\mathbb{R}^{r\times m},B\in\mathbb{R}^{r\times n} A∈Rr×m,B∈Rr×n 。 b b b为右端常数项。
这个模型进行求解的时候是比较困难的,于是Jacques F. Benders 在1962年想到将y这个复杂变量给提前确定好,也就是固定一个值,于是就得了一个LP问题:
SP: min x c x s.t. A x = b − B y ˉ x ⩾ 0 \begin{aligned}&\text{SP:}\quad\min_{x}\quad cx\\&\text{s.t.}\quad Ax=b-B\bar{y}\\&x\geqslant0\end{aligned} SP:xmincxs.t.Ax=b−Byˉx⩾0
这个问题里面只有一个线性变量 x x x不是np-hard问题,自然可以很轻松的求解,学术上也就称这个问题为子问题(subproblem)
同时对比初始问题余下的也就叫主问题(master problem),如下所示:
M