2、多目标优化基础:Pareto最优解、支配关系、目标函数与约束条件

好,咱们正式开始啃多目标优化的硬骨头。

说实话,很多刚接触ADAS决策的同学,一听到「多目标」三个字就头大。觉得又要数学又要算法,门槛太高。其实没那么玄乎。你想想看,我们开车时做的每一个决策,本质上都是在多个目标之间找平衡——既要安全,又要舒适,还得考虑效率。这不就是多目标优化吗?

这一节,我把最核心的三个概念掰开揉碎了讲:Pareto最优解支配关系,以及目标函数与约束条件。这些都是后续所有算法的地基,务必吃透。

2.1 从单目标到多目标:为什么不能只有一个「最优」?

传统的单目标优化,目标很单纯。比如「我要让路径最短」,那算法就奔着最短路径去,结果唯一。

但在ADAS里,事情没那么简单。

举个例子:你开着车在高速上,前方有一辆慢车。你的决策系统需要决定:是跟车?还是变道超车?

这里面至少有三个目标在打架:

  • 安全性:跟车距离要足够,变道风险要低
  • 舒适性:加速度变化不能太剧烈,乘客别晕车
  • 通行效率:别太慢,否则后车会滴滴你

这三个目标往往是冲突的。你想更安全,可能就得牺牲点效率;你想更舒适,加速就得柔和,那超车时机可能就错过了。

所以,不存在一个「绝对最优」的解。我们需要的是——一组折中的、非劣的解。这就是Pareto最优解的由来。

核心认知:多目标优化的输出,不是一个点,而是一个解集。这个解集里的每个解,都代表了一种「权衡」。

3.2 支配关系:谁比谁「更好」?

既然没有绝对的最优,那我们怎么比较两个解的好坏?

这就需要引入支配关系(Dominance)。

我个人习惯用一个简单的比喻来理解:

假设有两个候选方案A和B。如果A在所有目标上都比B好,或者至少一样好,并且至少在一个目标上严格优于B,那我们就说A支配B

反过来,如果A在某些目标上比B好,但在另一些目标上比B差,那它们就是互不支配的。

用数学语言说:

  • 对于最小化问题,解x支配解y,当且仅当:
    • 对所有目标函数f_i,都有 f_i(x) ≤ f_i(y)
    • 至少存在一个目标j,使得 f_j(x) < f_j(y)

举个例子,假设我们只考虑两个目标:碰撞时间TTC(越大越好)加速度变化率Jerk(越小越好)

方案 TTC (s) Jerk (m/s³)
A 4.5 1.2
B 3.8 0.9
C 4.5 1.5

分析一下:

  • A vs B:A的TTC更好,但B的Jerk更好。互不支配。
  • A vs C:A的TTC一样,但Jerk更小。所以A支配C
  • B vs C:B的TTC更差,但Jerk更好。互不支配。

避坑指南:我曾经在项目里犯过一个低级错误——把「支配」和「优于」搞混了。记住,支配是「全面优于或等于」,不是「部分优于」。哪怕只有一个目标差一点点,那就不叫支配。

2.3 Pareto最优解与Pareto前沿

好,有了支配关系,我们就可以定义Pareto最优解了。

Pareto最优解(也叫非支配解):在一个解集中,如果一个解不被其他任何解支配,那它就是Pareto最优解。

所有Pareto最优解构成的集合,叫Pareto最优解集。这些解在目标空间中的映射,叫Pareto前沿(Pareto Front)。

你想想看,Pareto前沿上的点,有一个共同特点:你无法在不损害至少一个目标的前提下,改善另一个目标

这就像跷跷板,压了一头,另一头就翘起来。

实际意义:在ADAS决策中,Pareto前沿上的每个点,都代表了一种「合理的驾驶风格」。有的偏激进(效率高但舒适性差),有的偏保守(安全冗余大但速度慢)。最终选哪个,取决于你给不同目标赋予的权重,或者当前场景的优先级。

2.4 目标函数:怎么量化「好」与「坏」?

目标函数,说白了就是把你的决策目标「翻译」成数学公式。

在ADAS决策中,常见的目标函数有:

  • 安全性目标:比如最小化碰撞风险,可以用TTC的倒数,或者碰撞概率。
  • 舒适性目标:比如最小化Jerk(加速度变化率),或者横向加速度。
  • 效率目标:比如最小化到达时间,或者最大化平均速度。
  • 能耗目标:比如最小化电机输出功率。

举个例子,一个简单的变道决策目标函数可以写成:

// 伪代码示例:变道决策的目标函数
// 假设有三个目标:安全、舒适、效率

double safety_cost = 1.0 / ttc;  // TTC越小,成本越高
double comfort_cost = abs(jerk); // Jerk越大,越不舒适
double efficiency_cost = 1.0 / avg_speed; // 速度越慢,成本越高

// 总成本(这里先简单加权,后续章节会讲更高级的方法)
double total_cost = w1 * safety_cost + w2 * comfort_cost + w3 * efficiency_cost;

注意:目标函数的量纲和尺度差异很大。TTC是秒级,Jerk是m/s³级,速度是m/s级。如果不做归一化,权重设置会变得毫无意义。我建议在项目初期就把归一化做好,否则后面调参调到怀疑人生。

2.5 约束条件:给决策画个「安全框」

目标函数告诉你「往哪个方向走更好」,而约束条件告诉你「哪些地方不能去」。

在ADAS里,约束条件通常分为两类:

  1. 硬约束:必须满足,否则方案无效。
    • 比如:跟车距离不能小于安全阈值(如2秒规则)。
    • 比如:横向加速度不能超过物理极限(如0.4g)。
    • 比如:不能跨越实线。
  2. 软约束:尽量满足,但可以适当放宽。
    • 比如:希望车速保持在限速的90%以上。
    • 比如:希望变道时与目标车道后车的距离大于3秒。

为什么要有软约束?因为有时候,硬约束太死板会导致无解。比如前方突然有障碍物,你必须在「轻微超速」和「撞车」之间选一个。这时候,软约束就可以被「惩罚」而不是被「禁止」。

用数学表达:

// 约束条件示例
// 硬约束:必须满足
g1(x): 跟车距离 - 安全距离 ≥ 0
g2(x): 横向加速度 - 0.4g ≤ 0

// 软约束:违反时增加惩罚项
h1(x): 当前车速 - 0.9 * 限速 ≥ 0  (如果违反,在目标函数中加惩罚)

个人经验:我在做LCC(车道居中控制)时,曾经把「车道偏移量」设成了硬约束。结果在弯道曲率较大的路段,系统频繁报无解,导致方向盘抖动。后来改成软约束加惩罚项,问题就解决了。记住,硬约束越多,解空间越小,算法越容易「卡死」

2.6 小结:一个完整的决策问题长什么样?

好了,我们把所有要素串起来。一个典型的多目标优化决策问题,可以写成:

最小化:  F(x) = [f1(x), f2(x), ..., fm(x)]   // 多个目标函数
满足:    g_i(x) ≤ 0,  i = 1, 2, ..., p       // 不等式约束
         h_j(x) = 0,  j = 1, 2, ..., q       // 等式约束(ADAS中较少见)
         x ∈ X                                // 决策变量空间

其中:

  • x 是决策变量,比如期望加速度、转向角、变道时机。
  • F(x) 是目标向量,每个分量代表一个优化目标。
  • g_i(x)h_j(x) 是约束条件。

我们的目标,就是找到一组Pareto最优解,让决策者(或者上层规则)从中挑选。

嗯,这一节的内容就到这里。说实话,这些概念刚接触时可能会觉得抽象,但等你真正上手写代码、调参数、跑仿真时,就会慢慢体会到它们的妙处。下一节,我们聊聊怎么「找」到这些Pareto最优解——也就是多目标优化算法的核心思路。

一句话总结:Pareto最优解是「不偏科」的解,支配关系是「全面碾压」的比较,目标函数是「指南针」,约束条件是「护栏」。四者缺一不可。