1.直接搜索
1.1 黄金分割法
1.1.1 基本信息
适用范围:单峰函数求极小值问题
特点:
迭代逼近极小值点:
黄金分割法通过不断地迭代,在每一步中缩小搜索区间,以逼近极小值点。每次迭代都会根据黄金比例将当前搜索区间分成两部分,并选择较小函数值所在的部分进行下一步的搜索。
不依赖梯度信息:
与梯度下降方法不同,黄金分割法不需要函数的梯度信息。它是一种无梯度的优化方法,适用于那些无法或难以求得梯度信息的问题。
基本原理:
黄金分割法是建立在区间消去法原理基础上的试探方法,即在搜索区间[a,b]内适当插入两点a1, a2,并计算其函数值。
a1, a2将区间分成三段,应用函数的单峰性质,通过函数值大小的比较,删去其中一段,是搜索区间得以缩小。然后再在保留下来的区间上作同样的处理,如此迭代下去,搜索区间无限缩小,从而得到极小点的数值近似解。
1.1.2 算法流程
初始化:
计算内部点:
黄金比例:
计算函数值:
选择新区间:
收敛判断:
如果满足停止迭代条件,则停止迭代;否则,增加迭代次数
,返回步骤 2 继续迭代。
1.1.3 代码实现
1 | import numpy as np |
1.2 斐波那契搜索
适用范围:单峰函数求极小值问题
特点:
- 与1黄金分割法类似
1.2.1 对比
Fibonacci法
计算次数确定: 在使用Fibonacci法之前,需要根据目标精度预先计算出检查函数值的次数
。这通常涉及到选择一个足够小的Fibonacci数作为最终区间长度的目标,从而反推出 。 优点: 能够确保原始区间与最终选定区间长度的比值接近最优(即最大值),这是由于Fibonacci序列的性质决定的。
缺点: 每次区间缩短的比例
是变化的,这可能导致计算过程相对复杂且计算量较大,尤其是在确定迭代步数时。
黄金分割法
作为极限形式: 黄金分割法可视作Fibonacci法的一种简化或极限情况,其区间缩短率固定为黄金比例
0.618
。缩短率计算: 黄金分割法中,每次迭代都保持区间被分割的比例不变,即保留的两部分
和 长度比约为黄金比例分割。这一比例由下式体现: ,当取 时,满足黄金分割的要求,使得区间缩小的方式达到一种平衡状态,既高效又稳定。
总结
Fibonacci法提供了理论上最优的区间缩小策略,但实施起来较为复杂。相比之下,黄金分割法则通过固定分割比率简化了计算过程,虽然可能不是最优的区间缩小比例分配,但其简单性和实用性使其成为寻找函数极值点的常用方法之一。
1.2.2 算法流程
初始化斐波那契数列的前两个元素:
计算搜索区间长度
,其中 和 为区间端点, 计算斐波那契数列长度n
,其中 为搜索区间的长度, 为给定的精度。
计算内点
和 : 。
计算
和 比较
和 ,更新搜索区间 - 如果
,则新的搜索区间为 。 - 如果
,则新的搜索区间为 。 - 如果
,则新的搜索区间为 。
- 如果
重复步骤4到步骤6,直到搜索区间的长度小于给定的精度
1.2.3 代码实现
1 | # 计算斐波那契数列的前 n 项 |
2.精确线搜索
2.1 目标
找到一个步长
2.2 精确线搜索定理
推导如下:
在一个线性搜索中,给定搜索方向
, 目的是找到一个合适的
使得 , 就是找到一个步长
使函数值更加小。 如果能找到一个最佳的步长
使函数值最小,即 称为精确线搜索。 既然找到的步长是最佳的,
也就是最小的,则在 处的梯度(对步长 一阶导数)为0,即:
3.非精确线搜索
精确线搜索算法往往会需要很大的计算量,因此,我们一般青睐于非精确线搜索算法。
3.1 目标
找到一个步长
3.2 Armijoz准则
其中:
是当前点 的目标函数值, 是搜索方向, 是步长, 是一个控制参数,通常取值范围为
3.3 Goldstein准则
其中: -
3.4 Wolfe准则
其中: -
5.参考
- https://zhuanlan.zhihu.com/p/651901246
- https://blog.csdn.net/qq_37314249/article/details/104525944