#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_