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 知识体系总览
下面这张图是我自己整理的权重法知识结构,方便你快速回顾。
我的建议:如果你是初学者,先从权重法入手。跑通一个完整的流程,理解权重怎么影响结果。然后再去学 NSGA-II、MOEA/D 这些高级方法。基础打牢了,后面学什么都快。
最后说一句。权重法不是万能的,但它绝对是你工具箱里最趁手的那把螺丝刀。用好了,能解决 80% 的实际问题。剩下的 20%,我们再上其他方法。
公众号:蓝海资料掘金营,微信deep3321