質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.61%

Q学習のcartpoleにおいて、離散化された状態のstateの取得の意味について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 856

score 48

Q学習によるcartpoleの問題の勉強を始めました。
以下のコードはqiitaサイトより引用させていただいております。
https://qiita.com/sugulu/items/bc7c70e6658f204f85f9

最初の部分で躓いているのですが、コードというよりコードの意味について理解できずにおります。

#Q関数を離散化し定義する関数
#観測した状態をデジタル変換する

def bins(clip_min,clip_max,num):
    return np.linspace(clip_min,clip_max,num+1)[1:-1]

#各値を離散化に変換する
def digitize_state(observation):
    cart_pos,cart_v,pole_angle,pole_v=observation
    digitized=[np.digitize(cart_pos,bins=bins(-2.4,2.4,num_digitized)),
np.digitize(cart_v,bins=bins(-3.0,3.0,num_digitized)),
np,digitize(pole_angle,bins=bins(-0.5,0.5,num_digitized)),
np.digitize(pole_v,bins=bins(-2.0,2.0,num_digitized))]

    return sum([x*(num_dizitized**i) for i,x in enumerate(digitized)])

num_dizitized=6

# カート、棒の状態をstate=digitize_state(observation) で取得していくこととなる。
コード

最初の部分のコードの理解しようとしているのですが、なかなか理解が進まず困っています。

このdigitize_stateの方法で出力するものをstateとして定義していくとすると、np.digitizeで離散化したデータがcart_v<cart_pos<pole_angle<pole_vの順でenumerate関数を用いた内包表記部分で6の累乗分重要視された和が出力されていると考えているのですが、その理解は正しいでしょうか。

カートよりもポールの離散化された状態を重視し、ポールの離散化された速度を最も重視した値をdigitize_stateで出力している??との理解が正しいのか悩んでおります。

なにかアドバイスを頂けますと幸いです。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

このdigitize_stateの方法で出力するものをstateとして定義していくとすると、np.digitizeで離散化したデータがcart_v<cart_pos<pole_angle<pole_vの順でenumerate関数を用いた内包表記部分で6の累乗分重要視された和が出力されていると考えているのですが、その理解は正しいでしょうか。

わかりづらいコードですね。。
コードを見ましたが、その理解であっていますよ。

digitize() の返り値を以下の重み付きで総和をとっています。

num_dizitized**0: cart_pos 
num_dizitized**1: cart_v
num_dizitized**2: pole_angle
num_dizitized**3: pole_v

元が4次元の状態を一次元にする必要があるので、このようなことをしていると思われます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/13 17:42

    tiitoi 様、ありがとうございます。

    分かりづらくてコードの意味について悩んでいました。
    重み付きで総和を取っているという理解であっていて安心しました。
    少し分かりやすくしてコードを分かりやすくしてみます。

    キャンセル

0

tiitoi 様、ありがとうございます。

分かりづらくてコードの意味について悩んでいました。
重み付きで総和を取っているという理解であっていて安心しました。
少し分かりやすくしてコードを分かりやすくしてみます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る