单纯形算法作为解决线性规划问题常用算法之一。一般运筹课程都会有学习到。
单纯形算法的核心就是沿着可行解的边界点,从一个点跳到相邻的点上。由此引出了出基入基的抉择,因为当前点相邻可能有很多点,如何在保证目标函数下降(求最大则为上升)的前提下,使迭代次数最小?大多教科书上介绍的都是Dantzig规则,即使目标函数下降最大的入基。而最陡边规则需要的是步长方向与目标函数夹角最大的方向,即沿着下降最快的方向的变量入基。
下面具体介绍规则和更新方式:
我们以标准LP问题为例子,
$$\begin{aligned}
\operatorname{min} & z=\mathbf{c}^{T} \mathbf{x} \\
\text { subject to } & \mathbf{A x}=\mathbf{b} \\
& \mathbf{x} \geq \mathbf{0}
\end{aligned}$$
矩阵$\mathbf{A}$可分为基矩阵$\mathbf{B}$和非基矩阵$\mathbf{R}$,则
$$\mathbf{x}=\left[\begin{array}{c}
\mathbf{B}^{-1} \mathbf{b} \\
\mathbf{0}
\end{array}\right]$$
$x$点所在的边界方向为
$$\boldsymbol{\sigma}_{j}=\left[\begin{array}{c}
-\mathbf{B}^{-1} \mathbf{R} \\
\mathbf{I}_{n-m}
\end{array}\right] \mathbf{e}_{j-m}=\left[\begin{array}{c}
-\boldsymbol{\alpha}_{j} \\
\mathbf{e}_{j-m}
\end{array}\right], j=m+1, \ldots, n$$
如果沿着边界$q \in \mathbf{R} $移动步长$\theta$,则新的解为
$$\overline{\mathbf{x}}=\mathbf{x}+\theta \boldsymbol{\sigma}_{q}.$$
为使目标函数下降,则$d_{q}=\mathbf{c}^{T} \boldsymbol{\sigma}_{q}< 0$,选取下降最快的为
$$\frac{\mathbf{c}^{T} \boldsymbol{\sigma}_{q}}{\left\|\boldsymbol{\sigma}_{q}\right\|}=\min _{j \in \mathcal{R}}\left\{\frac{\mathbf{c}^{T} \boldsymbol{\sigma}_{j}}{\left\|\boldsymbol{\sigma}_{j}\right\|}\right\}.$$
注意到二范数计算是需要开根号的,所以我们可以直接考虑计算其整体的平方,也可得到相同的$q$。
记$\gamma_{j}=\left\|\boldsymbol{\sigma}_{j}\right\|^{2}=\boldsymbol{\sigma}_{j}^{T} \boldsymbol{\sigma}_{j}$,设$q$入基,$p$出基,则更新为
$$\begin{aligned}
\bar{\sigma}_{p} &=-\frac{1}{\alpha_{q}^{p}} \sigma_{q} \\
\bar{\sigma}_{j} &=\sigma_{j}-\frac{\alpha_{j}^{p}}{\alpha_{q}^{p}} \sigma_{q}, j \in \mathcal{R}, j \neq q
\end{aligned}$$
$$\begin{aligned}
\bar{\gamma}_{p} &=\frac{1}{\left(\alpha_{q}^{p}\right)^{2}} \gamma_{q} \\
\bar{\gamma}_{j} &=\overline{\boldsymbol{\sigma}}_{j}^{T} \overline{\boldsymbol{\sigma}}_{j} \\
&=\left(\boldsymbol{\sigma}_{j}-\bar{\alpha}_{j}^{p} \boldsymbol{\sigma}_{q}\right)^{T}\left(\boldsymbol{\sigma}_{j}-\bar{\alpha}_{j}^{p} \boldsymbol{\sigma}_{q}\right) \\
&=\boldsymbol{\sigma}_{j}^{T} \boldsymbol{\sigma}_{j}-2 \bar{\alpha}_{j}^{p} \boldsymbol{\sigma}_{j}^{T} \boldsymbol{\sigma}_{q}+\left(\bar{\alpha}_{j}^{p}\right)^{2} \boldsymbol{\sigma}_{q}^{T} \boldsymbol{\sigma}_{\boldsymbol{q}} \\
&=\gamma_{j}+\left(\bar{\alpha}_{j}^{p}\right)^{2} \gamma_{\boldsymbol{q}}-2 \bar{\alpha}_{j}^{p} \boldsymbol{\sigma}_{j}^{T} \boldsymbol{\sigma}_{q}, \quad j \in \mathcal{R}, j \neq q
\end{aligned}$$
实际计算中,使用
$$\bar{\gamma}_{j}=\gamma_{j}+\left(\bar{\alpha}_{j}^{p}\right)^{2} \gamma_{q}-2 \bar{\alpha}_{j}^{p} \mathbf{a}_{j}^{T} \mathbf{B}^{-T} \boldsymbol{\alpha}_{q}, \quad j \in \mathcal{R}, j \neq q。$$
Dantzig方法类似一种贪心算法,每步只是当前步下降最多,而最陡边则是尽量保持下降方向是当前目标函数下降的最大方向。在实际应用中,最陡边效果更好。当然最陡边需要的计算量也远多于Dantzig方法,于是就有人提出来近似最陡边大大减少了计算。
浙公网安备 33010602011771号