問題の概要
Pendulumは、 単振り子の問題になります。
以下の振り子に適切な力を加え、
振り子を立たせることが目的となる問題です。
出典:Leaderboard · openai/gym Wiki · GitHub
制御値、観測、報酬等について
制御値(行動)
制御値は、左方向に力を加えるか、右方向に力を加えるかになります。
-2から2までの間での連続値になります。
以下のコードで確認してみます。
print(env.action_space.high) # 最大値 # => [2.] print(env.action_space.low) # 最小値 # => [-2.] print(env.action_space.sample()) # 行動をランダムで決定 # => [0.58357645]
観測
観測値は、以下のようになります。
観測情報 | 最小値 | 最大値 |
---|---|---|
\(sin(\theta)\) | -1.0 | 1.0 |
\(cos(\theta)\) | -1.0 | 1.0 |
\(\dot{\theta}\) | -8.0 | 8.0 |
確認してみます。
print(env.observation_space.high) # 最大の観測情報の生成 # => [1. 1. 8.] print(env.observation_space.low) # 最小の観測情報の生成 # => [-1. -1. -8.] print(env.observation_space.sample()) # ランダムで観測情報を決定 # =>[-0.12482558 0.783546 7.41860417]
報酬
報酬は以下のように与えられます。
$$
\begin{aligned}
r = -(\theta ^2 + 0.1 \cdot \dot{\theta}+0.001 \cdot a)
\end{aligned}
$$
\begin{aligned}
r = -(\theta ^2 + 0.1 \cdot \dot{\theta}+0.001 \cdot a)
\end{aligned}
$$
\(a\)は行動になります。
振り子が立っていて静止している時が最適な状態なので、
その時に\(r=0\) となります。
(\(\theta=0, \dot{\theta}=0, a=0\)
エピソードの終了判定
このゲームは非エピソード型のゲームになるので、終了判定はありません。
と、documentには書いてあるのですが、200ステップで強制終了する・・・
何故かはわかりません。調査中です。
ちょっと動かしてみる
実際に動かしてみます。
stepメソッドを使って1ステップづつ振り子を操作していきます。
stepメソッドの戻り値は操作した結果 (観測情報, 報酬, エピソードの終了判定) が返却されます。
サンプルコードを実行するために
gymをインストールする必要があります。
pip install gym
サンプルコード
ひたすらランダムで行動選択を行ってみます。
以下、サンプルコードになります。
import gym env = gym.make("Pendulum-v0") 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:195, action:[0.95820318], obs:[-0.98664834 -0.16286517 1.93433814], reward:-9.79362251951132, is_finish:False nb_step:196, action:[-0.03816477], obs:[-0.96793588 -0.2511974 1.80646455], reward:-9.242644441989826, is_finish:False nb_step:197, action:[-1.09034149], obs:[-0.94712486 -0.32086524 1.45451528], reward:-8.666190209907835, is_finish:False nb_step:198, action:[-0.98257407], obs:[-0.92867691 -0.37088973 1.06648024], reward:-8.136469087926985, is_finish:False nb_step:199, action:[-1.76788336], obs:[-0.91865917 -0.39505105 0.52313043], reward:-7.7434402096148025, is_finish:False nb_step:200, action:[-0.2623335], obs:[-0.91491541 -0.40364564 0.18749212], reward:-7.510227269074242, is_finish:True
参考文献
https://github.com/openai/gym/wiki/Pendulum-v0
コメント