zoukankan      html  css  js  c++  java
  • [最优化理论与技术]一维搜索

    一维搜索

    一维最优化

    一般迭代算法

    1. 初始点 (x^0)
    2. 按照某种规则 (A) 产生下一个迭代点 (x^{k+1}=A(x^k))
    3. 点列 ({x^k}) 收敛于最优解 (x^*)

    下降迭代算法

    1. 初始点 (x^0)
    2. 按照某种规则 (A) 产生下一个迭代点 (x^{k+1}=A(x^k))
    3. (f(x^0)>f(x^1)>...>f(x^k)>...)

    下降迭代算法步骤:

    1. 给出初始点 (x^0),令 (k=0)

    2. 按照某种规则确定下降搜索方向 (d^k)

    3. 按照某种规则确定搜索步长 (lambda_k),使得

      [fleft(x^{k}+lambda_{k} d^{k} ight)<fleft(x^{k} ight) ]

    4. (x^{k+1}=x^{k}+lambda_{k} d^{k})

    5. 判断 (x^k) 是否满足停止条件

    搜索步长确定方法

    [fleft(x^{k}+lambda_{k} d^{k} ight)=min _{lambda} fleft(x^{k}+lambda d^{k} ight) ]

    (lambda_k) 为最优步长,且有

    [ abla fleft(x^{k}+lambda_{k} d^{k} ight)^{T} d^{k}=0 ]

    收敛速度

    设算法 (A) 所得的点列为 ({x^k}),如果

    [left|x^{k+1}-x^{*} ight|<lambdaleft|x^{k}-x^{*} ight|^{alpha}, quad lambda, alpha>0 ]

    则称 ({x^k}) 的收敛阶为 (alpha)

    黄金分割法

    思想:不断试探缩短包含极小点的区间,求得逼近的极小值。

    定理:设 (f(x)) 是区间 ([a,b]) 上的一元函数,(x')(f(x)) 是区间 ([a,b]) 上的极小点。任取点 (c<din [a,b]),则有

    1. (f(c)>f(d),x'in[c,b])
    2. (f(c)<f(d),x'in[a,d])

    黄金分割法:设 (f(x))([a_1,b_1]) 上单峰,极小点 (x'in [a_1,b_1]),假设进行第 (k) 次迭代前 (x'in [a_k,b_k]),取 (lambda_k,mu_k in [a_k,b_k]),且 (lambda_k<mu_k),则有

    1. 若 $f(lambda_k)>f(mu_k) $,令 (a_{k+1}=lambda_k,b_{k+1}=b_k)
    2. 若 $f(lambda_k)le f(mu_k) $,令 (a_{k+1}=a_k,b_{k+1}=mu_k)

    (lambda_k)(mu_k) 需满足:

    1. 满足 (b_k-lambda_k=mu_k-a_k)

    2. 每次迭代区间长度缩短比率相同

      [b_{k+1}-a_{k+1}=alpha(b_k-a_k)quad alpha>0 ]

      [egin{cases}lambda_k &=& a_k+(1-alpha)(b_k-a_k)\mu_k &=& a_k+alpha(b_k-a_k)end{cases} ]

    3. (k) 次迭代时,假设 $f(lambda_k)le f(mu_k) $,则区间更新为 ([a_{k+1},b_{k+1}]=[a_k,mu_k]),在第 (k+1) 次迭代时选取 (lambda_{k+1},mu_{k+1}),有

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

      (alpha^2=1-alphaRightarrow alpha=frac{sqrt{5}-1}{2}approx 0.618)

      同理可得,若 $f(lambda_k)> f(mu_k) $,区间更新为 $ [a_{k+1},b_{k+1}]=[lambda_k,b_k] $,有

      [egin{aligned} lambda_{k+1}&=a_{k+1}+(1-alpha)(b_{k+1}-a_{k+1})\&=a_{k+1}+0.382(b_{k+1}-a_{k+1})end{aligned} ]

    算法步骤:

    1. 给定初始区间 ([a_1,b_1]),精读要求 (varepsilon>0)

      (lambda_1=a_1+0.382(b_1-a_1))(mu_1=a_1+0.618(b_1-a_1)),并计算 (f(lambda_1))(f(mu_1))

    2. (b_k-a_k < varepsilon),算法结束。结果 (x'=frac{b_k-a_k}{2})

      否则,若 $f(lambda_k)> f(mu_k) $,转(3)。若 $f(lambda_k)le f(mu_k) $,转(4)

    3. 区间更新为 $ [a_{k+1},b_{k+1}]=[lambda_k,b_k] $,且 (lambda_{k+1}=mu_k) (减少计算,直接赋值),(mu_{k+1}=a_{k+1}+0.618(b_{k+1}-a_{k+1})),计算 (f(mu_{k+1}))(f(lambda_{k+1})) 直接由 (f(mu_k)) 得来,转(2)。

    4. 区间更新为 ([a_{k+1},b_{k+1}]=[a_k,mu_k]),且 (mu_{k+1}=lambda_k)(lambda_{k+1}=a_{k+1}+0.382(b_{k+1}-a_{k+1})),计算 (f( lambda_{k+1}))(f( mu_{k+1})) 直接由 (f(lambda_k)) 得来,转(2)。

    进退法 ( 二次插值法 )

    算法思路:利用目标函数在不同 3 点的函数值构成一个与原函数 (f(x)) 近似的二次多项式 (p(x)),以函数 (p(x)) 的极值点作为原函数 (f(x)) 的近似极值点。

    计算步骤:

    1. 给定初始点 (x_0),初始步长 (h_0),计算 (f(x_0)),令 $k=0 $。

    2. (x_{k+1}=x_{k}+h_k),计算 (f(x_{k+1})),若 (f(x_{k+1})le f(x_{k})),转(3)。否则转(4)。

    3. 加大步长。令 (h_{k+1}=2h_k)(x=x_k)(x_k=x_{k+1}),令 (k:=k+1)。转(2)

    4. 反向搜索或输出。若 (k=0),令 (h_1=h_0)(x=x_1)(x_1=x_0)(k=1),转(2),否则停止迭代,令

      [a=min{x,x_{k+1}},quad b=max{x,x_{k+1}} ]

      输出 ([a,b])

    抛物线插值法

    思想:在极小点附近,用二次三项式 (phi(x)) 逼近目标函数 (f(x)),令 (phi(x))(f(x)) 在三点 (x_1<x_2<x_3) 处有相同的函数值,并假设 (f(x_1)>f(x_2)>f(x_3))

    (phi(x)=a+bx+cx^2),代入 (f(x_1))(f(x_2))(f(x_3)) 三点值求解 (phi(x)) 的系数,再求 (phi(x)) 的极小值点 (x') 作为 (f(x)) 极小点的估计值。

    算法步骤:

    1. 给定区间 ([x_1,x_3]),设 (f(x_1)>f(x_2))(f(x_2)>f(x_3)),令 (k:=1,x_0=x_1)。给定精度 (varepsilon)
    2. (phi(x)=a+bx+cx^2)。令 (phi(x_i)=f(x_i),i=1,2,3)。解出系数 (a,b,c)。解出 (phi(x)) 的极小点 (x'_k)。若 (|f(x'_k)-f(x'_{k-1})|<varepsilon),算法结束。否则转(3)。
    3. (x_1,x_2,x_3)(x'_k) 中选择 (f(x)) 的函数值最小的三个点重新标记为 (x_1,x_2,x_3),令 (k:=k+1),转(2)。

    三次插值法

    思路:已知(f(x_1)、f(x_2),x_1<x_2),且有 (f'(x_1)<0)(f'(x_2)>0),则区间 ((x_1,x_2)) 内存在 (f(x)) 的极小点。利用 (f(x_1)、f(x_2)、f'(x_1)、f'(x_2)) 构造三次多项式 (phi(x)),使得 (phi(x))(f(x))(x_1、x_2) 有相同的函数值与导数。用 (phi(x)) 逼近 (f(x)),并用 (phi(x)) 极小点近似 (f(x)) 极小点。

  • 相关阅读:
    说到算法怎么可以少了排序呢~
    常用的re正则
    书到用时方恨少-- 正则,待修
    闲逛各个牛人的博客,观后感
    二叉树:B+tree等
    列表,链表,队列
    简述各种锁
    MongoDB
    python爬虫基础应用----爬取无反爬视频网站
    Django缓存管理的6种方法
  • 原文地址:https://www.cnblogs.com/ColleenHe/p/11735054.html
Copyright © 2011-2022 走看看