使用随机智能体测试MountainCar-v0出现100%成功率异常求助
问题根源与修正方案
你的问题出在终止条件的错误处理上,导致循环没有步数限制,会一直运行直到随机动作碰巧让小车到达目标,所以才会出现“100%成功率”的反常结果。
具体问题分析
MountainCar-v0环境的episode终止有两个条件:
terminated=True:小车位置≥0.5(达到目标)truncated=True:步数达到200(默认步数上限)
你代码里的解构语句是:
next_state, reward, done, trun, info = env.step(action)
这里的done实际对应环境返回的terminated,而trun对应truncated。你的循环条件是while not done,意味着只有当小车到达目标时才会停止循环,完全忽略了200步的步数限制。程序会一直随机选动作,直到某天碰巧凑出能让小车爬上坡的动作序列,最终必然会输出超过0.5的位置,但这根本不是随机智能体在标准200步限制下的真实表现。
修正后的测试代码
要模拟标准评估场景,需要将terminated和truncated合并为done,让循环在达到目标或步数到200时都停止:
import gymnasium as gym # 新版Gymnasium用这个,旧版用import gym env = gym.make('MountainCar-v0', render_mode='rgb_array') state, _ = env.reset() max_position = -99 done = False step_count = 0 while not done: action = env.action_space.sample() # 正确解构step返回值 next_state, reward, terminated, truncated, info = env.step(action) # 合并终止与截断条件 done = terminated or truncated if next_state[0] > max_position: max_position = next_state[0] step_count += 1 print(f"最终位置: {next_state[0]}, 最大位置: {max_position}, 步数: {step_count}") env.close()
修正后的预期结果
运行修正后的代码,你会发现绝大多数情况下,小车的最大位置都远低于0.5,步数会达到200,这才是随机智能体的正常表现——在200步内,随机动作几乎不可能让小车积累足够动量爬上坡到达0.5的位置。
内容的提问来源于stack exchange,提问作者Ehtisham
相关产品推荐
相关产品推荐

