3. 优化算法与求解器联动架构
在CAE优化中,真正决定效率与可落地性的,往往不是单个优化算法本身,而是“优化算法—求解器—数据接口”三者之间的联动架构。一个成熟的联动系统需要同时回答四个问题:优化器如何向求解器下达设计变量?求解器如何把响应量回传给优化器?梯度信息从哪里来?当单次仿真代价很高时,如何减少真实求解次数?围绕这四个问题,工程上通常把联动架构划分为三层:优化算法层、调度与数据接口层、求解器执行层。黑箱优化、梯度优化和代理模型优化并不是互斥的三条路线,而是同一架构下可切换、可组合的三种“算法插件”。
一、三层联动架构的职责划分
优化算法层负责决策:在当前设计点 x 处,根据目标 f(x) 与约束 g(x),决定下一个采样点或搜索方向。调度与数据接口层负责翻译与编排:把算法给出的设计变量写入求解器输入文件(如 .inp、.cdb、.dat 或参数化脚本),启动求解进程,监控收敛与报错,再从结果文件中提取响应量。求解器执行层负责物理计算:完成网格、材料、边界条件与求解设置后,输出位移、应力、频率、温度等响应。
这一分工的关键在于接口层的解耦。若把“写输入—调求解器—读结果”硬编码进优化算法,则更换求解器或更换算法都要重写代码。合理的做法是定义统一的设计变量向量 x、响应向量 y 和约束向量 g,由接口层完成映射。例如设计变量 x = [t1, t2, r],分别对应两个板厚与一个圆角半径;响应 y = [mass, σ_max, δ_max],分别对应质量、最大应力和最大位移。
二、黑箱优化:只依赖输入输出的联动方式
黑箱优化把求解器视为一个不可微的“函数黑箱”,只使用 f(x) 与 g(x) 的取值,不要求梯度。遗传算法、粒子群、单纯形、模拟退火都属于这一类。其联动实现最简单:接口层只需具备“写参数—跑求解—读响应”的能力,无需侵入求解器内部。
以一个支架轻量化为例:设计变量为两个板厚 t1、t2,范围 2~8 mm;目标为最小化质量 m;约束为最大应力 σ_max ≤ 220 MPa、最大位移 δ_max ≤ 0.8 mm。采用粒子群算法,种群规模 20,迭代 30 代,则总求解次数约 600 次。若单次静力分析耗时 40 s,总机时约 6.7 h。黑箱优化的优点是鲁棒、易并行、对响应噪声不敏感;缺点是收敛慢,设计变量维度高时求解次数急剧上升。因此它更适合变量数较少(一般 ≤ 20)、单次求解较快、或响应面不连续的问题。
三、梯度优化:需要导数信息的联动方式
梯度优化(SQP、SLSQP、MMA、GCMMA)依赖 ∂f/∂x 与 ∂g/∂x,收敛快、迭代次数少,但要求响应可微,且需要额外获得梯度。梯度来源有三条路径:有限差分、伴随法、直接微分法。
有限差分最易实现,接口层只需对每个设计变量做一次扰动:前向差分 ∂f/∂x_i ≈ [f(x+Δx_i) − f(x)] / Δx_i。若有 n 个设计变量,每次迭代至少需要 n+1 次求解。伴随法只需一次额外求解即可获得全部梯度,适合变量多、响应少的问题,但需要求解器支持伴随灵敏度输出。直接微分法介于两者之间,精度高但实现复杂。
仍以上述支架为例,若改用 SLSQP,设计变量 2 个,迭代约 15 次,采用前向差分每次迭代 3 次求解,总求解次数约 45 次,机时约 0.5 h,相比黑箱优化减少一个数量级以上。代价是:若响应存在接触非线性或网格自适应导致的数值噪声,差分梯度可能失真,需要设置合理的差分步长(如 Δx = 1e-3 × x)并检查梯度一致性。
四、代理模型优化:用近似模型替代昂贵求解
当单次仿真代价很高(如整车碰撞、瞬态热-结构耦合,单次数十分钟到数小时),直接调用求解器做上千次迭代不可接受。代理模型优化先用少量样本构建近似模型 ŷ(x),再在代理模型上做大量廉价寻优,最后用真实求解器校核最优解。
典型流程为:试验设计(拉丁超立方或最优拉丁超立方)生成 30~80 个样本点 → 批量调用求解器 → 构建 Kriging 或 RBF 代理模型 → 用遗传算法在代理模型上寻优 → 对候选最优点做真实求解验证 → 若误差超限则加点更新代理模型。以 Kriging 为例,其预测值可写成 ŷ(x) = μ + r(x)ᵀR⁻¹(y − μ1),其中 R 为样本点相关矩阵,r(x) 为新点与样本点的相关向量。Kriging 同时给出预测方差,可用于 EGO 加点准则,优先在“预测好且不确定大”的区域采样。
五、三种路线的组合与自动调用
实际工程中,三种路线常组合使用。一种常见策略是“代理模型全局探索 + 梯度优化局部精修”:先用代理模型定位有希望的区域,再以该点为初值启动 SQP 做局部收敛。另一种是“黑箱优化处理离散变量 + 梯度优化处理连续变量”,例如板厚连续、铺层角度离散时,可分层优化。
求解器自动调用的实现要点包括:
- 参数化模板:将输入文件中的设计变量替换为占位符,如
THICK_1 = 3.5,由接口层按当前 x 替换后写出新文件。 - 进程管理:用子进程调用求解器命令,设置超时与返回码检查,避免求解失败导致优化中断。
- 结果解析:从结果文件中按关键字提取响应,如从 .dat 中读取
MAX_VONMISES与MAX_DISP。 - 失败处理:若求解不收敛或网格畸变,返回惩罚值(如 f = 1e6)而非中断,使优化器能跳出不可行区。
- 并行调度:黑箱优化与试验设计阶段可并行提交多个求解任务,梯度优化因迭代依赖通常串行。
下面给出一个接口层配置示例,用于说明设计变量、响应与求解器命令的映射关系:
variables:
- name: t1
type: continuous
lower: 2.0
upper: 8.0
token: "THICK_1"
- name: t2
type: continuous
lower: 2.0
upper: 8.0
token: "THICK_2"
responses:
- name: mass
file: "result.dat"
keyword: "TOTAL_MASS"
objective: minimize
- name: sigma_max
file: "result.dat"
keyword: "MAX_VONMISES"
constraint: "<= 220"
- name: disp_max
file: "result.dat"
keyword: "MAX_DISP"
constraint: "<= 0.8"
solver:
command: "solver -i model.inp -o result.dat"
timeout: 600
on_failure: penalty
penalty_value: 1.0e6
该配置表达了联动架构的核心约定:变量用 token 写入模板,响应用关键字从结果文件提取,约束以表达式形式声明,求解失败返回惩罚值。算法层只需读取这份配置,即可在黑箱、梯度或代理模型之间切换,而无需改动求解器调用逻辑。
六、架构选型的判断依据
选择哪种联动路线,可依据三个指标判断:设计变量维度 n、单次求解耗时 T、响应是否可微。当 n 小、T 小、响应不可微时,优先黑箱优化;当 n 中等、T 中等、响应可微且求解器支持灵敏度时,优先梯度优化;当 T 很大(如 T > 10 min)时,无论 n 大小,都应优先代理模型优化。若 n 很大且 T 很大,则应先做变量筛选与降维,再进入代理模型流程。
需要强调的是,联动架构的稳定性往往比算法先进性更重要。接口层必须保证:同一设计变量重复提交得到一致结果、结果解析不因格式微调而失败、求解异常能被捕获并转化为优化器可处理的信息。只有在这三条成立的前提下,黑箱、梯度与代理模型三种路线才能真正做到“即插即用”,支撑从单次仿真到自动优化的完整闭环。