4、ε-约束法:基本原理、算法流程、在ACC决策中的案例
4.1 为什么需要ε-约束法?
好,咱们接着聊多目标优化。前面讲了加权法,简单粗暴,但有个硬伤——权重怎么定?
我记得有一次做ACC(自适应巡航)的决策算法,团队里吵了三天。安全工程师说“安全权重必须0.8”,舒适性工程师说“你开什么玩笑,乘客会晕车的”。最后谁也没说服谁。
加权法的问题就在这里。你很难事先知道哪个目标更重要。而且有些目标之间压根儿就不是线性关系。你想想看,把碰撞时间和加速度加权求和,这物理意义是什么?说实话,我自己都觉得牵强。
ε-约束法就是来解决这个问题的。它的思路很直接:
- 选一个你最重要的目标,作为主优化目标
- 其他目标,设定一个可接受的阈值(ε),作为约束条件
- 然后求解这个单目标优化问题
说白了,就是“保一个,限其他”。
4.2 基本原理
数学上,ε-约束法是这样定义的:
假设我们有m个目标函数 f₁(x), f₂(x), ..., fₘ(x)。我们选其中一个作为主目标,比如 f₁(x)。那么问题就变成:
min f₁(x)
s.t. f₂(x) ≤ ε₂
f₃(x) ≤ ε₃
...
fₘ(x) ≤ εₘ
x ∈ S
这里的ε₂, ε₃, ..., εₘ就是我们对其他目标设定的上限。S是原始问题的可行域。
关键点:通过调整ε的值,我们可以得到不同的Pareto最优解。ε越小,约束越紧,主目标可能越差;ε越大,约束越松,主目标可能越好。
我在项目中遇到过一个问题:ε设得太紧,结果可行域直接空了,算法报错。嗯,这个后面会讲怎么处理。
4.3 算法流程
我个人习惯用下面的流程来实现ε-约束法。你照着走,基本不会出大问题:
- 确定主目标:选一个你最关心的目标。在ACC里,我一般选安全性(比如最小碰撞时间TTC)。
- 设定ε值:对其他目标设定可接受的阈值。比如舒适性(加速度变化率)不超过2 m/s³,燃油经济性不超过某个值。
- 求解单目标问题:用你熟悉的优化算法(比如SQP、遗传算法)求解。
- 检查可行性:如果无解,说明ε太紧了,需要放松。
- 调整ε,重复:如果你想得到多个Pareto解,就改变ε值,重复步骤2-4。
我的小技巧:ε的初始值可以从每个目标的单目标最优值开始。比如先单独优化舒适性,得到最优值J_comf*,然后ε可以设为1.1×J_comf*到1.5×J_comf*之间。这样既保证可行,又能探索Pareto前沿。
4.4 在ACC决策中的案例
好,咱们来点实际的。ACC决策中,我们通常要考虑三个目标:
- 安全性:用最小碰撞时间TTC表示,越大越安全
- 舒适性:用加速度变化率jerk表示,越小越舒适
- 跟车效率:用与前车的速度差表示,越小越稳定
这里有个坑——TTC是越大越好,但我们的优化问题通常是求最小。所以我会把安全性目标取负,变成求最小化 -TTC。
假设我们选安全性作为主目标,舒适性和跟车效率作为约束:
min -TTC(a)
s.t. jerk(a) ≤ ε_jerk
|v_ego - v_target| ≤ ε_speed
a_min ≤ a ≤ a_max
jerk_min ≤ jerk ≤ jerk_max
这里的a是加速度,是我们的决策变量。
我曾经做过一个测试,ε_jerk分别取1.0、1.5、2.0 m/s³,看看结果有什么不同:
| ε_jerk (m/s³) | TTC (s) | 实际jerk (m/s³) | 速度差 (m/s) | 评价 |
|---|---|---|---|---|
| 1.0 | 2.8 | 0.95 | 0.3 | 舒适但安全余量小 |
| 1.5 | 3.5 | 1.42 | 0.2 | 平衡点 |
| 2.0 | 4.1 | 1.88 | 0.1 | 安全但舒适性差 |
你看,ε_jerk从1.0放宽到2.0,TTC从2.8秒提升到4.1秒。这就是ε-约束法的直观效果——你牺牲一点舒适性,换来更多的安全余量。
避坑指南:我曾经把ε_jerk设到0.5 m/s³,结果算法直接报错——可行域为空。为什么?因为物理上,在紧急情况下,你不可能用那么小的jerk完成避撞。所以ε的设定一定要结合物理约束,不能拍脑袋。
4.5 ε-约束法 vs 加权法
我个人的经验是:
- 加权法适合目标之间量纲一致、权重可以明确给出的场景。比如两个成本函数,都是钱。
- ε-约束法适合目标量纲不同、且有一个目标明显更重要的场景。比如ACC里安全第一,其他都是“在保证安全的前提下尽量好”。
你想想看,在ACC里,你敢说“安全权重0.6,舒适权重0.4”吗?万一某个场景下,加权后的最优解恰好让TTC只有1.5秒,你敢用吗?
但ε-约束法就不一样。你直接说“TTC必须大于3秒”,然后在这个前提下尽量优化舒适性。这个逻辑,工程师和项目经理都能接受。
4.6 小结
ε-约束法,说白了就是“抓大放小”。把最重要的目标拎出来,其他的设个底线就行。这个方法在ADAS决策中特别实用,因为安全永远是底线。
下一章我会讲NSGA-II,那是另一种思路——直接找出一堆Pareto解,让你自己选。到时候咱们再对比一下两种方法的优劣。
一句话总结:ε-约束法不是让你在所有目标之间找平衡,而是让你在保证底线的前提下,把最重要的目标做到极致。