Unity ML-Agents旧版DQN代码适配新版本及环境状态逻辑疑问
ML-Agents新旧版本API适配与状态获取逻辑说明
旧版API适配当前版本(2.0及以上)的代码
1. 每轮episode重置与初始状态获取
# 重置Unity环境,训练时设置train_mode=True可关闭渲染提升运行速度 env.reset(train_mode=True) # 获取指定行为的步骤数据,behavior_name与Unity侧Behavior Parameters组件的配置值一致 decision_steps, terminal_steps = env.get_steps(behavior_name) # 单智能体场景下取第一个智能体的初始状态 state = decision_steps.obs[0][0]
2. 传入动作与环境反馈获取
# 为指定智能体设置动作,单智能体场景直接取decision_steps的第一个agent_id即可 env.set_action_for_agent(behavior_name, decision_steps.agent_id[0], action) # 执行一步环境模拟 env.step() # 重新获取步骤数据 decision_steps, terminal_steps = env.get_steps(behavior_name) # 解析返回结果 if len(terminal_steps) > 0: # 智能体本轮episode结束,从终止步取数据 next_state = terminal_steps.obs[0][0] reward = terminal_steps.reward[0] done = True else: # 智能体需要继续决策,从决策步取数据 next_state = decision_steps.obs[0][0] reward = decision_steps.reward[0] done = False
旧版代码返回内容对应state的原因
旧版API中的vector_observations对应的是Unity侧为智能体配置的向量观测值,本质是将智能体感知到的自身属性(比如位置、速度)、环境相关属性(比如目标位置、障碍物距离)拼接成的一维向量,完全符合强化学习定义中环境状态(state)的作用:作为智能体决策的输入依据,所以旧代码取vector_observations[0]就是单智能体场景下的state。
你编写的新版状态获取代码说明
你写的代码逻辑是正确的,各部分含义如下:
decision_steps, terminal_steps = env.get_steps(behavior_name):当前版本ML-Agents将智能体的步骤数据拆为两类:decision_steps存储所有当前需要输出动作进行决策的智能体的观测、奖励、ID等数据terminal_steps存储所有当前episode已经结束的智能体的相关数据
state = decision_steps.obs[index][0,:]:obs是观测数组的列表,每个元素对应一个你在Unity侧配置的观测源,仅配置向量观测时index填0即可,同时配置视觉、向量观测时按配置顺序选择对应索引[0,:]表示取列表中第一个智能体的全部观测维度值,单智能体场景固定使用该写法,多智能体场景将0替换为对应智能体的索引即可
内容的提问来源于stack exchange,提问作者LeeJaeWon
相关产品推荐
相关产品推荐

