強化學習基礎第一個程序(建議在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的特徵
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章