前提
pythonでオセロのQ学習を行うコードを書いています
実現したいこと
配列の座標および石を置く座標に応じた,Q値があるならQ値を返す関数select_qを作っている。
その後Q学習の計算をする際にappendを使って石を置ける時のみのQ値を抽出できるようにしたい
しかしその時にエラーコードが起こってしまっているので、その直し方のアドバイスをもらいたい。
おそらく使っている変数がおかしいのだが、その直し方がよくわからない。
発生している問題・エラーメッセージ
エラーメッセージ
list indices must be integers or slices, not tuple
該当のソースコード
python pycharmで実行中 googlecolaboratoryでも似たようなエラーメッセージをもらう
エラーはput関数内で起こっています。
ソースコード
class Qfunc: def __init__(self, first_q=30.0): self.values = dict() #(盤面の状況、手番)→Q値」の関係でQ値を保存する。辞書型で # #values[(2,1),(3,4)]=50みたいなイメージ self.eta = ETA self.gamma = GAMMA self.first_q = first_q # 学習していない手番に与えるQ値(初期重要度) def select_q(self, state, action): # valuesに蓄えたQ値を取得する 実際に学習するのはlearning add_reward if (state, action) in self.values: # 受け取った状態行動でvaluesの値含むならvaluesのQ値を返す return self.values[(state, action)] else: # Q 値が未学習の状況なら、Q 初期値 self.values[(state, action)] = self.first_q return self.first_q def set(self, state, action, q_value): # Q 値設定 self.values[(state, action)] = q_value def Learning(self, state, action, max_q): # 決着がつく前の手番に対して学習を行います Q値更新 current_q = self.select_q(state, action) # select_Qで得たQ値を取得 next_q = current_q + self.eta * (self.gamma * (max_q - current_q)) # Q値を計算 このプログラムに報酬なし self.set(state, action, next_q) # この状態行動での新たなQ値を設定 def add_reward(self, state, action, reward):#省略 class QLearning: board = Board() def __init__(self): #self.turns = 0 self.last_board = None self.last_action = None self.q = Qfunc() self.epsilon = EPSILON def learning(self, current_board):#maxのQを探す 省略 def put(self):#maxQ値の時の座標を返したい #self.turns += 1 current_board = self.board.RawBoard #RawBoardは盤面を表す put_ables = [] for x in range(1, BOARD_SIZE + 1): #BOARD_SIZEは8 for y in range(1, BOARD_SIZE + 1): if self.board.MovablePos[x, y]: # 置ける場所を座標化する MovablePosは石を置ける座標にTrueが入っている put_ables.append((x, y)) self.learning(put_ables) self.last_board = current_board length = (len(put_ables)) if length == 0: return if random.random() < self.epsilon: # ε-greedy # 一定確率でランダム行動選択 if length == 1: return put_ables[0] else: # 置ける場所からランダムで x, y = put_ables[random.randiant(0, len(put_ables) - 1)] return x, y else: # 評価値の最もいいものを選択 # 評価値リスト作成 [12,43,22] Qs = [] for index in put_ables: Qs.append(self.q.select_q(current_board, put_ables[index]))#maxのときのput_ables[index]が座標 ここがエラーです put_ables[index]の部分だけ警告をもらっています max_q = max(Qs) if Qs.count(max_q) > 1: # 同値 MAX の座標がある場合 # max_q の座標からランダム決定 vals = [i for i in range(len(put_ables)) if Qs[i] == max_q] number = random.choice(vals) else: #number = max_q number = Qs.index(max_q) return put_ables[number] ### 試したこと ここに問題に対して試したことを記載してください。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
0 コメント