面向赛车策略开发的强化学习Observation Space建模问题咨询
赛车策略RL场景观测空间(Observation Space)设计指南
核心设计原则
POMDP场景下观测空间的核心设计逻辑是尽可能覆盖所有对决策有直接影响的可观测变量,减少隐状态带来的决策偏差,仅保留比赛位置特征完全无法支撑进站、加油相关决策,需要补充多维度相关特征。
场景专属观测特征列表
- 自身状态类
- 当前剩余油量可支撑的行驶圈数:直接决定进站的紧急程度,是最核心的决策参考特征
- 当前单圈平均耗时:可和进站固定耗时做对比,判断进站带来的时间损失是否符合收益预期
- 自身当前排名
- 已完成圈数/总赛事圈数:用于判断剩余赛程,避免最后几圈做无意义的进站操作
- 对手相关可观测状态
- 前后相邻2名对手的排名对应时间差:判断进站后可能产生的排名波动范围
- 近5圈范围内已完成进站的对手占比:判断当前是否为进站窗口,规避扎堆进站带来的额外时间损失
- 随机事件类
- 当前赛道事件状态:安全车、黄旗等场景下进站时间损失会大幅降低,是最优进站时机的核心判断依据
OpenAI Gym 实现示例
观测空间统一使用gym.spaces.Box类型,所有特征归一化到[0,1]区间可大幅提升训练收敛效率,示例代码如下:
import gym from gym import spaces import numpy as np class RacingStrategyEnv(gym.Env): def __init__(self, total_laps=50, total_racers=20): super().__init__() # 动作空间定义和你的需求对齐 self.action_space = spaces.Discrete(4) # 9维观测空间,全部特征归一化到[0,1]区间 self.observation_space = spaces.Box(low=0, high=1, shape=(9,), dtype=np.float32) self.total_laps = total_laps self.total_racers = total_racers def _get_observation(self): # 下方逻辑替换为你的模拟环境实际取值逻辑即可 obs = np.array([ self.remian_fuel_laps / 10, # 假设赛车最多可携带10圈油量 self.current_laptime / 90, # 假设赛道历史最快单圈为90秒 self.my_rank / self.total_racers, self.completed_laps / self.total_laps, min(self.time_gap_to_front, 30) / 30, # 最大统计30秒的前车差距,超出按30秒计算 min(self.time_gap_to_behind, 30) / 30, # 最大统计30秒的后车差距,超出按30秒计算 self.recent_5laps_pit_ratio, # 近5圈进站对手占比,本身就是0-1区间值 1 if self.safety_car_active else 0, # 安全车状态为二元特征 (self.total_laps - self.completed_laps) / self.total_laps # 剩余赛程占比 ], dtype=np.float32) return obs
优化建议
- 如果策略收敛效果不佳,可以通过对照实验逐一验证特征重要性,剔除对决策无影响的冗余特征,降低训练难度
- 针对对手剩余油量等不可观测的隐状态,可以在观测中补充近3圈所有对手的进站历史特征,或者替换DQN为DRQN等带时序记忆能力的网络结构,弥补隐信息缺失带来的决策偏差
内容的提问来源于stack exchange,提问作者Eric Random
相关产品推荐
相关产品推荐

