tocomの調査録(機械学習、強化学習多め)

機械学習関連のことをまとめていきます。強化学習関連が多いかもしれません

【open ai gym、強化学習】Acrobotの紹介

今回はAcrobotについて紹介します。

問題の概要

Acrobotは下のイメージ図にあるように
2つのリンクが中間点によって繋がっている振り子をコントロールする問題です。

f:id:ttt242242:20190518145210j:plain

出典:Leaderboard · openai/gym Wiki · GitHub

この中間点に適切な力を加えて、
リンクの終端(図で言えば一番した)を指定した高さまで上がるようにコントロールすることが目的の問題となります。

制御値、観測、報酬等について

制御値(行動)

制御値は離散値で三択になります。

制御値 動作
0 右方向への力を加える
1 何の力も加えない
2 左方向への力を加える

観測

観測値は、1本目(図で言えば上)のリンクの$cos(\theta_1)$, $sin(\theta_1)$,
2本目のリンクの$cos(\theta_2)$, $sin(\theta_2)$、
1本目と2本目のリンクの角速度の6つです。

試しに観測情報を見てみます。

print(env.observation_space.sample())  # 観測情報のサンプルの出力
# => [-0.85792788 -0.8257414  -0.95956321  0.66523969  6.99084164 20.92369404]

報酬

終端の点が目的の高さにたどり着いてなければ-1、
たどり着けば0の報酬を与えます。

エピソードの終了判定

終端が指定した高さに到達した時と、
500回行動選択を行った時に終了と判定されます。

ちょっと動かしてみる

実際に動かしてみます。
stepメソッドを使って1ステップづつ操作していきます。
stepメソッドの戻り値は操作した結果 (観測情報, 報酬, エピソードの終了判定) が返却されます。

サンプルコードを実行するために
gymをインストールする必要があります。

pip install gym

サンプルコード

ひたすらランダムで行動選択を行ってみます。
以下、サンプルコードになります。

import gym 
env = gym.make("Acrobot-v1")
env.reset()

is_finish = False   # 終了判定

nb_step = 1
while(1):
    env.render()
    random_action = env.action_space.sample()   # ランダムで行動を選択。0, 1, 2のどれか
    obs, reward, is_finish, _ = env.step(action=random_action) # ひたすら台車を左方向に押す
    print("nb_step:{}, action:{}, obs:{}, reward:{}, is_finish:{}".format(nb_step, random_action, obs, reward, is_finish))
    nb_step += 1
    if is_finish == True:   # 終了したら、whileを抜ける
        break

実行結果

終了するまで実行します。

nb_stepがステップ数、actionが行動、obsが観測情報、rewardが報酬、is_finishがゲームの終了判定を表しています。

<省略>
nb_step:494, action:0, obs:[ 0.97159679  0.23664249  0.94768278  0.31921363 -0.91472689  2.31228964], reward:-1.0, is_finish:False
nb_step:495, action:2, obs:[ 0.99944063  0.03344299  0.70913688  0.70507084 -1.08845629  2.16061755], reward:-1.0, is_finish:False
nb_step:496, action:0, obs:[ 0.98778079 -0.15584962  0.45543463  0.89026923 -0.78332725  0.95801898], reward:-1.0, is_finish:False
nb_step:497, action:0, obs:[ 0.96390871 -0.26623299  0.40265971  0.91534974 -0.32246834 -0.39008979], reward:-1.0, is_finish:False
nb_step:498, action:2, obs:[ 0.95585843 -0.29382762  0.54524877  0.83827429  0.04680202 -1.23134825], reward:-1.0, is_finish:False
nb_step:499, action:1, obs:[ 0.9719681  -0.23511275  0.80302917  0.59593972  0.55511313 -2.29460188], reward:-1.0, is_finish:False
nb_step:500, action:2, obs:[ 0.99496717 -0.10020148  0.99057183  0.13699437  0.76402291 -2.60231   ], reward:-1.0, is_finish:True

参考文献

github.com