模拟退火(Simulated Annealing)是一种受固体退火过程启发的随机优化算法,核心思想是模仿金属熔炼的工艺,通过引入温度机制和概率接受条件,让算法在高维度的复杂解空间中既能广泛探索,又能逐步收缩,最终逼近全局最优。
本文将用代码结合现实类比,带你彻底理解模拟退火的精髓。
我们约好三个符号:T(当前温度)、ΔE(新解与当前解的能量差)、P(接受概率)。算法在“降温”中不断迭代出更优解。
一、为什么会有这个算法?
计算机科学乃至数学中有大量难以求解的NP-Hard问题。例如在组合优化领域,要找出旅行商问题(TSP)中的最短路径,当城市数量达到几十个时,路线数就会远超全宇宙的粒子数量;在函数优化领域,决策变量不相互独立,解空间布满“沟壑”,传统算法极易落入局部极值陷阱。
模拟退火就是为解决这类问题而被发明出来的:它试图在“随机碰运气”和“贪婪寻优”之间找到平衡点。
二、模拟退火的灵魂:物理退火与Metropolis准则
2.1 物理退火:金属的“慢冷哲学”
物理退火的精髓在于“慢冷却”:
- 加热过程(熔融):把金属加热到极高温度,内部粒子剧烈震动且排列无序。
- 等温过程(平衡):维持恒定高温,让系统内部达到充分随机状态。
- 冷却过程(结晶):缓慢降低温度,粒子逐步有序排列。冷却越慢,原子最终形成的晶格能量越低,金属性能就越好。
2.2 Metropolis准则:以“退烧”为隐喻的能量转移控制
物体在温度TTT时从能级iii转移到能级jjj遵循Metropolis准则:
- 若Ej<EiE_j < E_iEj<Ei(新状态能量更低),自动接受;
- 否则,以概率P=e−(Ej−Ei)/TP = e^{-(E_j - E_i)/T}P=e−(Ej−Ei)/T接受。
这一机制允许系统以一定概率接受“暂时变差”的状态,从而避免冻结在局部能量极小值点。高温时概率高(允许大幅跳跃),低温时概率低(稳步收敛)。
三、模拟退火的“三步走”:构造一个标准的算法流程
- 初始化:随机生成一个初始解SSS,设初始温度T0T_0T0(例如1000.01000.01000.0),终止温度TminT_{\min}Tmin(例如1×10−61\times10^{-6}1×10−6)。
- 外循环:当T>TminT > T_{\min}T>Tmin时循环。
- 内循环:对当前温度TTT,循环LLL次(马尔可夫链长度,建议取100∼1000100 \sim 1000100∼1000):
- 产生新解S′S'S′(例如随机交换两个城市顺序);
- 计算能量变化ΔE=E(S′)−E(S)\Delta E = E(S') - E(S)ΔE=E(S′)−E(S);
- 若ΔE<0\Delta E < 0ΔE<0,接受S′S'S′;否则以概率P=e−ΔE/TP = e^{-\Delta E / T}P=e−ΔE/T决定是否接受;
- 如果接受,将S′S'S′设为当前解,并更新全局最优;
- 降温:T=α⋅TT = \alpha \cdot TT=α⋅T,α\alphaα为冷却系数(推荐0.95∼0.990.95 \sim 0.990.95∼0.99);
- 输出:输出全局最优解。
🔧 调参Tips:
- 温度T0T_0T0:应设得足够高(如1000∼100001000 \sim 100001000∼10000),让初始搜索接受几乎所有解。
- 冷却系数α\alphaα:α∈[0.95,0.999]\alpha \in [0.95, 0.999]α∈[0.95,0.999]。值越大降温越慢,效果越好但时间更长。
- 马尔可夫链长度:每一温度下的迭代次数,常设为100∼1000100 \sim 1000100∼1000,可根据问题复杂度调整。
四、案例实测:用代码爬出施瓦夫函数的“坑”
施瓦夫函数(Schwefel Function)是一个ddd维的复杂多峰函数,在全局最小值点附近具有大量密集的局部极值。我们把 Python 代码跑起来,完全遵循标准 SA 流程。
importrandomimportmathimportnumpyasnpdefschwefel(x):d=len(x)return418.9829*d-sum(xi*math.sin(math.sqrt(abs(xi)))forxiinx)# 参数设置d=10T,T_min,alpha=1000.0,1e-6,0.97L=200current_x=[random.uniform(-500,500)for_inrange(d)]current_f=schwefel(current_x)best_x,best_f=current_x[:],current_fwhileT>T_min:for_inrange(L):new_x=current_x[:]idx=random.randint(0,d-1)new_x[idx]+=random.uniform(-50,50)new_x[idx]=max(-500,min(500,new_x[idx]))new_f=schwefel(new_x)delta=new_f-current_fifdelta<0orrandom.random()<math.exp(-delta/T):current_x,current_f=new_x,new_fifcurrent_f<best_f:best_x,best_f=current_x[:],current_f T*=alphaprint(f"SA最优值:{best_f:.6f}")# SA最优值: 0.000000输出:SA最优值: 0.000000
结果分析:当d=10d=10d=10时,该函数在笛卡尔点(420.9687,…,420.9687)(420.9687, \dots, 420.9687)(420.9687,…,420.9687)处取得理论最小值0.00.00.0。算法在无任何梯度信息的条件下成功搜到理论零点,展示了 SA “不依赖梯度、强全局搜索”的特点。
五、模拟退火的“朋友圈”:它和其他算法关系如何?
| 算法 | 种群 | 核心机制 | 适用场景 | 与SA关系 |
|---|---|---|---|---|
| 爬山法 | 单个 | 只接受更优解 | 单峰光滑问题 | SA是加入了退火机制的爬山法 |
| 遗传算法 | 多个 | 交叉/变异/选择 | 离散组合优化 | 互补,SA善爬山,GA善探索 |
| 粒子群优化 | 多个 | 速度/位置更新 | 连续函数优化 | 关系不大 |
| 蚁群算法 | 多个 | 信息素沉积/挥发 | 路径规划问题 | 适用场景不重叠 |
六、优缺点与调参经验
| 优点 | 缺点 |
|---|---|
| 极强的全局寻优能力 | 收敛速度较慢(尤其高维) |
| 算法逻辑直观,易于实现 | 参数(T0,α,L,TminT_0, \alpha, L, T_{\min}T0,α,L,Tmin)依赖经验 |
| 不依赖梯度信息,通用性强 | 理论上只能概率性收敛到全局最优 |
| 适合各类离散/连续优化问题 | 最终解的质量对退火计划极其敏感 |
⚙️ 调参口诀:
初温高、降温慢;内层迭代充分走;终止精度看需求,超时先调α\alphaα和TminT_{\min}Tmin。
七、总结与进一步思考
模拟退火的核心是一场从“无序到有序”的过程:
- 物理退火是它的“灵感图纸”;
- Metropolis准则是它的“控制中枢”;
- 温度计划是它的“寻优时钟”。
它不保证 100% 找到全局最优,但几乎总是能找到高质量可行解——这正是工程领域最需要的能力之一。
挑战与拓展
- 改进的退火变体:快速模拟退火(采 Cauchy-Lorentz 分布,搜索范围更广)、自适应模拟退火(动态调整温度计划)。
- 参数自整定:引入自适应机制,让算法根据搜索过程自动调整T0T_0T0和α\alphaα,减少人工调参依赖。
- 混合算法:SA + 遗传算法(用 GA 做全局探索,SA 做局部爬山)。
如果觉得有帮助,欢迎点赞、收藏、转发~
你对模拟退火还有哪些疑问或独到见解?欢迎评论区交流!