You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CartPole-v1执行右移动作却左移的问题咨询及解决方法

CartPole-v1动作与预期不符的原因及解决方法

问题描述

在使用OpenAI Gym的CartPole-v1环境时,设置初始状态后执行动作出现不符合预期的情况:

  • 初始状态:s = [0.048, 0.151, -0.037, -0.265](对应小车位置、小车速度、杆角度、杆角速度)
  • 执行文档定义为“向右移动”的动作1后,新状态为[-0.016, 0.206, -0.029, -0.326],小车位置反而向左移动,不符合预期。
  • 测试代码:
env.reset()
state=[0.048, 0.151, -0.037, -0.265]
env.state = env.unwrapped.state = state
s, reward, done, _ = env.step(action)
print(state,s)

原因分析

  1. 状态赋值方式不规范
    Gym环境的state属性并非设计为公开可直接修改的接口,直接给env.state和env.unwrapped.state赋值可能导致环境内部状态未完全同步,比如部分物理参数未正确初始化,进而影响动作执行后的状态计算。此外,若状态未以numpy数组格式传入,可能触发环境内部的类型转换错误,导致状态更新异常。

  2. 杆与小车的耦合物理作用
    CartPole是典型的耦合动力学系统,小车的运动不仅受动作施加的力影响,还会受到杆摆动产生的反向作用力。初始状态中,杆角度为-0.037弧度(向左倾斜)、杆角速度为-0.265(向左摆动),此时杆的重力会对小车产生向左的作用力。如果该反向力的大小超过动作1施加的向右推力,小车就会出现向左移动的现象。

解决方法

  1. 规范状态设置流程
    使用环境未封装版本(unwrapped)的合法接口设置状态,确保状态格式为numpy数组:
import numpy as np
import gym

env = gym.make('CartPole-v1')
env.reset()
# 正确设置状态为numpy数组
target_state = np.array([0.048, 0.151, -0.037, -0.265])
env.unwrapped.state = target_state

# 若环境支持set_state方法,可更规范地设置:
# env.unwrapped.set_state(target_state[:2], target_state[2:])

s, reward, done, _ = env.step(1)
print(target_state, s)
  1. 验证动作基础逻辑
    通过静止初始状态验证动作方向是否正确:设置初始状态为[0.0, 0.0, 0.0, 0.0](小车静止、杆竖直),执行动作1后,若小车位置变为正值、速度为正,则说明动作方向的定义是正确的,之前的异常是耦合物理作用导致的。

  2. 结合物理模型分析状态变化
    根据CartPole的动力学公式计算预期状态,对比实际输出:
    小车位置更新公式:x_new = x_old + v_x * dt
    小车速度更新公式:v_x_new = v_x_old + (F + m_p * l * θ_dot² * sinθ - m_p * g * cosθ * sinθ) / (m_c + m_p) * dt
    其中F是动作施加的力(动作1对应向右的正力),m_c为小车质量,m_p为杆质量,l为杆半长,g为重力加速度,dt为时间步长。通过手动计算可判断状态变化是否符合物理规律。

内容的提问来源于stack exchange,提问作者Möbius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 10:18:40