2. 决策算法基础

各位同学,今天我们来聊聊决策算法的地基——MDP和POMDP。说实话,这两个概念刚接触时容易觉得抽象,但它们在自动驾驶里无处不在。我个人习惯把MDP比作「有地图的导航」,而POMDP则是「雾天开车」。嗯,咱们一个一个说。

一、马尔可夫决策过程(MDP)—— 清晰世界下的最优决策

MDP的核心思想其实很简单:当前状态包含了做决策所需的全部历史信息。这就是所谓的「马尔可夫性」。你想想看,在自动驾驶中,如果传感器能完美感知周围环境,那决策就只取决于当前这一刻的状态,跟三秒前车在哪儿没关系。

MDP的五元组定义:

  • S(状态空间):车辆位置、速度、车道、周围障碍物等
  • A(动作空间):加速、减速、转向、换道、停车等
  • P(状态转移概率):P(s' | s, a),执行动作后到达新状态的概率
  • R(奖励函数):R(s, a),每个动作带来的即时奖励
  • γ(折扣因子):0到1之间,平衡短期和长期收益

我在项目中遇到过这样一个场景:高速巡航时,MDP模型会考虑「当前车速」「前车距离」「目标车道是否空闲」这几个状态。动作就是「保持」「加速」「减速」「换道」。奖励函数怎么设计?安全第一,碰撞给-100分;舒适第二,急加速给-1分;效率第三,到达目标给+10分。

说白了,MDP就是在已知全部信息的情况下,找一个策略π(s) → a,让累积奖励最大化。

MDP的求解:值迭代与策略迭代

求解MDP有两种经典方法。我刚开始做决策算法时,总纠结该用哪个。后来发现——看问题规模。

方法 核心思想 适用场景
值迭代 不断更新状态价值函数 V(s),直到收敛 状态空间较小,需要精确解
策略迭代 先评估当前策略,再改进策略,交替进行 状态空间大,收敛更快
# 值迭代的伪代码,我习惯这么写
def value_iteration(S, A, P, R, gamma, theta):
    V = {s: 0 for s in S}  # 初始化价值函数
    while True:
        delta = 0
        for s in S:
            v = V[s]
            # 贝尔曼最优方程
            V[s] = max(sum(P[s'][s, a] * (R[s, a] + gamma * V[s']) for s' in S) for a in A)
            delta = max(delta, abs(v - V[s]))
        if delta < theta:
            break
    # 提取最优策略
    policy = {s: argmax(...) for s in S}
    return policy

我的小技巧:实际工程中,别把状态空间搞太大。我曾经把车道、速度、距离都离散化,结果状态数爆炸了。后来学乖了——用函数逼近,或者只保留最关键的状态维度。

二、部分可观测马尔可夫决策过程(POMDP)—— 雾天开车怎么办?

现实世界哪有那么完美?传感器有噪声,遮挡物存在,其他车辆意图不明。这时候MDP就不够用了。POMDP就是MDP的升级版——你只能看到部分真相。

POMDP在MDP基础上加了两个东西:

  • 观测空间 Ω:传感器能测量到的信号,比如雷达点云、摄像头图像
  • 观测概率 O:O(o | s', a),在状态s'下执行动作a后,得到观测o的概率

为什么会这样?因为自动驾驶中,你永远无法100%确定其他车辆下一秒要干什么。比如前车打了左转向灯,它是要变道?还是只是灯没关?你只能通过观测来「猜」。

POMDP的核心思想是维护一个信念状态 b(s)——对当前真实状态的概率分布。每次执行动作、获得观测后,用贝叶斯公式更新信念。

信念更新公式(我记了三年才记住):

b'(s') = η · O(o | s', a) · Σ P(s' | s, a) · b(s)

其中 η 是归一化因子,保证概率和为1。

POMDP求解的难点

说实话,POMDP精确求解是NP-hard问题。状态空间本来就大,再加上信念空间是连续的,维度灾难非常严重。我在实际项目中,从来没用过精确求解——都是近似方法。

方法 思路 我踩过的坑
Q-MDP 假设当前信念下,未来观测会消除不确定性 太乐观了,低估了不确定性带来的风险
点基值迭代(PBVI) 只在有限个信念点上求解 选点策略不好时,性能很差
蒙特卡洛树搜索(POMCP) 用随机采样近似信念和未来回报 计算量大,但效果最好

避坑指南:我曾经在一个项目中,直接用MDP替代POMDP,结果在遮挡路口频繁出错。后来换成POMCP,虽然每帧计算多了20ms,但决策质量提升了一个档次。记住——不确定性不可忽略时,别偷懒用MDP。

三、MDP vs POMDP:什么时候用哪个?

这个问题我经常被问到。我的回答是:看你的传感器有多「自信」。

  • 用MDP的场景:高速公路巡航、车道保持、有高精地图且定位精准时。说白了,你能看到全局,不确定性很小。
  • 用POMDP的场景:十字路口、遮挡区域、行人意图预测、传感器故障时。说白了,你「看不见」或「看不清」的时候。

我个人习惯是:先尝试MDP,如果发现决策在不确定性场景下频繁出错,再升级到POMDP。毕竟POMDP的计算开销摆在那儿,没必要杀鸡用牛刀。

四、知识体系总览

下面这张图是我自己画的,把MDP和POMDP的关系、求解方法、应用场景串起来了。你看完应该能有个整体印象。

决策算法基础:MDP与POMDP知识体系 马尔可夫决策过程 (MDP) 五元组: (S, A, P, R, γ) 核心: 状态完全可观测 求解: 值迭代 / 策略迭代 适用: 高速公路巡航、车道保持 特点: 计算快、精度高 部分可观测MDP (POMDP) 七元组: (S, A, P, R, Ω, O, γ) 核心: 维护信念状态 b(s) 求解: Q-MDP / PBVI / POMCP 适用: 十字路口、遮挡、意图预测 特点: 计算慢、鲁棒性强 升级 共同基础 马尔可夫性 · 贝尔曼方程 · 折扣累积奖励 · 策略搜索 工程实践建议 先尝试MDP → 不确定性高时升级POMDP → 用近似方法求解 状态空间不要太大 · 奖励函数要平衡安全/舒适/效率 · 实时性优先 决策算法与轨迹规划协同设计 · 第2章

嗯,这张图把MDP和POMDP的关系讲清楚了。左边是「看得清」的MDP,右边是「看不清」的POMDP,下面是工程实践建议。你保存下来,以后做决策算法设计时可以参考。

我的经验之谈:别试图一次性搞懂POMDP的所有数学细节。先理解MDP,再在具体场景中体会「为什么需要POMDP」。我当年就是先跑通了MDP的代码,然后遇到遮挡问题,才回头啃POMDP的——这样学起来快得多。

好了,这一章就到这里。MDP和POMDP是决策算法的基石,后面讲轨迹规划时,你会发现很多思想都是从这儿来的。记住:能MDP就MDP,不能MDP再POMDP——这是工程中的实用哲学。