首页
/ NeuromatchAcademy课程内容解析:离散状态最优控制基础

NeuromatchAcademy课程内容解析:离散状态最优控制基础

2025-07-10 08:00:01作者:段琳惟

概述

本教程将介绍离散状态空间下的最优控制问题,重点探讨部分可观测马尔可夫决策过程(POMDP)在二元控制任务中的应用。我们将通过一个钓鱼场景的案例,展示如何构建信念状态、评估控制策略并寻找最优策略。

核心概念

1. 部分可观测马尔可夫决策过程(POMDP)

POMDP是马尔可夫决策过程(MDP)的扩展,适用于系统状态不能直接观测但可以通过间接观测推断的场景。它包含以下要素:

  • 状态空间:系统的真实状态(如鱼群位置)
  • 观测空间:可获得的测量值(如是否钓到鱼)
  • 动作空间:可执行的操作(如切换钓鱼位置)
  • 转移概率:状态随时间演变的规律
  • 观测概率:给定状态下获得特定观测的概率
  • 奖励函数:评估动作好坏的标准

2. 信念状态(Belief State)

由于系统状态不可直接观测,我们需要维护一个信念状态——基于历史观测对当前状态的置信度分布。在二元状态系统中,这简化为对某一状态的概率估计。

钓鱼问题建模

系统参数

我们定义以下参数来描述钓鱼场景:

params = (p_stay, p_low_rwd, p_high_rwd, cost_sw)
  • p_stay: 鱼群保持在当前位置的概率
  • p_low_rwd: 在错误位置钓到鱼的低概率
  • p_high_rwd: 在正确位置钓到鱼的高概率
  • cost_sw: 切换钓鱼位置的代价

状态动态

鱼群位置遵循电报过程(telegraph process),即在两个状态间随机切换:

def fish_dynamics(self):
    fish_state = np.zeros(self.T, int)
    fish_state[0] = self.fish_initial
    tele_operations = binomial_tele(p_stay, self.T)
    
    for t in range(1, self.T):
        fish_state[t] = int(not(fish_state[t-1] ^ tele_operations[t]))
    return fish_state

观测模型

钓到鱼的概率取决于当前鱼群位置与钓鱼位置是否一致:

if fish_state[t] != self.loc_initial:
    rwd[t] = 1 if p_low_rwd > rnd_low_rwd[t] else 0
else:
    rwd[t] = 1 if p_high_rwd > rnd_high_rwd[t] else 0

信念更新

信念状态根据贝叶斯规则更新。对于二元状态,我们只需跟踪鱼群在右侧的概率:

def update_belief(self, belief_prev, loc_prev, meas):
    p_stay, p_low_rwd, p_high_rwd, _ = self.params
    
    # 预测步骤
    belief_predict = p_stay * belief_prev + (1 - p_stay) * (1 - belief_prev)
    
    # 更新步骤
    if meas == 1:  # 钓到鱼
        likelihood = p_high_rwd if loc_prev == 1 else p_low_rwd
    else:  # 没钓到鱼
        likelihood = (1 - p_high_rwd) if loc_prev == 1 else (1 - p_low_rwd)
    
    belief = belief_predict * likelihood
    belief /= (belief_predict * likelihood + (1 - belief_predict) * (1 - likelihood))
    
    return belief

策略评估

阈值策略

一种直观的策略是当信念超过某个阈值时切换位置:

def threshold_policy(belief, threshold):
    if belief > threshold:
        return 1  # 切换到右侧
    elif belief < 1 - threshold:
        return 0  # 切换到左侧
    else:
        return None  # 保持原位

价值函数

评估策略好坏的标准是长期累积奖励:

def evaluate_policy(params, T, policy_func):
    total_reward = 0
    switch_cost = params[3]
    num_switches = 0
    
    # 初始化状态和信念
    fish_state, loc, meas = binaryHMM(params, T).generate_process_lazy()
    belief = 0.5  # 初始无信息先验
    
    for t in range(1, T):
        # 执行策略决定动作
        action = policy_func(belief)
        
        # 更新位置和计算切换代价
        if action is not None:
            loc[t] = action
            if loc[t] != loc[t-1]:
                num_switches += 1
                total_reward -= switch_cost
        
        # 计算即时奖励
        if fish_state[t] == loc[t]:
            total_reward += 1
        
        # 信念更新
        belief = update_belief(belief, loc[t-1], meas[t])
    
    return total_reward / T  # 平均每步奖励

可视化工具

教程提供了多种可视化函数来帮助理解系统动态:

  1. plot_fish(): 显示鱼群位置随时间变化
  2. plot_measurement(): 显示观测结果(是否钓到鱼)
  3. plot_act_loc(): 显示智能体的位置和切换动作
  4. plot_belief(): 显示信念状态演化
  5. plot_dynamics(): 综合显示上述所有信息

最优策略寻找

通过网格搜索可以找到使价值函数最大化的最优阈值:

thresholds = np.linspace(0.5, 0.95, 20)
values = []

for th in thresholds:
    def policy(b): return threshold_policy(b, th)
    values.append(evaluate_policy(params, 1000, policy))

optimal_threshold = thresholds[np.argmax(values)]

总结

本教程通过钓鱼的案例展示了:

  1. 如何为部分可观测系统建立POMDP模型
  2. 贝叶斯信念更新的实现方法
  3. 阈值策略的设计与评估
  4. 最优控制策略的寻找过程

这些技术可以推广到各种二元决策问题,如医疗诊断、金融交易等需要在不完全信息下做出最优决策的场景。