LoginSignup
0
1

More than 5 years have passed since last update.

強化学習のお試し備忘録①

Last updated at Posted at 2018-12-24

はじめに

この記事は自分の強化学習の備忘録です。

環境構築

基本環境

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一番下
→断念

その他参考ページ等

このページの大部分の参考:OpenAI Gym 入門
gym 公式
強化学習のお試し備忘録②(準備中)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1