Q learning算法

Q learning算法

代码仓库:https://github.com/daiyizheng/DL/tree/master/09-rl

Q Learning是强化学习算法中的一个经典算法。在一个决策过程中,我们不知道完整的计算模型,所以需要我们去不停的尝试。

算法流程

来自mofan

整体流程如下:

  • Q-table 初始化 第一步是创建 Q-table,作为跟踪每个状态下的每个动作和相关进度的地方
  • Observation. 代理需要观察环境的当前状态
  • Action.智能体选择在环境中行动。动作完成后,模型会观察该动作是否对环境有益。
  • Update.采取行动后,用结果更新 Q-table
  • Repeat 重复步骤 2-4,直到模型达到预期目标的终止状态。

数学公式

Q ( s , a ) = Q ( s , a ) + α ∗ ( r + γ ∗ m a x ( Q ( s ’ , a ’ ) ) − Q ( s , a ) ) Q(s,a) = Q(s,a) + α * (r + γ * max(Q(s’,a’)) - Q(s,a)) Q(s,a)=Q(s,a)+α(r+γmax(Q(s,a))Q(s,a))
该等式分解如下:

  • Q(s, a) 表示在状态 s 中采取行动 a 的预期奖励。
  • 该动作收到的实际奖励由 r 引用,而 s’ 指的是下一个状态。
  • 学习率是 α,γ 是折扣因子。
  • 状态 s’ 中所有可能的动作 a’ 的最高预期奖励由 max(Q(s’, a’)) 表示。

代码

基于表格的简单价值学习

  1. 构建环境
import gym#定义环境
class MyWrapper(gym.Wrapper):def __init__(self):#is_slippery控制会不会滑env = gym.make('FrozenLake-v1',render_mode='rgb_array',is_slippery=False)super().__init__(env)self.env = envdef reset(self):state, _ = self.env.reset()return statedef step(self, action):state, reward, terminated, truncated, info = self.env.step(action)over = terminated or truncated#走一步扣一份,逼迫机器人尽快结束游戏if not over:reward = -1#掉坑扣100分if over and reward == 0:reward = -100return state, reward, over#打印游戏图像def show(self):from matplotlib import pyplot as pltplt.figure(figsize=(3, 3))plt.imshow(self.env.render())plt.show()env = MyWrapper()
env.reset()
env.show()
  1. 构建Q 表
import numpy as np#初始化Q表,定义了每个状态下每个动作的价值
Q = np.zeros((16, 4))Q
  1. 记录数据
from IPython import display
import random#玩一局游戏并记录数据
def play(show=False):data = []reward_sum = 0state = env.reset()over = Falsewhile not over:action = Q[state].argmax()if random.random() < 0.1:action = env.action_space.sample()next_state, reward, over = env.step(action)data.append((state, action, reward, next_state, over))reward_sum += rewardstate = next_stateif show:display.clear_output(wait=True)env.show()return data, reward_sumplay()[-1]
#数据池
class Pool:def __init__(self):self.pool = []def __len__(self):return len(self.pool)def __getitem__(self, i):return self.pool[i]#更新动作池def update(self):#每次更新不少于N条新数据old_len = len(self.pool)while len(pool) - old_len < 200:self.pool.extend(play()[0])#只保留最新的N条数据self.pool = self.pool[-1_0000:]#获取一批数据样本def sample(self):return random.choice(self.pool)pool = Pool()
pool.update()len(pool), pool[0]
  1. 训练
#训练
'''
Brain of the agent 探索者的大脑!
agent will make desicion here 用于做决策
Q(s,a) <- Q(s,a) + Alpha * [r + gamma * max(Q(s', a')) - Q(s,a)]下面是Q——table表: (状态:行,行为:列)up    down    left    right   
state1  
state2...     
'''
def train():#共更新N轮数据for epoch in range(1000):pool.update()#每次更新数据后,训练N次for i in range(200):#随机抽一条数据state, action, reward, next_state, over = pool.sample()#Q矩阵当前估计的state下action的价值value = Q[state, action]#实际玩了之后得到的reward+下一个状态的价值*0.9target = reward + Q[next_state].max() * 0.9#value和target应该是相等的,说明Q矩阵的评估准确#如果有误差,则应该以target为准更新Q表,修正它的偏差#这就是TD误差,指评估值之间的偏差,以实际成分高的评估为准进行修正update = (target - value) * 0.1#更新Q表Q[state, action] += updateif epoch % 100 == 0:print(epoch, len(pool), play()[-1])train()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/176699.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

冰点还原精灵Deep Freeze for mac:Mac用户的最佳系统保护选择

你是否曾在Mac上安装软件后&#xff0c;发现系统性能下降&#xff0c;或者某些应用程序无法正常运行&#xff1f;这些问题可能让你感到困扰&#xff0c;但幸运的是&#xff0c;有一个解决方案可以帮你解决这些问题——Faronics Deep Freeze for mac。 Deep Freeze for mac是一…

头歌答案--数据持久化(非数据库)

目录 ​编辑 数据持久化&#xff08;非数据库&#xff09; 第1关&#xff1a;数据持久化&#xff08;非数据库&#xff09; 任务描述 多线程、多进程爬虫 第1关&#xff1a;多线程、多进程爬虫 任务描述 Scrapy爬虫基础 任务描述 MySQL数据库编程 第1关&#xff1a;…

全球数字市场竞争:跨境电商的战略优势

在数字化时代&#xff0c;跨境电商已经成为全球贸易的主要引擎。不同国家和地区的企业积极参与&#xff0c;试图在全球市场中寻求竞争优势。 每个国家都有其独特的数字市场战略&#xff0c;以满足国际消费者的需求并实现全球扩张。本文将深入探讨各国在跨境电商领域的竞争优势…

VS Code打造Rust的开发环境

文章目录 rust-analyzerCodeLLDB Rust据说是一门永远也不会发生内存错误的语言&#xff0c;并且因其反人类的学习曲线&#xff0c;而长期占据编程鄙视链的最顶端。而且就连微软都准备把Windows挪到Rust上面&#xff0c;可见其受欢迎程度。 rust-analyzer 在插件栏中直接搜索r…

toLocaleString()将数字格式化为带有千分位分隔符的字符串‘1,234,567‘

1、toLocaleString()&#xff1a;将数字格式化为带有千分位分隔符的字符串 2、使用 toLocaleString() 将数字转为百分比 var a 1; console.log(a.toLocaleString(zh,{style:percent})) var b 10; console.log(b.toLocaleString(zh,{style:percent})) var c 2; console.log(…

ChatGPT 如何改变科研之路

《Nature》全球博士后调查[1]中约有三分之一的受访者正在使用人工智能聊天机器人来帮助完善文本、生成或编辑代码、整理其领域的文献等等。 来自巴西的 Rafael Bretas 在日本生活了十多年&#xff0c;日语说得很好。书面日语的各个方面&#xff0c;例如严格的礼貌等级制度&…

HarmonyOS应用开发者高级认证(88分答案)

看好选择题&#xff0c;每个2分多答对2个刚好88分&#xff0c;祝你顺利。 其它帮扶选择题。 一、判断 只要使用端云一体化的云端资源就需要支付费用&#xff08;错&#xff09;所有使用Component修饰的自定义组件都支持onPageShow&#xff0c;onBackPress和onPageHide生命周期…

【数据结构 | 链表】leetcode 2. 两数相加

个人主页&#xff1a;兜里游客棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里游客棉花糖 原创 收录于专栏【LeetCode】 原题链接&#xff1a;点击直接跳转到该题目 目录 题目描述解题代码 题目描述 给你两个 非空 的链表&#xff0c;表示两个非…

Git 修改历史 commit message

一. 修改最新的 commit log 修改最近一次commit message&#xff0c; 直接使用命令 git commit --amend 就可以完成修改二. 修改历史 commit log 查看日志(按 q 退出) git log --oneline # 查看5步的log。 git log --oneline -5选择要修改的commit 信息 # 要修改的 commit log…

内衣洗衣机和手洗哪个干净?小型洗衣机全自动

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…

绿茵场上洒汗水,激情飞扬现活力——碧桂园社区足球课堂开课啦

“伙伴计划”是由共青团中央发起实施&#xff0c;中央专项彩票公益金提供支持&#xff0c;面向社区青少年开展的一项示范性服务项目。实施这个项目的主要目的是针对青少年在成长过程中遇到的实际困难和普遍性需求&#xff0c;开展“团团活力圈”青少年身心健康提升服务&#xf…