前回の記事でMoutainCar問題を紹介しました。
https://www.tcom242242.net/entry/2019/04/30/194755
今回はMoutainCarの制御値が連続値のバージョンを紹介します。
問題の概要
MoutainCarは、 台車を山の上にあるゴール地点にたどり着けるように
適切にコントロールする問題になります。
出典:Leaderboard · openai/gym Wiki · GitHub
制御値、観測、報酬等について
制御値(行動)
前回と異なるのは主に制御値になります。
前回は、台を左に押す(0)か何もしない(1)、右に押す(2)の三択でしたが、
今回は連続値になります。
負の値であれば、台車を左方向に押し、
正の値であれば、右方向に押します。
観測情報 | 最小値 | 最大値 |
---|---|---|
台を押す量 | -1.0 | 1.0 |
以下のコードで確認できます。
print(env.action_space.high) # 最大値 # => [1.] print(env.action_space.low) # 最小値 # => [-1.]
観測
観測値は、台車の位置と速度の2つになります。
観測情報 | 最小値 | 最大値 |
---|---|---|
台車の位置 | -1.2 | 0.6 |
台車の速度 | -0.07 | 0.07 |
報酬
ゴールに着いたら100、
それ以外の場合、制御値の大きさに応じて負の値が与えるようです。
つまり、大きく動かせば動かすほど報酬が大きくなります。
(コードを参照)
エピソードの終了判定
最低限、以下の2つの終了判定が存在します。
- 台車がゴールにたどり着いた
- 999回制御を行った
ただ、実は終了判定がまだ完璧に理解できていません。
私の今後の課題です。
ちょっと動かしてみる
実際に動かしてみます。
stepメソッドを使って1ステップづつ台車を操作していきます。
stepメソッドの戻り値は操作した結果 (観測情報, 報酬, エピソードの終了判定) が返却されます。
サンプルコードを実行するために
gymをインストールする必要があります。
pip install gym
サンプルコード
ひたすらランダムで行動選択を行ってみます。
以下、サンプルコードになります。
import gym env = gym.make("MountainCarContinuous-v0") # 環境の読み込み env.reset() is_finish = False nb_step = 0 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:995, action:[-0.80464727], obs:[-0.50252417 -0.0090894 ], reward:-0.06474572212402348, is_finish:False nb_step:996, action:[0.0298444], obs:[-0.51172676 -0.00920259], reward:-8.906884425667795e-05, is_finish:False nb_step:997, action:[0.87682404], obs:[-0.51970314 -0.00797638], reward:-0.0768820403064634, is_finish:False nb_step:998, action:[-0.5427069], obs:[-0.5285228 -0.00881965], reward:-0.02945307771738048, is_finish:True
参考文献
https://github.com/openai/gym/blob/master/gym/envs/classic_control/continuous_mountain_car.py
コメント