本篇文章从经典CartPole控制出发,由浅入深,介绍强化学习入门程序。(未待完续,空闲更新)
0、第0个程序是安装gym和物理引擎 MuJoco后的测试程序(CartPole随机动作 10行)
1、第一个程序CartPole学习“最小系统” (CartPole简单策略 20行)
2、第二个程序DQN学习CartPole (RL_brain.py 未提供)
以上,吃透CartPole,举一反三,推开强化学习大门
(程序如下,建议直接copy跑,逐句理解,自己写一遍)
0、程序零
import gym
import time # time模块用于调整单步时间
env=gym.make('CartPole-v0') # 导入gym提供的虚拟环境
env.reset() # 环境初始化
for t in range(200): # 共运行200步
env.render() # 渲染图像
env.step(env.action_space.sample()) # 使用随机动作代理产生动作并执行
time.sleep(0.01) # 每步等待0.01s
env.close()
1、程序一
import gym
import numpy as np # 一个用于数组矩阵计算的外部类库,有点像matlab
import time
env = gym.make('CartPole-v0')
for i in range(5):
score = 0
policy = np.random.rand(1, 4) # 用随机数产生策略
observation=env.reset()
for t in range(200):
env.render()
action = 1 if np.dot(policy, observation) > 0 else 0 # 策略数组点乘状态数组,据结果选择动作
observation,reward,done,info=env.step(action)
score += reward # 记录奖励
time.sleep(0.01)
print('Random Policy', policy)
print('Policy Score', score)
env.close()
2、程序二
import gym
from RL_brain import DeepQNetwork
env = gym.make('CartPole-v0') # 定义使用gym库中的哪一个环境
env = env.unwrapped # 还原env的原始设置,env外包了一层防作弊层
RL = DeepQNetwork(n_actions=env.action_space.n,
n_features=env.observation_space.shape[0],
learning_rate=0.01, e_greedy=0.9,
replace_target_iter=100, memory_size=2000,
e_greedy_increment=0.001,)
total_steps = 0
for i_episode in range(100):
observation = env.reset()
score = 0
while True:
env.render()
action = RL.choose_action(observation)
observation_, reward, done, info = env.step(action)
x, x_dot, theta, theta_dot = observation_
r1 = (env.x_threshold - abs(x))/env.x_threshold - 0.8
r2 = (env.theta_threshold_radians - abs(theta))/env.theta_threshold_radians - 0.5
reward = r1 + r2 # reward是车水平位移和杆倾斜角度的结合,既考虑位置也考虑角度,这样DQN学习更有效率
RL.store_transition(observation, action, reward, observation_)
score += reward
if total_steps > 1000:
RL.learn()
if done:
print('episode: ', i_episode, 'score: ', round(score, 2))
break
observation = observation_
total_steps += 1
RL.plot_cost()
一些重要指令记录:
env.action_space.sample() 随机动作代理
env.action_space 查看这个环境中可用的action有多少个
env.observation_space 查看这个环境中observation的特征