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

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

ただいまの
回答率

89.25%

Q学習のプログラム エラーがでてしまいます

受付中

回答 2

投稿 編集

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

takumii

score 0

前提・実現したいこと

PythonでQ学習のプログラムを書いております。
以下のようなコードを書いたところ、エラーメッセージが出ました。

"s"が定義されていないとのことですが、どこが問題で、どう改善すべきか分からないので教えて頂きたいです。

プログラムのコード

import numpy as np
import pandas as pd
import random

#条件の設定
S = np.array(list(range(0,820)))#状態(1+9+9^2+9^3) #0~819までの行列
A = np.array([0,1,2,3,4,5,6,7,8])#行動(活動を行うメッシュ)
risk0 = np.array([0,3,0,1,4,1,6,0,1])#初期状態の件数
#活動効果値
r0 = 2*np.array([1,0.5,0.25,0.5,0.5,0.25,0.25,0.25,0.25])
r1 = 2*np.array([0.5,1,0.5,0.5,0.5,0.5,0.25,0.25,0.25])
r2 = 2*np.array([0.25,0.5,1,0.25,0.5,0.5,0.25,0.25,0.25])
r3 = 2*np.array([0.5,0.5,0.25,1,0.5,0.25,0.5,0.5,0.25])
r4 = 2*np.array([0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5])
r5 = 2*np.array([0.25,0.5,0.5,0.25,0.5,1,0.25,0.5,0.5])
r6 = 2*np.array([0.25,0.25,0.25,0.5,0.5,0.25,1,0.5,0.25])
r7 = 2*np.array([0.25,0.25,0.25,0.5,0.5,0.5,0.5,1,0.5])
r8 = 2*np.array([0.25,0.25,0.25,0.25,0.5,0.5,0.25,0.5,1])
#次期の状態(S1=s11+s12)
s11 = np.array(list(range(1,820))).reshape(91,9)    
s12 = np.full((730, 9), None)                
S1 = np.concatenate([s11, s12])   

#学習方法(ハイパーパラメータ)の設定
alpha = 0.01#学習率
gamma = 0.8#割引率
n = 200000#学習回数

#データフレーム作成用リストの作成
list1 = [[] for _ in range(10)]   #変数を"_"と置いた
for num in range(9):
    list1[0].append(f"mesh{num+1}" )

#行動価値関数テーブルの初期化
Q = np.zeros(S1.shape)

#行動(活動実施メッシュ)に応じて報酬(効果値)を選択
def ziko(a):
    if a == 0:
        return r0
    elif a == 1:
        return r1
    elif a == 2:
        return r2
    elif a == 3:
        return r3
    elif a == 4:
        return r4
    elif a == 5:
        return r5
    elif a == 6:
        return r6
    elif a == 7:
        return r7
    else :
        return r8

#Q学習のメイン関数   
def q_learning():
    s = S[0]#初期状態
    rt = risk0#初期状態での件数
    a = random.randrange(9)#活動を行うメッシュの選択
    while S1[s,a] != None:    #S1は(91+730=)821行9列の行列
        a = random.randrange(9)#活動を行うメッシュの選択
        ra = ziko(a)#行動に応じた効果値
        rt_1 = rt - ra#各メッシュにおける件数の減少量
        rt__1 = np.maximum(0, rt_1)#件数が負の値にならないように処理 
        R = np.sum(rt - rt__1)#報酬(全メッシュにおける件数減少量の総和)
        max_q = max(s1max())#次期状態S1でのQ(行動価値関数)の最大値   #s1maxは下で定義してる
        td = R + gamma * max_q - Q[s,a]#TD誤差
        Q[s,a] += alpha * td#Q値(行動価値関数)の更新
        s = S1[s,a]#次期状態
        rt = rt__1#件数の更新

    #データフレーム作成用リストにデータを追加
    for j in range(9):
        list1[j+1].append(Q[0,j])


#次期状態S1でのQ(行動価値関数)のリスト作成    
def s1max():
    listS1 = []
    for i in range(9):
        listS1.append(Q[S1[s,a],i])
    return listS1

#メイン関数の実行    
for k in range(n):
    q_learning()
    print(k)

#Q値データのリストをデータフレームに変換    
df = pd.DataFrame(list1[1:]).T
df.columns=list1[0]

発生している問題・エラーメッセージ

NameError: name 's' is not defined

該当のソースコード

Python 3.8.2 

試したこと

プログラミングを習いたてでどう改善すればよいかわからないのでお願い致します。 

補足情報(FW/ツールのバージョンなど)

次期状態S1でのQ(行動価値関数)のリスト作成内
下から11行目の
listS1.append(Q[S1[s,a],i])
でエラーが出ました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2020/05/22 18:27

    コードは「コードの挿入」で記入してください。(インデントがなくなってコードが読めません)

    キャンセル

  • takumii

    2020/05/22 18:35

    ご指摘ありがとうございます。ただいまコードを挿入しました。

    キャンセル

  • meg_

    2020/05/22 18:53

    ”"s"が定義されていないとのこと” ← おそらくaも未定義なのでは?
    「listS1.append(Q[S1[s,a],i])」ですが、S1の添え字 s,aが何なのか定義しないといけません。

    キャンセル

回答 2

0

def q_learning()内にs1max()を入れて定義したらエラーがなくなりました。お答えいただきありがとうございます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

定義し直したらエラーが治りました。
お答え頂きありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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