强化学习基础第一个程序(建议在DQN跑CartPole之前)

本篇文章从经典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的特征
 

发布了31 篇原创文章 · 获赞 2 · 访问量 707

猜你喜欢

转载自blog.csdn.net/qq446293528/article/details/103156808