はじめに
この記事は自分の強化学習の備忘録です。
環境構築
基本環境
Mac OS X 10.13.6 High sierra
Anaconda 3-5.1.0
python 3.6
PyCharm 2018.1.4 Community edition
構築手順
最初に以下でトライした(全ての環境で使う用)
brew install cmake boost boost-python sdl2 swig wget
pip install 'gym[all]'
→MuJoCoのinstallに失敗
MuJoCo:3次元のシミュレーション環境で、有料
使いたいなら30日間のお試しライセンスを使うと良いらしい:
Open AI Gym & MuJoCo を使う
結局以下の限定環境を使うことに
pip install gym
→成功
依存ライブラリのインストール
brew install cmake boost boost-python sdl2 swig wget
Atari社のGameを動かすライブラリをインストール
pip install 'gym[atari]'
実装
実装に関しては完全にこちらを参照(というかほぼコピー)させていただいたため、解説は上記のリンクを参照してみてください。
test.py
import gym
import numpy as np
def get_status(_observation):
env_low = env.observation_space.low # 位置と速度の最小値
env_high = env.observation_space.high # 位置と速度の最大値
env_dx = (env_high - env_low) / 40 # 40等分
# 0〜39の離散値に変換する
position = int((_observation[0] - env_low[0]) / env_dx[0])
velocity = int((_observation[1] - env_low[1]) / env_dx[1])
return position, velocity
def update_q_table(_q_table, _action, _observation, _next_observation, _reward, _episode):
alpha = 0.2 # 学習率
gamma = 0.99 # 時間割引き率
# 行動後の状態で得られる最大行動価値 Q(s',a')
next_position, next_velocity = get_status(_next_observation)
next_max_q_value = max(_q_table[next_position][next_velocity])
# 行動前の状態の行動価値 Q(s,a)
position, velocity = get_status(_observation)
q_value = _q_table[position][velocity][_action]
# 行動価値関数の更新
_q_table[position][velocity][_action] = q_value + alpha * (_reward + gamma * next_max_q_value - q_value)
return _q_table
def get_action(_env, _q_table, _observation, _episode):
epsilon = 0.002
if np.random.uniform(0, 1) > epsilon:
position, velocity = get_status(observation)
_action = np.argmax(_q_table[position][velocity])
else:
_action = np.random.choice([0, 1, 2])
return _action
if __name__ == '__main__':
env = gym.make('MountainCar-v0')
# env = wrappers.Monitor(env, '/tmp/video', video_callable=(lambda ep: ep % 100 == 0), force=True)
# Qテーブルの初期化
q_table = np.zeros((40, 40, 3))
# 10000エピソードで学習する
for episode in range(10000):
total_reward = 0
observation = env.reset()
for _ in range(200):
if(episode%100 == 0):
env.render() # 描画
# ε-グリーディ法で行動を選択
action = get_action(env, q_table, observation, episode)
# 車を動かし、観測結果・報酬・ゲーム終了FLG・詳細情報を取得
next_observation, reward, done, _ = env.step(action)
# Qテーブルの更新
q_table = update_q_table(q_table, action, observation, next_observation, reward, episode)
total_reward += reward
observation = next_observation
if done:
# doneがTrueになったら1エピソード終了
if episode%100 == 0:
print('episode: {}, total_reward: {}'.format(episode, total_reward))
#rewards.append(total_reward)
break
env.close()
その他メモ
結果の録画
メインの部分の
test.py
# env = wrappers.Monitor(env, '/tmp/video', video_callable=(lambda ep: ep % 100 == 0), force=True)
のコメントを外すと録画できるらしいが、自分はエラー
こちら参照
また、
conda install -c conda-forge ffmpeg
でできるようになると書かれているが無理だった。。。
このリンクのREADME一番下
→断念