跳转至

分支切割

约 364 个字 预计阅读时间 1 分钟

Reference

  • https://en.wikipedia.org/wiki/Branch_and_cut
  • https://en.wikipedia.org/wiki/Branch_and_price
  • https://or.rwth-aachen.de/files/research/publications/branch-and-price.pdf
  • https://homes.di.unimi.it/righini/Didattica/ComplementiRicercaOperativa/MaterialeCRO/2000%20-%20Mitchell%20-%20branch-and-cut.pdf
  • https://optimization-online.org/wp-content/uploads/2008/06/1997.pdf

凸包和有效不等式 的内容里,我们简单介绍了一下分支切割算法,下面给出完整的算法框架形式.

分支切割

考虑混合整数线性规划

\[ z^* = \max \{ f(x) : x \in \mathcal{D} \} \]

其中

\[ f(x) = c^Tx, c\in\mathbb{R}^n\\ \mathcal{D} = \{ x \in \mathbb{R}^n_+\mid A x \leq b,\, ,\, x_j \in \mathbb{Z}_+,\, \forall j \in I \}. \]

算法1 分支切割法

  • \(\mathcal{L} = \mathcal{D}\),初始化 $\hat{x} $
  • While \(\mathcal{L} \neq \emptyset\) do
    • \(\mathcal{L}\) 中选择待探索的子集合 \(\mathcal{S}\)
    • \((\mathcal{S},f)\) 的线性松弛问题的解 \(\hat{x}'\)
    • If \(\hat{x}'\) 是不可行解 or \(\hat{x}'\)是分数可行解,且 \(f(\hat{x}')\leq f(\hat{x})\) then
      • \(\mathcal{S}\) 赋予可以剪枝属性
    • else if \(\hat{x}'\) 是分数可行解,且\(f (\hat{x}')> f(\hat{x})\) then
      • \(\mathcal{S}\) 赋予不可剪枝属性
    • If 需要添加切平面 then
      • 找到分离 \(\hat{x}'\)\(\mathcal{S}\) 的割平面 \(\langle \boldsymbol{a}, \hat{x}' \rangle \leq \beta\)
      • \(\mathcal{S}_{t+1} \leftarrow \mathcal{S}_t \cap \{ x \mid \langle \boldsymbol{a}, \hat{x}' \rangle \leq \beta \}\)
      • 返回第4行
    • else if \(\hat{x}'\) 是整数可行解 then
      • \(\hat{x} = \hat{x}'\)
      • \(\mathcal{S}\) 赋予可以剪枝属性
    • end if
    • if \(\mathcal{S}\) 不可剪枝 then
      • \(\mathcal{S}\) 划分为 \(\mathcal{S}_1, \mathcal{S}_2, \dots, \mathcal{S}_r\)
      • \(\mathcal{S}_1, \mathcal{S}_2, \dots, \mathcal{S}_r\) 加入 \(\mathcal{L}\)
    • end if
    • \(\mathcal{L}\) 中移除 \(\mathcal{S}\)
  • end while
  • return \(\hat{x}\)