4、权重法(加权求和法)

权重法,也叫加权求和法,是多目标优化里最直观、最常用的方法之一。说白了,就是把多个目标函数乘上各自的权重,然后加在一起,变成一个单目标问题来求解。

我刚开始接触多目标优化时,第一个学的就是它。为什么?因为它简单、好理解、代码也好写。但用久了你会发现,这方法其实藏着不少坑。今天我就把这些年踩过的坑、总结的经验,一次性讲清楚。

4.1 基本原理

假设你有 m 个目标函数 f₁(x), f₂(x), ..., fₘ(x),想同时优化它们。权重法的做法是:

min F(x) = w₁·f₁(x) + w₂·f₂(x) + ... + wₘ·fₘ(x)

约束条件:x ∈ Ω
          wᵢ ≥ 0, 且 ∑wᵢ = 1

每个 wᵢ 代表第 i 个目标的「重要程度」。权重越大,优化器就越偏向那个目标。

核心思想:通过调整权重,你可以得到帕累托前沿上的不同点。一组权重对应一个解。

举个例子。我在做汽车设计时,要同时优化油耗和加速性能。油耗越低越好,加速越快越好。这两个目标天然冲突。我设 w₁=0.7 给油耗,w₂=0.3 给加速,结果得到一个偏省油的设计。反过来,就得到一个偏性能的设计。

4.2 权重选择策略

权重怎么选?这是个好问题。我见过不少新手直接拍脑袋定权重,结果跑出来的解根本不能用。这里分享几种我常用的策略。

4.2.1 等权重法

最简单的方法:所有目标权重相等,wᵢ = 1/m。适合你对目标优先级完全没概念的时候。但说实话,实际项目中很少用。因为目标之间量纲不同,等权重不代表「公平」。

4.2.2 基于偏好的权重

根据业务需求手动设定。比如客户说「成本比质量重要两倍」,那你就设 w₁=0.67, w₂=0.33。我建议你多跟业务方聊,搞清楚他们真正的痛点在哪。

4.2.3 自适应权重

这是我个人比较喜欢的方法。先跑一轮等权重,看看每个目标的大致范围。然后根据范围反推权重,让每个目标对总目标的贡献量级差不多。

# 自适应权重计算示例
def adaptive_weights(objective_ranges):
    """
    objective_ranges: 每个目标的大致范围 [(min1, max1), (min2, max2), ...]
    """
    ranges = [max_val - min_val for min_val, max_val in objective_ranges]
    total_range = sum(ranges)
    weights = [r / total_range for r in ranges]
    return weights

我的习惯:先用等权重跑一次,看看各目标的数量级。如果差太多,就用自适应权重归一化一下。这样至少不会出现某个目标「吃掉」其他目标的情况。

4.3 权重敏感性分析

权重变了,解会怎么变?这就是敏感性分析要回答的问题。我曾经在一个项目中,权重只调了 0.05,结果解完全跑偏了。从那以后,我每次都会做敏感性分析。

4.3.1 单权重扫描

固定其他权重,只变化一个权重。比如固定 w₂=0.3,让 w₁ 从 0 扫到 0.7。观察目标函数值的变化曲线。

4.3.2 权重网格搜索

对两个目标的情况,可以做一个网格扫描:

for w1 in np.linspace(0, 1, 11):
    w2 = 1 - w1
    # 求解加权单目标问题
    solution = solve_weighted_problem([w1, w2])
    record(solution)

这样你能看到整个帕累托前沿的近似形状。如果某个区域解变化剧烈,说明那里权重很敏感,要小心处理。

注意:权重法只能找到凸帕累托前沿上的点。如果前沿是非凸的,有些点你永远找不到。这是权重法的固有缺陷。

4.4 优缺点讨论

优点 缺点
实现简单,代码量少 只能找到凸帕累托前沿上的点
计算效率高,一次求解一个单目标问题 权重选择主观性强,不同权重可能得到相同解
容易理解,业务方也能看懂 目标量纲不同时,权重意义不明确
可以快速得到一个可行解 无法处理非凸、不连续的帕累托前沿
适合作为基线方法 权重均匀分布不保证解均匀分布

嗯,这里我要多说一句。权重法虽然简单,但千万别小看它。我在工业界的很多项目里,最终交付用的就是权重法。为什么?因为业务方要的不是「完美的帕累托前沿」,而是一个「能用的、可解释的解」。权重法恰好能满足这个需求。

你想想看,你跟客户说「我们用 NSGA-II 跑出了 100 个帕累托最优解」,客户一脸懵。但你说「我们根据您的偏好,调了调权重,找到了一个平衡方案」,客户立马就懂了。这就是权重法的价值所在。

4.5 知识体系总览

下面这张图是我自己整理的权重法知识结构,方便你快速回顾。

权重法(加权求和法) 基本原理 F = Σ wᵢ·fᵢ(x) wᵢ ≥ 0, Σwᵢ = 1 权重选择策略 等权重法 基于偏好法 自适应权重法 权重敏感性分析 单权重扫描 网格搜索 解变化监测 优缺点讨论 优点:简单、高效、可解释 缺点:非凸前沿失效 适用场景 快速原型验证 业务可解释性要求高 核心要点 权重法是最实用的多目标优化入门方法 理解它的优缺点,比学会代码更重要

我的建议:如果你是初学者,先从权重法入手。跑通一个完整的流程,理解权重怎么影响结果。然后再去学 NSGA-II、MOEA/D 这些高级方法。基础打牢了,后面学什么都快。

最后说一句。权重法不是万能的,但它绝对是你工具箱里最趁手的那把螺丝刀。用好了,能解决 80% 的实际问题。剩下的 20%,我们再上其他方法。


公众号:蓝海资料掘金营,微信deep3321