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 # 平均每步奖励
可视化工具
教程提供了多种可视化函数来帮助理解系统动态:
plot_fish()
: 显示鱼群位置随时间变化plot_measurement()
: 显示观测结果(是否钓到鱼)plot_act_loc()
: 显示智能体的位置和切换动作plot_belief()
: 显示信念状态演化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)]
总结
本教程通过钓鱼的案例展示了:
- 如何为部分可观测系统建立POMDP模型
- 贝叶斯信念更新的实现方法
- 阈值策略的设计与评估
- 最优控制策略的寻找过程
这些技术可以推广到各种二元决策问题,如医疗诊断、金融交易等需要在不完全信息下做出最优决策的场景。