本篇文章從經典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的特徵