Q-learning算法是比较经典的强化学习入门算法,本文以FrozenLake-V0为例,介绍Q-learning的相关实现。

首先定义一个Agent类,sample函数就是使用epsilon-greedy的采样方法,predict则是根据当前的观察值来预测输出的动作,learn就是通过输入当前的观察值obs,当前的动作action,奖励reward以及下一个时刻的观察值next_obs来更新Q值表。

代码:

class QLearningAgent(object):def __init__(self, obs_n, act_n, learning_rate=0.01, gamma=0.9, e_greed=0.1):self.act_n = act_n  # 动作维度,有几个动作可选self.lr = learning_rate  # 学习率self.gamma = gamma  # reward的衰减率self.epsilon = e_greed  # 按一定概率随机选动作self.Q = np.zeros((obs_n, act_n))# 根据输入观察值,采样输出的动作值,带探索def sample(self, obs):rd_p = np.random.uniform(0, 1)if rd_p <= self.epsilon:action = np.random.choice(self.act_n)else:action = self.predict(obs)return action# 根据输入观察值,预测输出的动作值def predict(self, obs):Q_max = np.max(self.Q[obs, :])action_list = np.where(self.Q[obs, :] == Q_max)[0]action = np.random.choice(action_list)return action# 学习方法,也就是更新Q-table的方法def learn(self, obs, action, reward, next_obs, done):""" off-policyobs: 交互前的obs, s_taction: 本次交互选择的action, a_treward: 本次动作获得的奖励rnext_obs: 本次交互后的obs, s_t+1done: episode是否结束"""predict_Q = self.Q[obs, action]if done:target_Q = rewardelse:# target_Q = reward + self.gamma*np.max(self.Q[obs,:])target_Q = reward + self.gamma * np.max(self.Q[next_obs, :])# 迭代更新Q表self.Q[obs, action] += self.lr * (target_Q - predict_Q)# 保存Q表格数据到文件def save(self):npy_file = './q_table.npy'np.save(npy_file, self.Q)print(npy_file + ' saved.')# 从文件中读取数据到Q表格中def restore(self, npy_file='./q_table.npy'):self.Q = np.load(npy_file)print(npy_file + ' loaded.')

然后定义训练和测试的方法,env是训练的环境, 此处使用的gym的环境。

def run_episode(env, agent, render=False):total_steps = 0 # 记录每个episode走了多少steptotal_reward = 0obs = env.reset() # 重置环境, 重新开一局(即开始新的一个episode)while True:action = agent.sample(obs) # 根据算法选择一个动作next_obs, reward, done, _ = env.step(action) # 与环境进行一个交互# 训练 Q-learning算法agent.learn(obs, action, reward, next_obs, done)obs = next_obs  # 存储上一个观察值total_reward += rewardtotal_steps += 1 # 计算step数if render:env.render() #渲染新的一帧图形if done:breakreturn total_reward, total_stepsdef test_episode(env, agent):total_reward = 0obs = env.reset()while True:action = agent.predict(obs) # greedynext_obs, reward, done, _ = env.step(action)total_reward += rewardobs = next_obstime.sleep(0.5)env.render()if done:breakreturn total_reward

最后将定义的agent放到环境中进行训练和测试

# 使用gym创建迷宫环境,设置is_slippery为False降低环境难度
env = gym.make("FrozenLake-v0", is_slippery=False)  # 0 left, 1 down, 2 right, 3 up# 创建一个agent实例,输入超参数
agent = QLearningAgent(obs_n=env.observation_space.n,act_n=env.action_space.n,learning_rate=0.1,gamma=0.9,e_greed=0.3)# 训练500个episode,打印每个episode的分数
for episode in range(500):ep_reward, ep_steps = run_episode(env, agent, False)print('Episode %s: steps = %s , reward = %.1f' % (episode, ep_steps, ep_reward))# 全部训练结束,查看算法效果
test_reward = test_episode(env, agent)
print('test reward = %.1f' % (test_reward))

使用gym的FrozenLake-V0环境进行训练,如下图所示,F为frozen lake,H为hole,S为起点,G为终点,掉到hole里就游戏结束,可以有上每一步可以有上下左右四个方向的走法,只有走到终点G才能得1分。

经过500次episode训练,可以找到一条比较好的路径:

本文的学习资料出自 <百度强化学习7日打卡营-世界冠军带你从零实践>课程。

强化学习-Q-learning FrozenLake-V0 实现相关推荐

  1. 初学者的强化学习q learning和sarsa

    Reinforcement learning is a fast-moving field. Many companies are realizing the potential of RL. Rec ...

  2. 强化学习q学习求最值_通过Q学习更深入地学习强化学习

    强化学习q学习求最值 by Thomas Simonini 通过托马斯·西蒙尼(Thomas Simonini) 通过Q学习更深入地学习强化学习 (Diving deeper into Reinfor ...

  3. 强化学习q学习求最值_Q学习简介:强化学习

    强化学习q学习求最值 by ADL 通过ADL Q学习简介:强化学习 (An introduction to Q-Learning: reinforcement learning) This arti ...

  4. 强化学习 (Reinforcement Learning)

    强化学习: 强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益.其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能 ...

  5. 强化学习 Reinforcement Learning(三)——是时候用 PARL 框架玩会儿 DOOM 了!!!(下)

    强化学习 Reinforcement Learning(三)-- 是时候用 PARL 框架玩会儿 DOOM 了!!!(下) 本文目录 强化学习 Reinforcement Learning(三)-- ...

  6. 强化学习(Reinforcement Learning)入门知识

    强化学习(Reinforcement Learning) 概率统计知识 1. 随机变量和观测值 抛硬币是一个随机事件,其结果为**随机变量 X ** 正面为1,反面为0,若第 i 次试验中为正面,则观 ...

  7. 强化学习(Reinforcement Learning)入门学习--01

    强化学习(Reinforcement Learning)入门学习–01 定义 Reinforcement learning (RL) is an area of machine learning in ...

  8. 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)

    接下来我们回顾一下动态规划算法(DP)和蒙特卡罗方法(MC)的特点,对于动态规划算法有如下特性: 需要环境模型,即状态转移概率PsaPsa 状态值函数的估计是自举的(bootstrapping),即当 ...

  9. 强化学习Q-Learning解决FrozenLake例子(Python)

    import gym import numpy as np import random import matplotlib.pyplot as plt# gym创建冰湖环境 env = gym.mak ...

  10. 强化学习(Reinforcement Learning)

    背景 当我们思考学习的本质时,我们首先想到的可能是我们通过与环境的互动来学习.无论是在学习开车还是在交谈,我们都清楚地意识到环境是如何回应我们的行为的,我们试图通过行为来影响后续发生的事情.从互动中学 ...

最新文章

  1. CTO:再写if-else,逮着一个罚款1000!
  2. 邊做邊學 Internet Explorer 8:瞭解 IE8 相容性技術
  3. 事务的四大特性、事务处理开始与结束、v$transactio、 v$LOCK
  4. delphi 提取字符中的数字
  5. html5 筛子,html5摇骰子游戏
  6. LeetCode228场周赛解题报告
  7. 《抓住听众心理——演讲者要知道的100件事》一2.听众需要上下文
  8. super(XXXX,self).__init__()在类中的作用
  9. 基于jQuery开发的javascript模板引擎-jTemplates
  10. 关于蓝桥杯竞赛考试的一些信息~
  11. VC++实现全局钩子勾住消息对话框
  12. php分页查询·······类
  13. catia三维轴承_常用滚动轴承手册与三维图库(CATIA版)
  14. 扩展:收藏网上胖友的面试题
  15. oracle查询某字段为空时,赋值为0
  16. 四年级计算机教案模板,小学四年级计算机教案模板.doc
  17. ffmpeg 录制屏幕
  18. 利用swagger组件测试excel下载,打开文件乱码。
  19. c#开发初学者之mvc及架构分层
  20. Windows11系统中文乱码,软件中文路径打不开

热门文章

  1. Vue3+Vite 图标封装3种方案
  2. 焊接机器人控制系统原理分析
  3. js手机号码格式、tp5身份证格式验证
  4. 原生js的图片时钟实现
  5. 考研党福利!人工智能、大数据、网络安全等热门专业有调剂名额,没过线也可调剂...
  6. BZOJ 3090: Coci2009 [podjela]
  7. 【数字信号调制】无线电信号调制识别matlab源码
  8. 系统检测到您的访问行为异常 请正确输入以下验证码,验证通过后,可继续使用经验
  9. LibreOJ2302 - 「NOI2017」整数
  10. 计算机办公应用操作试题,计算机office办公软件上机操作试题