G
N
I
D
A
O
L

【最优化方法】第二次要点整理

【问题】在迭代中,已知 \(x^{(k)}\) 和下降方向 \(d^{(k)}\),如何确定下降步长 \(\alpha^{(k)}\),使得 \(f(x^{(k)} + \alpha^{(k)} d^{(k)}) < f(x^{(k)})\)

精确线搜索技术

【思想】\(\alpha^{(k)} = \mathop{\arg\min}\limits_{\alpha \geq 0} = \varphi(\alpha) = f(x^{(k)} + \alpha d^{(k)})\),通过解以下方程求出 \(\alpha^{(k)}\)

\[\frac{\mathrm{d} \varphi}{\mathrm{d} \alpha} \bigg|_{\alpha = \alpha^{(k)}} = \nabla f(x^{(k)} + \alpha^{(k)} d^{(k)})^T d^{(k)} = 0 \]

【主要框架】

  • 确定包含 \(\alpha^{(k)}\) 的搜索区间
  • 基于分割技术或插值技术,不断缩小搜索区间,求出 \(d^{(k)}\)

进退法确定搜索区间

【定义】令 \(\alpha^{*} = \mathop{\arg\min}\limits_{\alpha \geq 0} = \varphi (\alpha)\)(即 \(\alpha^*\) 为某个区间的极小值点),若 \([a,b] \subset [0,+\infty)\),且 \(\alpha^{*} \in [a,b]\),则称 \([a,b]\) 为一个搜索区间。

【算法步骤】假设搜索区间 \([a,b]\) 是一个单峰区间,

  • 第一步:初值 \(\alpha_0 \geq 0, h_0>0, k=0\),计算 \(\varphi_0 = \varphi(\alpha_0)\)
  • 第二步:令 \(\alpha_{k+1} = \alpha_k + h_k\),计算 \(\varphi_{k+1} =\varphi(\alpha_{k+1})\)
    • \(\varphi_{k+1} < \varphi_{k}\),跳转第三步
    • \(\varphi_{k+1} \geq \varphi_{k}\),跳转第四步
  • 第三步:作前进运算,令 \(h_{k+1} \leftarrow 2 h_{k}\)\(\alpha \leftarrow \alpha_{k}\)\(\alpha_{k} \leftarrow \alpha_{k+1}\)\(\varphi_{k} \leftarrow \varphi_{k+1}\)\(k \leftarrow k+1\),返回第二步
  • 第四步:
    • \(k=0\),作后退运算,令 \(h_{1} \leftarrow -h_{0}\)\(\alpha \leftarrow \alpha_1\)\(\alpha_1 \leftarrow \alpha_0\)\(\varphi_1 \leftarrow \varphi_0\)\(k=1\),返回第二步
    • \(k>0\),停止迭代,令 \(a = \min(\alpha, \alpha_{k+1})\)\(b = \max(\alpha, \alpha_{k+1})\),则 \([a,b]\) 为包含极小值的搜索区间

分割法确定极小值

二分法

【算法步骤】第 \(k\) 步:\([a_k, b_k]\),令 \(c = \frac{1}{2} (a_k + b_k)\),计算 \(\varphi'(c)\)

  • \(\varphi'(c) = 0\),令 \(\alpha^* = c\),停止迭代
  • \(\varphi'(c) > 0\),说明 \(\alpha^* \in [a_k, c]\),令 \([a_{k+1}, b_{k+1}] \leftarrow [a_k, c]\),继续迭代
  • \(\varphi'(c) < 0\),说明 \(\alpha^* \in [c, b_k]\),令 \([a_{k+1}, b_{k+1}] \leftarrow [c, b_k]\),继续迭代

黄金分割法

【算法思想】第 \(k\) 步:\([a_k, b_k]\),往该区间插入两个试探点 \(\lambda_k\)\(\mu_k\),其中 \(\lambda_k < \mu_k\),计算 \(\varphi(\lambda_k)\)\(\varphi(\mu_k)\)

  • \(\varphi(\lambda_k) \leq \varphi(\mu_k)\),说明 \(\alpha^* \in [a_k, \mu_k]\),令 \([a_{k+1}, b_{k+1}] \leftarrow [a_k, \mu_k]\),继续迭代
  • \(\varphi(\lambda_k) > \varphi(\mu_k)\),说明 \(\alpha^* \in [\lambda_k, b_k]\),令 \([a_{k+1}, b_{k+1}] \leftarrow [\lambda_k, b_k]\),继续迭代

【试探点需满足的条件】(参考资料)两个条件:

  • 区间长度相同:\([a_k, \mu_k] = [\lambda_k, b_k]\),即 \(b_k - \lambda_k = \mu_k - a_k\),使得分割点是对称的。
  • 区间长度的缩短率相同:\(b_{k+1} - a_{k+1} = \rho(b_k - a_k)\),其中 \(\rho\) 为区间长度缩短率。

因此可得:

\[\begin{cases} \lambda_k = a_k + (1-\rho)(b_k - a_k) \\ \mu_k = a_k + \rho(b_k - a_k) \\ \end{cases} \]

现在考虑情形 \(\varphi(\lambda_k) \leq \varphi(\mu_k)\),此时新的搜索区间为 \([a_{k+1}, b_{k+1}] = [a_k, \mu_k]\)。为进一步缩短搜索区间,需取新的试探点 \(\lambda_{k+1}, \mu_{k+1}\),由上式可得:

\[\begin{aligned} \mu_{k+1} &= a_{k+1} + \rho(b_{k+1} - a_{k+1}) \\ &= a_{k} + \rho^2 (b_k - a_k) \end{aligned} \]

每次缩小搜索区间时,上一次迭代得到的分割点可复用为下一次的分割点,因此不必重新计算新的试探点,于是有 \(\mu_{k+1} = \lambda_k\),于是有 \(\rho^2 = 1-\rho\),解得 \(\rho = 0.618\)

对于情形 \(\varphi(\lambda_k) > \varphi(\mu_k)\) 也有相同的结论,此处不再赘述。所以有:

\[\begin{cases} \lambda_k = a_k + 0.382(b_k - a_k) \\ \mu_k = a_k + 0.618(b_k - a_k) \\ \end{cases} \]

【算法步骤】

  • 第一步:初始区间 \([a_0, b_0]\),给定 \(\epsilon > 0\)\(k=0\),计算初始分割点:

\[\begin{cases} \lambda_0 = a_0 + 0.382(b_0 - a_0) \\ \mu_0 = a_0 + 0.618(b_0 - a_0) \\ \end{cases} \]

  • 第二步:计算 \(\varphi(\lambda_k)\)\(\varphi(\mu_k)\)

    • \(\varphi(\lambda_k) \leq \varphi(\mu_k)\),说明 \(\alpha^* \in [a_k, \mu_k]\),跳转第三步
    • \(\varphi(\lambda_k) > \varphi(\mu_k)\),说明 \(\alpha^* \in [\lambda_k, b_k]\),跳转第四步
  • 第三步:若 \(\mu_k - a_k < \epsilon\),则输出 \(\alpha^* = \lambda_k\);否则,令 \(a_{k+1} \leftarrow a_k\)\(b_{k+1} \leftarrow \mu_k\)\(\mu_{k+1} \leftarrow \lambda_k\)\(\lambda_{k+1} = a_{k+1} + 0.382(b_{k+1} - a_{k+1})\)\(k \leftarrow k+1\),返回第二步

  • 第四步:若 \(b_k - \lambda_k < \epsilon\),则输出 \(\alpha^* = \mu_k\);否则,令 \(a_{k+1} \leftarrow \lambda_k\)\(b_{k+1} \leftarrow b_k\)\(\lambda_{k+1} \leftarrow \mu_k\)\(\mu_{k+1} = a_{k+1} + 0.618(b_{k+1} - a_{k+1})\)\(k \leftarrow k+1\),返回第二步

插值法

三点二次插值法(拉格朗日插值法)

(此处用 \(s\) 代替上文中的 \(\alpha\)

【算法原理】构造抛物线方程:\(q(s) = a_0 + a_1 s + a_2 s^2 = \varphi(s)\),将 \(s_0, s_1, s_2\) 三个点代入方程得到 \(\varphi_0 = \varphi(s_0), \varphi_1 = \varphi(s_1), \varphi_2 = \varphi(s_2)\),并求解 \(a_0, a_1, a_2\),解得:

\[\begin{cases} a_1 = - \frac{(s_1-s_2)\varphi_0 + (s_2-s_0)\varphi_1 + (s_0-s_1)\varphi_2}{(s_0-s_1)(s_1-s_2)(s_2-s_0)} \\ a_2 = \frac{(s_1^2-s_2^2)\varphi_0 + (s_2^2-s_0^2)\varphi_1 + (s_0^2-s_1^2)\varphi_2}{(s_0-s_1)(s_1-s_2)(s_2-s_0)} \\ \end{cases} \]

\(\bar{s}\) 为该抛物线的极小值点,则有 \(q'(\bar{s})=0\),所以有:

\[\bar{s} = -\frac{a_1}{2a_2} = \frac{1}{2} \frac{(s_1-s_2)\varphi_0 + (s_2-s_0)\varphi_1 + (s_0-s_1)\varphi_2}{(s_1^2-s_2^2)\varphi_0 + (s_2^2-s_0^2)\varphi_1 + (s_0^2-s_1^2)\varphi_2} \]

【算法步骤】

  • 第一步:在 \([a,b]\) 中由进退法取三个点:\(s_0, s_1, s_2\),使得对于 \(\varphi_0 = \varphi(s_0), \varphi_1 = \varphi(s_1), \varphi_2 = \varphi(s_2)\),有 \(\varphi_0 > \varphi_1 < \varphi_2\),即“两边高中间低”。

  • 第二步:由公式计算 \(\bar{s}\)\(\bar{\varphi}(\bar{s})\)

    • \(\bar{\varphi}(\bar{s}) > \varphi_1\),转步骤三。
    • \(\bar{\varphi}(\bar{s}) \leq \varphi_1\),转步骤四。
  • 第三步:

    • \(s_1 > \bar{s}\),则 \(s_2 \leftarrow s_1\)\(s_1 \leftarrow \bar{s}\)\(\varphi_2 \leftarrow \varphi_1\)\(\varphi_1 \leftarrow \bar{\varphi}\),转步骤五。
    • \(s_1 \leq \bar{s}\),则 \(s_0 \leftarrow s_1\)\(s_1 \leftarrow \bar{s}\)\(\varphi_0 \leftarrow \varphi_1\)\(\varphi_1 \leftarrow \bar{\varphi}\),转步骤五。
  • 第四步:

    • \(s_1 > \bar{s}\),则 \(s_0 \leftarrow \bar{s}\)\(\varphi_0 \leftarrow \bar{\varphi}\),转步骤五。
    • \(s_1 \leq \bar{s}\),则 \(s_2 \leftarrow \bar{s}\)\(\varphi_2 \leftarrow \bar{\varphi}\),转步骤五。
  • 第五步:若 \(|s_2 - s_0| < \epsilon\),则输出 \(s^* = s_1\);否则,转步骤二。

image

posted @ 2024-10-31 15:47  漫舞八月(Mount256)  阅读(37)  评论(0编辑  收藏  举报