前提・実現したいこと
PythonでQ学習のプログラムを書いております。
以下のようなコードを書いたところ、エラーメッセージが出ました。
"s"が定義されていないとのことですが、どこが問題で、どう改善すべきか分からないので教えて頂きたいです。
##プログラムのコード
Python
1 2import numpy as np 3import pandas as pd 4import random 5 6#条件の設定 7S = np.array(list(range(0,820)))#状態(1+9+9^2+9^3) #0~819までの行列 8A = np.array([0,1,2,3,4,5,6,7,8])#行動(活動を行うメッシュ) 9risk0 = np.array([0,3,0,1,4,1,6,0,1])#初期状態の件数 10#活動効果値 11r0 = 2*np.array([1,0.5,0.25,0.5,0.5,0.25,0.25,0.25,0.25]) 12r1 = 2*np.array([0.5,1,0.5,0.5,0.5,0.5,0.25,0.25,0.25]) 13r2 = 2*np.array([0.25,0.5,1,0.25,0.5,0.5,0.25,0.25,0.25]) 14r3 = 2*np.array([0.5,0.5,0.25,1,0.5,0.25,0.5,0.5,0.25]) 15r4 = 2*np.array([0.5,0.5,0.5,0.5,1,0.5,0.5,0.5,0.5]) 16r5 = 2*np.array([0.25,0.5,0.5,0.25,0.5,1,0.25,0.5,0.5]) 17r6 = 2*np.array([0.25,0.25,0.25,0.5,0.5,0.25,1,0.5,0.25]) 18r7 = 2*np.array([0.25,0.25,0.25,0.5,0.5,0.5,0.5,1,0.5]) 19r8 = 2*np.array([0.25,0.25,0.25,0.25,0.5,0.5,0.25,0.5,1]) 20#次期の状態(S1=s11+s12) 21s11 = np.array(list(range(1,820))).reshape(91,9) 22s12 = np.full((730, 9), None) 23S1 = np.concatenate([s11, s12]) 24 25#学習方法(ハイパーパラメータ)の設定 26alpha = 0.01#学習率 27gamma = 0.8#割引率 28n = 200000#学習回数 29 30#データフレーム作成用リストの作成 31list1 = [[] for _ in range(10)] #変数を"_"と置いた 32for num in range(9): 33 list1[0].append(f"mesh{num+1}" ) 34 35#行動価値関数テーブルの初期化 36Q = np.zeros(S1.shape) 37 38#行動(活動実施メッシュ)に応じて報酬(効果値)を選択 39def ziko(a): 40 if a == 0: 41 return r0 42 elif a == 1: 43 return r1 44 elif a == 2: 45 return r2 46 elif a == 3: 47 return r3 48 elif a == 4: 49 return r4 50 elif a == 5: 51 return r5 52 elif a == 6: 53 return r6 54 elif a == 7: 55 return r7 56 else : 57 return r8 58 59#Q学習のメイン関数 60def q_learning(): 61 s = S[0]#初期状態 62 rt = risk0#初期状態での件数 63 a = random.randrange(9)#活動を行うメッシュの選択 64 while S1[s,a] != None: #S1は(91+730=)821行9列の行列 65 a = random.randrange(9)#活動を行うメッシュの選択 66 ra = ziko(a)#行動に応じた効果値 67 rt_1 = rt - ra#各メッシュにおける件数の減少量 68 rt__1 = np.maximum(0, rt_1)#件数が負の値にならないように処理 69 R = np.sum(rt - rt__1)#報酬(全メッシュにおける件数減少量の総和) 70 max_q = max(s1max())#次期状態S1でのQ(行動価値関数)の最大値 #s1maxは下で定義してる 71 td = R + gamma * max_q - Q[s,a]#TD誤差 72 Q[s,a] += alpha * td#Q値(行動価値関数)の更新 73 s = S1[s,a]#次期状態 74 rt = rt__1#件数の更新 75 76 #データフレーム作成用リストにデータを追加 77 for j in range(9): 78 list1[j+1].append(Q[0,j]) 79 80 81#次期状態S1でのQ(行動価値関数)のリスト作成 82def s1max(): 83 listS1 = [] 84 for i in range(9): 85 listS1.append(Q[S1[s,a],i]) 86 return listS1 87 88#メイン関数の実行 89for k in range(n): 90 q_learning() 91 print(k) 92 93#Q値データのリストをデータフレームに変換 94df = pd.DataFrame(list1[1:]).T 95df.columns=list1[0] 96
発生している問題・エラーメッセージ
NameError: name 's' is not defined
該当のソースコード
Python 3.8.2
試したこと
プログラミングを習いたてでどう改善すればよいかわからないのでお願い致します。
補足情報(FW/ツールのバージョンなど)
次期状態S1でのQ(行動価値関数)のリスト作成内
下から11行目の
listS1.append(Q[S1[s,a],i])
でエラーが出ました。