4. 全局优化算法:模拟退火、遗传算法与粒子群

说到光学系统优化,大部分时候局部优化就够用了。但有些情况——比如初始结构选得不好,或者系统本身有多个极值点——局部优化就会卡在某个坑里出不来。这时候就得请出全局优化算法了。

我个人习惯把这三种算法称为「三大金刚」:模拟退火、遗传算法、粒子群优化。它们各有脾气,也各有擅长。今天咱们一个一个聊。

4.1 模拟退火算法原理

模拟退火这个名字,听起来挺玄乎。其实说白了,就是模仿金属退火的过程——金属加热后慢慢冷却,内部原子会逐渐排列成能量最低的状态。

在光学优化里,我们把「能量」换成「评价函数值」。算法会以一定概率接受比当前更差的解,这个概率随着「温度」降低而减小。为什么要接受差解?为了跳出局部极值。

我的经验:模拟退火在光学设计里最适合做「粗调」。先用它跑一轮,找到几个有潜力的区域,再切到局部优化精调。我曾经在一个投影物镜项目里,用模拟退火找到了一个初始结构,后续用阻尼最小二乘法只跑了20轮就收敛了——比纯局部优化快了将近3倍。

模拟退火的核心参数有三个:

参数 作用 典型取值
初始温度 T₀ 控制早期接受差解的概率 100~1000
降温速率 α 每次迭代温度乘的系数 0.85~0.99
终止温度 Tₑ 低于此值停止搜索 0.01~1

伪代码其实很简单:

初始化温度 T = T₀
生成初始解 x
while T > Tₑ:
    生成邻域解 x'
    ΔE = f(x') - f(x)
    if ΔE < 0:
        x = x'  # 接受更好解
    else:
        if random() < exp(-ΔE / T):
            x = x'  # 以概率接受差解
    T = α * T  # 降温
避坑:我曾经在一个变焦镜头优化里,把降温速率设成了0.95,结果跑了整整两天还没收敛。后来改成0.9,半天就出结果了。降温太慢,计算量爆炸;降温太快,又容易过早收敛。建议先从0.9试起。

4.2 遗传算法在光学中的应用

遗传算法,顾名思义,模仿的是生物进化过程。选择、交叉、变异——这三板斧在光学设计里特别好使。

为什么?因为光学系统的参数空间往往是高维的、非连续的。遗传算法不需要梯度信息,只要你能写出评价函数,它就能搜。

我见过不少同行用遗传算法来优化非球面系数、自由曲面参数。尤其是自由曲面,参数多、耦合强,局部优化基本没用,遗传算法反而能给出不错的结果。

遗传算法的关键操作:

  • 编码:把光学参数(曲率半径、厚度、非球面系数)编码成「染色体」。我习惯用实数编码,比二进制编码更直观。
  • 选择:轮盘赌、锦标赛、精英保留。我个人偏爱精英保留——保证每一代最好的几个解不会丢失。
  • 交叉:模拟生物基因交换。实数编码常用模拟二进制交叉(SBX)。
  • 变异:随机扰动参数,防止种群过早收敛。
实战建议:种群大小一般取50~200。太小容易早熟,太大计算量吃不消。我在一个离轴三反系统优化里,用了80个个体、200代,跑出了比初始结构像质好3倍的结果。

遗传算法在光学中的典型应用场景:

场景 说明 效果
初始结构搜索 从随机参数出发,找到可行解 ★★★★★
非球面/自由曲面优化 高维参数,梯度法失效 ★★★★☆
多目标权衡 像质、公差、成本同时考虑 ★★★★☆
局部精调 收敛速度慢,不适合 ★★☆☆☆

4.3 粒子群优化算法

粒子群优化(PSO)是我个人最喜欢的一种全局算法。为什么?因为它简单、参数少、收敛快。

想象一下:一群鸟在找食物。每只鸟知道自己当前的位置,也知道整个鸟群目前找到的最好位置。它们一边飞,一边向这两个方向靠拢。这就是PSO的核心思想。

在光学设计里,每个「粒子」就是一个候选解。粒子在参数空间里飞行,速度由三个因素决定:

  • 惯性:保持原来的飞行方向
  • 个体认知:飞向自己找到过的最好位置
  • 社会认知:飞向整个群体找到的最好位置

速度更新公式:

v = w * v + c1 * r1 * (pbest - x) + c2 * r2 * (gbest - x)
x = x + v

其中 w 是惯性权重,c1、c2 是学习因子,r1、r2 是随机数。

我的调参习惯:w 从0.9线性降到0.4,前期全局搜索,后期局部精调。c1和c2都取2.0,效果比较均衡。粒子数一般取20~40,比遗传算法少很多,计算量也小。

PSO在光学里的优势很明显:

  • 不需要梯度信息,适合非连续、不可导的评价函数
  • 收敛速度快,通常几十代就能找到不错的结果
  • 实现简单,代码量少
注意:PSO容易陷入局部极值,尤其是当群体过早收敛时。我一般会加一个「变异」操作——每隔几代,随机重置一部分粒子的位置。这招在优化一个鱼眼镜头时救了我一命,原本卡在局部极值,加了变异后找到了更好的解。

4.4 三种算法对比

你想想看,这三种算法到底选哪个?我个人的经验是:

维度 模拟退火 遗传算法 粒子群
收敛速度 慢 中等 快
全局搜索能力 强 强 中等
参数数量 少 多 少
实现难度 低 中 低
适合场景 粗调、初始搜索 高维、多目标 快速优化、中等维度

嗯,这里要注意:没有万能算法。我见过有人非要用遗传算法优化一个只有3个变量的系统,结果跑了半天还不如直接网格搜索。选算法要看问题规模、参数维度、计算资源。

4.5 全局优化算法知识体系

下面这张图总结了三种算法的核心逻辑和关系:

全局优化算法知识体系 全局优化算法知识体系 模拟退火 遗传算法 粒子群优化 概率接受差解 选择·交叉·变异 个体+社会认知 初始结构搜索 高维参数优化 快速收敛优化 选择建议 维度低、计算资源少 → 模拟退火 维度高、多目标 → 遗传算法 中等维度、追求速度 → 粒子群优化 没有万能算法,选对工具事半功倍

这张图把三种算法的核心机制、应用场景和选择建议串在了一起。你可以把它当作一个快速参考——下次遇到优化问题,先看看自己的需求落在哪个区域。

最后说一句:全局优化不是终点,而是起点。我通常的做法是:先用全局算法找到几个有潜力的区域,再用局部优化精调。两者结合,效果远好于单独使用任何一种。