背景介绍
SA(Simulate Anneal):是一种基于Mentcarlo迭代求解法的一种启发式随机搜索方法,基于物理中固体物质的退火过程与一般组合优化问题之间的相似性,通过模拟退火过程,用来在一个大的搜寻空间内找寻命题的最优解(或近似最优解)。
核心思想
1. 任选一初始状态S0作为当前解,设置初始温度T0
2. 对该温度下的状态S0产生一个扰动S’,并按概率接收
$$\Delta C=f(S’)-f(S)$$
$$P= \begin{cases} 1 & \Delta C \leq 0 \ e^{\frac {- \Delta C}{T} } & \Delta C > 0 \end{cases}$$
3. 按照某种方式降温T=T-ΔT,回到步骤2,直到满足某个终止条件
4. 此时达到的状态S即为该算法的最优解
算法流程
代码实战
代码中所用测试函数可以查看相关文档,测试函数(Test Function)
SA_ap.m
1 | clear;clc;close all; |
SA_metripolis.m
1 | function x=SA_metripolis(range_x,t,x,n) |
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.967823415805)=-418.982887164947$$
性能比较
- 优点:
- 计算过程简单
- 可用于求解复杂的非线性优化问题
- 相比梯度下降,增加了逃离局部最小的可能
- 缺点:
- 参数敏感
- 收敛速度慢
- 执行时间长
- 算法性能与初始值有关
- 可能落入其他的局部最小值