# 返回状态s的最佳动作a、及其r值。 defargmax(self, s): max_r = -math.inf max_a = None for a in range(self.action_space.n): r = self.q_get(s, a) if r > max_r: max_a = a max_r = r return max_a, max_r # 获得 状态s,动作a 对应的r值 defq_get(self, s, a): return self.q[s][a] # 更新 状态s 动作a 对应的r值 defq_put(self, s, a, v): self.q[s][a] = v
Q-learning的关键步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
defchoose_action(self, s): if random.random() < self.epsilon: # 按一定概率进行随机探索 return self.action_space.sample() # 返回最佳动作 a, _ = self.argmax(s) return a
env = gym.make('FrozenLake-v0') agent = QLAgent(env.action_space, env.observation_space.n) for epoch in range(10000): s = env.reset() done = False whilenot done: # env.render() # 训练过程不需要渲染 a = agent.choose_action(s) # 选择动作 s_, r, done, info = env.step(a) # 执行动作 agent.update_transition(s, a, r, s_) # 更新状态变化 s = s_ # 显示训练后的Q表 print(agent.q)
测试效果
在测试中,我们只选择最佳策略,不再探索,也不再更新Q表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 获胜次数 total_win = 0 for i in range(10000): s = env.reset() done = False whilenot done: # 选择最佳策略 a, _ = agent.argmax(s) # 执行动作 a s_, r, done, info = env.step(a) if done and r == 1: total_win += 1 s = s_ print('Total win=', total_win) env.close()