<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 OpenAI Gym 入門
OpenAI Gym 公式ホームページ
OpenAI Gym 公式ドキュメント　← このノートブックはこの公式ドキュメントの日本語訳＋α
OpenAI Gym GitHub
OpenAI Gym で提供されている全環境
OpenAI Gym 公開についての公式ブログ 2016/04/27
OpenAI Universe
OpenAI Gymとは？
OpenAI Gymは強化学習アルゴリズムを作ったり、比較したりするためのツール
エージェントはどんな構造でも良い
TensorFlowやTheanoで書いてもオッケー
今はPythonのみだが、将来的には他の言語もサポートする予定
OpenAI Gymは２つの部分から成る
gym というオープンソースライブラリ。強化学習における「環境」を提供する
OpenAI Gym とういウェブサービス。APIを使い、自分の作ったエージェントの良さを他のユーザーと比較できる
環境とのインタラクション
Step 1
Step1:  Step 2
Step2:  Step 3
Step3:  観測
ランダムな行動より上手くやりたければ、それぞれの行動が環境にどんな影響を与えるのか知りたいところ。
行動が環境にどんな影響を与えたのかは、環境のstep関数が教えてくれる。
step関数は4つの値を返す
observation (object) 観測
reward  (float) 報酬
done (boolean) エピソードの終了フラグ（Trueになった時がreset()を呼ぶタイミング）
info (dict) サブ情報
done==Trueとなったときにエピソードを終了するのであれば、以下のようなコードになる。
Step4:  空間
可能な行動や観測は Spaceオブジェクトで記述されている。
Step5:  Descrete
Step6:  Box
Step7:  スペースからサンプリングすることも、ある値がスペースに含まれているか調べることもできる。
Step8:  環境
gymの主な役割は、強化学習で使える多様な環境を提供すること。
OpenAI Gymが提供する環境　https
Step9:  自分で環境を作ることも可能
作った環境はロードするときにこのようにregistryに登録したら良い。
シミュレーション結果の記録とアップロード
ある環境でのパフォーマンスを計測し、同時にビデオに記録するには、環境（env）をMonitorでラッピングすれば良い。
<ASSISTANT_TASK:>
Python Code:
# gym オープンソースライブラリの読み込み
import gym
# 環境を作る
env = gym.make('CartPole-v0')    # 'CartPole-v0' は環境ID
#env = gym.make('MountainCar-v0')    # 'MountainCar-v0'という別の環境
#env = gym.make('MsPacman-v0')    # 'MsPacman-v0'という別の環境
env.seed(42)
# 環境の初期化（最初の観測が得られる）
env.reset()
# 描画
env.render()
# 行動選択（手動）
action = 0   # 0: Left, 1: Right
# 環境に対して選択された行動を実行
# printで囲む
env.step(action)
# 描画
env.render()
# 画面を閉じる
env.render(close=True) 
Explanation: OpenAI Gym 入門
OpenAI Gym 公式ホームページ
OpenAI Gym 公式ドキュメント　← このノートブックはこの公式ドキュメントの日本語訳＋α
OpenAI Gym GitHub
OpenAI Gym で提供されている全環境
OpenAI Gym 公開についての公式ブログ 2016/04/27
OpenAI Universe
OpenAI Gymとは？
OpenAI Gymは強化学習アルゴリズムを作ったり、比較したりするためのツール
エージェントはどんな構造でも良い
TensorFlowやTheanoで書いてもオッケー
今はPythonのみだが、将来的には他の言語もサポートする予定
OpenAI Gymは２つの部分から成る
gym というオープンソースライブラリ。強化学習における「環境」を提供する
OpenAI Gym とういウェブサービス。APIを使い、自分の作ったエージェントの良さを他のユーザーと比較できる
環境とのインタラクション
Step 1: 手動で行動選択（version 1）
'CartPole-v0' という環境に対して、手動で選んだ行動を入れてみる。
End of explanation
import time
# gym オープンソースライブラリの読み込み
import gym
# 環境を作る
env = gym.make('CartPole-v0')    # 'CartPole-v0' は環境ID
#env = gym.make('MountainCar-v0')    # 'MountainCar-v0'という別の環境
#env = gym.make('MsPacman-v0')    # 'MsPacman-v0'という別の環境
# ランダムな行動選択
env.action_space.sample()
# 行動空間（エージェントが選択可能な行動が定義されている空間）
env.action_space
# 環境の初期化（最初の観測が得られる）
env.reset()
for _ in range(100):
    time.sleep(0.1)    # 描画を遅くするために0.1秒スリープ
    env.render()    # 描画
    action = env.action_space.sample()    # ランダムな行動選択
    print(action), # 選択された行動をプリント
    print(env.step(action))    # 選択行動を実行
env.render(close=True) # 画面を閉じる
Explanation: Step 2: ランダムな行動選択（ランダム方策）
'CartPole-v0' という環境に対して、ランダムな行動を取ってみる（1000ステップ）。
End of explanation
#!python keyboard_agent.py CartPole-v1
#!python keyboard_agent.py LunarLander-v2
#!python keyboard_agent.py MountainCar-v0
#!python keyboard_agent.py SpaceInvaders-v0
#!python keyboard_agent.py Breakout-v0
#!python keyboard_agent.py Acrobot-v1
Explanation: Step 3: 手動で行動選択（version 2）
https://github.com/openai/gym/blob/master/examples/agents/keyboard_agent.py
注： line36: env.render()の前にenv.reset()を入れると、ほとんどの環境で使用可能。
End of explanation
import numpy as np
np.set_printoptions(suppress=True)    # Scientific Notation (例 1.0e-0.5)を使わない
all_obs = []
import gym
env = gym.make('CartPole-v0')
for i_episode in range(5):    # 5エピソード回す
    observation = env.reset()    # 環境を初期化し、最初の観測を得る。
    all_obs.append(observation)    # 観測を記録
    for t in range(100):    # 各エピソードの最大ステップ数は100
        env.render()
        print(observation)
        action = env.action_space.sample()    # ランダム方策
        observation, reward, done, info = env.step(action)    # 選択行動の実行
        all_obs.append(observation)    # 観測を記録        
        if done:
            print("Episode finished after {} timesteps\n".format(t+1))
            break
env.render(close=True)
%matplotlib inline
import matplotlib.pyplot as plt
fig, ax = plt.subplots(figsize=(10, 4))
ax.plot(np.array(all_obs))
ax.legend(['x', 'x_dot', 'theta', 'theta_dot'])
Explanation: 観測
ランダムな行動より上手くやりたければ、それぞれの行動が環境にどんな影響を与えるのか知りたいところ。
行動が環境にどんな影響を与えたのかは、環境のstep関数が教えてくれる。
step関数は4つの値を返す
observation (object) 観測
reward  (float) 報酬
done (boolean) エピソードの終了フラグ（Trueになった時がreset()を呼ぶタイミング）
info (dict) サブ情報
done==Trueとなったときにエピソードを終了するのであれば、以下のようなコードになる。
End of explanation
import gym
env = gym.make('CartPole-v0')    # 'CartPole-v0' は環境ID
#env = gym.make('MountainCar-v0')    # 'MountainCar-v0'という別の環境
#env = gym.make('MsPacman-v0')    # 'MsPacman-v0'という別の環境
print(env.action_space)
print(env.observation_space)
Explanation: 空間
可能な行動や観測は Spaceオブジェクトで記述されている。
End of explanation
env.action_space.n
Explanation: Descrete: 非負の整数 {0, 1, 2, ..., n-1}
End of explanation
env.observation_space.high
env.observation_space.low
Explanation: Box: n次元のbox (次元ごとに上限と下限を持つn次元配列)
End of explanation
from gym import spaces
space = spaces.Discrete(8) #  {0, 1, 2, ..., 7}
# サンプリング
x = space.sample()
x
assert space.contains(x)
assert space.n == 8
Explanation: スペースからサンプリングすることも、ある値がスペースに含まれているか調べることもできる。
End of explanation
from gym import envs
# 使用可能な環境を列挙
envs.registry.all()
Explanation: 環境
gymの主な役割は、強化学習で使える多様な環境を提供すること。
OpenAI Gymが提供する環境　https://gym.openai.com/envs
End of explanation
import gym
from gym import wrappers    # ラッパの呼び出し
env = gym.make('CartPole-v0')
env = wrappers.Monitor(env, './cartpole-v0-experiment-1', force=True)  # envをMonitorでラッピング。force=Trueで前の結果を削除。
for i_episode in range(10):
    observation = env.reset()
    for t in range(100):
        env.render()
        print(observation)
        action = env.action_space.sample()
        observation, reward, done, info = env.step(action)
        if done:
            print("Episode finished after {} timesteps".format(t+1))
            break
            
env.render(close=True)
#!open .
# 結果をOpenAI Gym側のサーバーにアップロードする方法。
import gym
#gym.upload('/tmp/cartpole-v0-experiment-1', api_key='YOUR_API_KEY')
Explanation: 自分で環境を作ることも可能
作った環境はロードするときにこのようにregistryに登録したら良い。
シミュレーション結果の記録とアップロード
ある環境でのパフォーマンスを計測し、同時にビデオに記録するには、環境（env）をMonitorでラッピングすれば良い。
End of explanation
<END_TASK>