背景介绍
Nelder-Mead:单纯形法秉承保证每一次迭代比前一次更优的基本思想,先找出一个基本可行解,看是否是最优解,若不是,则按照一定法则转换到另一改进后更优的基本可行解,再鉴别,若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。
核心思想
1. 随机产生N+1个点,构造单纯形,N为所求极值的维度
2. 对这些点的函数值进行从小到大排序,求出最优N个点的重心pg
$$f(p_0) \leq f(p_1) \leq \ldots \leq f(p_N)$$
$$p_{g}=\displaystyle \sum_{i=0}^{N-1}\frac {p_{i}}{N}$$
3. 对最差的点进行反射得到pr
$$p_{r}=p_{g}+\rho \cdot (p_{g}-p_{N}) \ , \ 其中 \rho 为反射系数$$
4. 如果f(p0)≤f(pr)<f(pN-1),pr代替pN,回到步骤2
5. 如果f(pr)<f(p0),说明pr方向有利于函数值下降
$$p_{e}=p_{g}+ \chi \cdot (p_{r}-p_{g}) \ , \ 其中 \chi 为延伸系数$$
6. 如果f(pe)<f(pr),pe代替pN,否则pr代替pN,回到步骤2
7. f(pr)≥f(pN-1),说明要进行收缩操作
$$p_{c}= \begin{cases} p_{g}+ \gamma \cdot (p_{r}-p_{g}) & f(p_{r}) < f(p_{N}) \ p_{g}+ \gamma \cdot (p_{l}-p_{r}) & f(p_{r}) \ge f(p_{N}) \end{cases} \ , \ 其中 \gamma 为收缩系数$$
8. 如果f(pc)≤f(pN),pc代替pN,回到步骤2
9. f(pc)>f(pr),只保留p0,其他点到p0距离减半,收缩单纯形
10.如果不满足某个终止条件,回到步骤2
算法流程
代码实战
代码中所用测试函数可以查看相关文档,测试函数(Test Function)
NelderMead_main.m
1 | clear;clc;close all; |
f.m
1 | function res=f(x) |
实验结果
$$f(x)=x \cdot \sin(\sqrt{\lvert x \rvert}) \ , \ x \in [-500,500]$$
$$理论值:f(x)_{min}=f(-420.96874592006)=-418.982887272434$$
$$所求值:f(x)_{min}=f(-420.968746504328)=-418.982887272434$$
性能比较
- 优点:
- 受到参数影响较小
- 具有快速随机的搜索能力
- 可用于求解复杂的非线性优化问题
- 每次迭代都更接近最优解,精度最高
- 缺点:
- 算法性能与初始值有关
- 不适用于多维的最优值求解
- 可能落入其他的局部最小值