4. 目标函数的构建与选择

在非线性约束优化模型中,约束条件划定了“可行域”,而目标函数则决定了在可行域内“哪个点更好”。同一个工程问题,目标函数写得不同,最终得到的解可能完全不同。因此,目标函数的构建不是套公式,而是一次对问题价值的建模:你究竟想让模型优化什么,用什么指标衡量“更优”,以及当多个指标冲突时如何取舍。

一、单目标场景:把业务目标翻译成可计算的标量函数

单目标优化的形式是 min f(x),s.t. gi(x) ≤ 0,hj(x) = 0。构建目标函数的关键动作是:确定决策变量 x,选定一个能代表核心诉求的标量指标,并保证它与决策变量之间有明确的数学关系。

以某型换热器设计为例(示例参数,仅用于教学演示):决策变量为换热管外径 d(mm)与管程流速 v(m/s),约束为压降不超过 30 kPa、管束外径不超过 500 mm。若设计目标是“降低运行能耗”,目标函数应写成泵功形式:

f(d, v) = Δp(d, v) · Q / η
其中 Δp 由 Darcy–Weisbach 关联式估算,Q 为体积流量,η 为泵效率
示例取值:Q = 0.02 m³/s,η = 0.72

这里有两个容易出错的点。第一,目标函数必须与约束“量纲一致、口径一致”:如果压降已经作为约束上限 30 kPa,那么目标函数里再用压降作为惩罚项就会重复计入,导致模型对压降过度敏感。第二,目标函数应尽量光滑可导。例如把“最大应力”写成 max 算子会引入不可导点,工程上常改用 p-范数近似:σmax ≈ (Σσip)1/p,p 取 8~16,既逼近最大值又保持可微,便于梯度类算法收敛。

此外,量纲归一化是单目标建模的隐性要求。若目标函数由多项相加构成,例如“成本 + 重量”,必须先把各项除以各自的参考值化为无量纲量,否则数值大的项会主导优化方向,模型实际上只优化了那一项。

二、多目标场景:先判断冲突,再选择处理方式

当问题同时要求“成本低、效率高、寿命长”时,这些目标往往互相冲突:提高流速 v 可增强换热、减小面积,但压降上升、泵功增加。此时不存在使所有目标同时最优的单一解,而是一组 Pareto 最优解集。处理多目标问题有三条典型路线,选择依据是“决策者能否在建模前说清偏好”。

路线一:权重法。把多目标加权成单目标:min F(x) = Σ wk fk(x),Σ wk = 1,wk ≥ 0。优点是可直接复用单目标求解器;缺点是权重与解的对应关系不直观,且当 Pareto 前沿非凸时,权重法无法获得非凸段上的解。

路线二:优先级法(字典序法)。按重要性排序 f1 ≻ f2 ≻ …,先优化 f1 得最优值 f1*,再加入约束 f1 ≤ f1* + δ1 优化 f2,逐级进行。适合“安全指标绝不能被经济指标牺牲”的场景。

路线三:目标规划。为每个目标设定期望值 Tk 与允许偏差,引入正负偏差变量 dk+、dk−,最小化加权偏差总和:min Σ (wk+dk+ + wk−dk−),并满足 fk(x) + dk− − dk+ = Tk。它不追求“最优”,而追求“离期望最近”,非常适合有明确设计指标的工程选型。

下面这张图把三条路线放在同一决策框架下对比,重点表现“偏好信息在何时进入模型”这一本质差异。

多目标目标函数的三条处理路线 核心差异:决策者偏好信息在建模流程中的介入位置 多目标问题 f₁, f₂, …, fₖ 相互冲突 权重法 建模前给定 wₖ F = Σ wₖ fₖ(x) 优先级法 建模前给定次序 逐级加约束求解 目标规划 建模前给定期望 Tₖ 最小化偏差 d⁺, d⁻ 单一加权解 改变 wₖ 可扫描前沿 非凸段可能取不到 分级满意解 高优先级目标优先保障 低优先级目标可能被牺牲 偏差最小解 贴近各目标期望值 可区分“不足”与“超出” 偏好介入 时机 权重法 求解前 优先级法 逐级求解中 目标规划 设定期望时 选择依据: 偏好可量化 → 权重法;存在不可牺牲的硬指标 → 优先级法;有明确设计指标区间 → 目标规划。三者都需先做量纲归一化。

三、权重法的实操细节:权重不是拍脑袋

权重法看似简单,但权重取值直接决定解的位置。工程上常用两种确定方式:一是“等权试探 + 扫描”,先取 w = (0.5, 0.5) 求解,再以 0.1 为步长扫描 w1 从 0.1 到 0.9,观察各目标值的变化曲线,若某段曲线出现明显拐点,说明该区域目标冲突剧烈,应重点考察;二是“归一化后按重要性分配”,例如成本与效率的参考值分别为 50 万元与 0.85,则先令 f1′ = f1/50、f2′ = f2/0.85,再加权,避免量纲差异淹没权重意图。

需要提醒的是,权重法得到的是“某个偏好下的最优解”,不是“全局最优”。若把 w1 从 0.5 调到 0.6 后解发生跳变,往往说明 Pareto 前沿在该处不光滑,此时应结合 ε-约束法(把一个目标转为约束 f2 ≤ ε,扫描 ε)来补全前沿。

四、目标规划的一个可执行算例

仍以换热器为例,设两个目标:泵功 f1 期望不超过 1.2 kW,换热面积 f2 期望不超过 8 m²。引入偏差变量后,模型写为:

min  Z = 3·d1⁺ + 2·d2⁺ + 0.5·d1⁻ + 0.5·d2⁻
s.t. f1(d, v) + d1⁻ − d1⁺ = 1.2
     f2(d, v) + d2⁻ − d2⁺ = 8.0
     Δp(d, v) ≤ 30 kPa
     d ∈ [12, 25] mm,  v ∈ [0.5, 2.5] m/s
     d1⁺, d1⁻, d2⁺, d2⁻ ≥ 0

这里 d+ 表示“超出期望”的部分,d− 表示“优于期望”的部分。对泵功而言,超出期望是坏事,故 d1+ 权重取 3;对面积而言,超出期望同样不利但紧迫性稍低,权重取 2;而“优于期望”过多并无额外收益,故 d− 权重取小值 0.5,防止模型为追求过度富余而扭曲设计。求解后若 d1+ = 0.18、d2+ = 0,说明泵功超出期望 0.18 kW 而面积达标,此时应回到约束端检查压降上限是否过紧,或调整权重重新权衡,而不是直接接受该解。

构建目标函数的检查顺序:① 决策变量是否覆盖了真正可调的手段;② 目标是否与约束口径重复;③ 各项是否已归一化;④ 是否存在不可导的 max/min 算子需要平滑;⑤ 多目标时偏好信息是否在正确环节介入;⑥ 求解后是否用“改变权重/期望值看解是否合理漂移”做了敏感性验证。

目标函数的选择本质上是一次价值判断的显式化。单目标场景要求你把“最重要的事”写成一个可计算的标量;多目标场景则要求你诚实面对冲突,并用权重、优先级或期望值把决策者的偏好翻译成模型能读懂的语言。写完之后,不妨反问一句:如果这个目标函数被优化到极致,现实中的设计会变成什么样?如果答案明显荒谬,说明目标函数还缺约束或归一化。