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


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





#環境構築




###基本環境

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 を使う](http://blog.syundo.org/post/20180204-open-ai-gym/)


結局以下の限定環境を使うことに

```
pip install gym
```

→成功
依存ライブラリのインストール

```
brew install cmake boost boost-python sdl2 swig wget
```

Atari社のGameを動かすライブラリをインストール


```
pip install 'gym[atari]'
```







#実装


実装に関しては完全に[こちら](https://qiita.com/ishizakiiii/items/75bc2176a1e0b65bdd16)を参照（というかほぼコピー）させていただいたため、解説は上記のリンクを参照してみてください。






```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になったら１エピソード終了
                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)
```


のコメントを外すと録画できるらしいが、自分はエラー
[こちら参照](https://discuss.openai.com/t/how-to-capture-video-feed-from-a-universe-game/954/2)


また、

```
conda install -c conda-forge ffmpeg
```

でできるようになると書かれているが無理だった。。。
[このリンクのREADME一番下](https://github.com/duckietown/gym-duckietown/blob/master/README.md)
→断念




###その他参考ページ等
[このページの大部分の参考:OpenAI Gym 入門](https://qiita.com/ishizakiiii/items/75bc2176a1e0b65bdd16)
[gym 公式](https://gym.openai.com/envs/#classic_control)
[強化学習のお試し備忘録②(準備中)]()