今回はAcrobotについて紹介します。
問題の概要
Acrobotは下のイメージ図にあるように
2つのリンクが中間点によって繋がっている振り子をコントロールする問題です。
出典: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
コメント