size self.traps = traps self.start = (0, 0) self.goal = (size-1, size-1) self.states = [(x, y) for x in range(size) for y in range(size)] self.actions = [(-1, 0), (0, -1), (1, 0), (0, 1)] self.policy = {} for s in self.states: self.policy[(s, (-1, 0))] = 0 self.policy[(s, (0, -1))] = 0 self.policy[(s, (1, 0))] = 1/2 self.policy[(s, (0, 1))] = 1/2 self.value = {} for s in self.states: self.value[s] = 0 def move(self, s, a): if s == self.goal: return 0, s # Reward, Next state s_new = (s[0] + a[0], s[1] + a[1]) if s_new not in self.states: return 0, s # Reward, Next state if s_new in self.traps: return -1, self.start # Reward, Next state return -1, s_new # Reward, Next state 行動ポリシー を Python のディクショナリーとして定義 状態価値関数 を Python のディクショナリーとして定義 今の場合は、確率的な状態変化を伴わない 環境なので、(確率 1 で得られる) 報酬 r と次の状態 s' を返却 終了状態は任意のアクションに対 して、報酬 0 と同じ状態を返す 環境を表すクラス 条件付き確率 に基づいて 報酬 r と次の状態 s' を返却