python_gym学习笔记

1,033 阅读2分钟
#Cartpole的环境文件在~你的gym目录/gym/envs/classic_control/cartpole.py.

#该文件定义了一个CartPoleEnv的环境类,该类的成员函数有:seed(), step(),reset()和render().

env = gym.make('CartPole-v0')#创建'MountainCar-v0'环境
env = env.unwrapped # 不做这个会有很多限制
env.seed(21)#可选,设置随机数,以便让过程重现 # 确保结果具有可重现性 #随机种子

for i_episode in range(50):
    observation = env.reset()
        #reset()为重新初始化函数,一次尝试结束后,智能体需要从头开始,这就需要智能体具有重新初始化的功能。函数reset()就是这个作用。
    while True:
        env.render()  #显示仿真窗口
        # render()函数在这里扮演图像引擎的角色。其实,对于强化学习算法,该函数可以没有。但是,为了便于直观显示当前环境中物体的状态,图像引擎还是有必要的。            
        observation_, reward, done, info = env.step(action)#该函数在仿真器中扮演物理引擎的角色。其输入是动作a,输出是:下一步状态,立即回报,是否终止,调试项。
        
    

policy_gradient的main代码

import gym
import matplotlib.pyplot as plt
from RL_brain import PolicyGradient

RENDER = False  # 在屏幕上显示模拟窗口会拖慢运行速度, 我们等计算机学得差不多了再显示模拟
DISPLAY_REWARD_THRESHOLD = 400  # 当 回合总 reward 大于 400 时显示模拟窗口

env = gym.make('CartPole-v0')   # CartPole 这个模拟
env = env.unwrapped     # 取消限制
env.seed(1)     # 普通的 Policy gradient 方法, 使得回合的 variance 比较大, 所以我们选了一个好点的随机种子

print(env.action_space)     # 显示可用 action
print(env.observation_space)    # 显示可用 state 的 observation
print(env.observation_space.high)   # 显示 observation 最高值
print(env.observation_space.low)    # 显示 observation 最低值
print(env.observation_space.shape[0])

# Discrete(2) #两个离散的action
# Box(4,) #obser四个值
# [4.8000002e+00 3.4028235e+38 4.1887903e-01 3.4028235e+38]
# [-4.8000002e+00 -3.4028235e+38 -4.1887903e-01 -3.4028235e+38]
# 4


# 定义
RL = PolicyGradient(
    n_actions=env.action_space.n,#actions的个数
    n_features=env.observation_space.shape[0],#features的个数
    learning_rate=0.02,
    reward_decay=0.99,   # gamma
    # output_graph=True,    # 输出 tensorboard 文件
)

for i_episode in range(3000):

    observation = env.reset()

    while True:
        if RENDER:
            env.render()#显示仿真图像

        action = RL.choose_action(observation)

        observation_,reward,done,info = env.step(action)

        RL.store_transition(observation,action,reward) # 存储这一回合的 transition


        if done: #一回合结束
            ep_rs_sum = sum(RL.ep_rs)#一个回合的总reward

            if 'running_reward' not in globals():
                running_reward = ep_rs_sum
            else:
                running_reward = running_reward*0.99 + ep_rs_sum*0.01
            if running_reward > DISPLAY_REWARD_THRESHOLD:# 判断是否显示模拟
                RENDER = True
            print('episode:',i_episode,'reward:'int(running_reward))

            vt = RL.learning# 学习, 输出 vt,

            if i_episode == 0:
                plt.plot(vt)  # plot 这个回合的 vt
                plt.xlabel('episode steps')
                plt.ylabel('normalized state-action value')
                plt.show()
            break

        observation = observation_