多目标优化
"又要便宜又要好"不是矛盾修辞,它是绝大多数真实决策的正常形态。多目标优化不承诺给你一个最优解——它承诺给你一整条前沿,以及一句很重要的话:在这条线上,任何改进都必须以另一个目标变差为代价。剩下的取舍,是决策者的事,不是算法的事。
本页实验台
LAB 01
Pareto 前沿
在两个目标的平面上,看哪些解被支配、哪些留在前沿上
问题
买车既想便宜又想省油,这两个目标没法同时最优。那"最优解"这个词还有意义吗?有——只是它从一个点变成了一条曲线:那条曲线上的每一点,想改善一个目标就必须牺牲另一个。
模型
Pareto 支配与 Pareto 前沿。
x 支配 y ⟺ ∀i: fi(x) ≤ fi(y) 且 ∃j: fj(x) < fj(y)
Pareto 最优 = 不被任何解支配
Pareto 前沿是所有 Pareto 最优解在目标空间里的像。它把"技术问题"和"价值判断"干净地分开了:算法负责给出整条前沿,在前沿上选哪一点是决策者的事,不是数学问题。Pareto 最优 = 不被任何解支配
前沿上有几个方案—
被支配的方案数—
前沿占全部方案的比例—
单看成本最优 / 单看工期最优—
把相关性从 −0.6 拖到 +0.9。两个目标不再冲突以后,前沿会迅速塌缩成很少的几个点——极端情况下只剩一个,这时问题其实退化成了单目标。反过来拖到 −0.95,前沿会占到全部方案的相当大一部分。这就是多目标问题的难度来源:难的不是"目标多",而是"目标互相冲突"。再看最后那个读数:只看成本的最优方案和只看工期的最优方案,它们一定都在前沿上(前沿的两个端点),但通常是整条前沿上最极端、也最不适合直接采纳的两个。决策者真正想看的,往往是中间那一段"多花一点钱能省很多时间"的位置——而这种位置只有把整条前沿画出来才看得见。
LAB 02
权重法与 ε-约束法
换权重扫出前沿,看凹陷段为什么扫不到
问题
最常见的做法是给两个目标加权求和,调权重就能扫出整条前沿——这个说法只在前沿是凸的时候成立。凹陷的那一段无论权重怎么调都扫不到,这是一个必须知道的坑。
模型
两种扫描方法及其适用范围。
权重法:min Σi wi fi(x) (只能得到凸前沿上的点)
ε-约束法:min f₁(x) s.t. fi(x) ≤ εi (凹段也能取到)
几何上的原因:加权和的等值线是直线,直线只能"托住"凸包上的点;凹陷处的点永远在某条支撑线的上方。ε-约束法用的是"切一刀再最小化",所以不受凸性限制。ε-约束法:min f₁(x) s.t. fi(x) ≤ εi (凹段也能取到)
权重法扫到几个不同的点—
ε-约束法扫到几个不同的点—
当前 w 解出来的点—
权重法覆盖了前沿的多少—
先看凹前沿。把权重 w 从 0 慢慢推到 1,解出来的点只会在两个端点之间"跳"一次,中间那一大段永远扫不到。原因在图上是直接可见的:加权和的等值线是一条直线,它从外面往里压,最先碰到的一定是凸包上的点;而凹陷段整个躲在凸包里面,直线永远够不着它。这不是算法不够好,是方法本身的盲区。ε-约束法换了个思路:固定一个目标的上限,去优化另一个。它每次解的是一个带约束的单目标问题,所以凹凸都能扫到,代价是要解很多次、而且 ε 的取值范围需要事先估计。切回凸前沿看看:这时两种方法扫出来的点几乎重合,权重法因为实现简单反而更划算。结论不是"权重法不好",而是"用它之前要先知道前沿是不是凸的"——而这件事在真实问题里你通常并不知道。
LAB 03
NSGA-II 思想
非支配排序与拥挤距离,让种群沿前沿均匀铺开
问题
用进化算法求多目标有一个特别的难处:不仅要逼近前沿,还要让解在前沿上分布均匀——全挤在一端的"前沿"对决策者没用。NSGA-II 用两个排序把这两件事同时办了。
模型
非支配排序 + 拥挤距离。
第 1 层 = 不被任何解支配;去掉后剩下的里再取第 2 层……
拥挤距离 di = Σm ( fmi+1 − fmi−1 ) ⁄ ( fmmax − fmmin )
先按层排(逼近前沿),同层内按拥挤距离从大到小排(保持多样性)。拥挤距离大意味着周围空旷,应该保留;这条规则让种群自动沿前沿铺开,不需要人为设小生境半径。拥挤距离 di = Σm ( fmi+1 − fmi−1 ) ⁄ ( fmmax − fmmin )
第一前沿上的点数—
到真前沿的平均距离—
相邻间距的标准差(越小越均匀)—
代数—
NSGA-II 只做两件事,这个实验台把它们拆开了。第一件是非支配排序:把种群一层一层剥开,第一层是当前的前沿,剥掉之后剩下的再排第二层,依此类推。选择时优先保留层级靠前的——这保证了收敛,也就是往真前沿压。第二件是拥挤距离:同一层里,优先保留周围邻居稀疏的个体。这保证了分布,也就是沿着前沿铺开而不是挤成一团。把"用拥挤距离"关掉跑几十代:收敛读数不会明显变差,但间距标准差会大幅上升,图上能直接看到点聚成几团、前沿两端空出来。这就是为什么多目标算法必须同时报告两个指标——只报收敛性的论文,等于只说了一半。
这一页想说的
多目标优化改变的是汇报方式,而不只是算法。单目标问题你交一个数;多目标问题你交的是一整条前沿,外加一句"这些点之间没有客观的优劣,请你选"。实际工作里最常见的错误是提前把多目标压成单目标:随手定几个权重、加权求和、报一个解,于是所有的取舍都被藏进了那几个没人讨论过的权重里。更稳妥的做法是先把前沿算出来给决策者看,让权重成为讨论的结论,而不是讨论的前提。