Q learning

news2024/10/6 0:37:54

Q learning

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 = env

    def reset(self):
        state, _ = self.env.reset()
        return state

    def 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 = -100

        return state, reward, over

    #打印游戏图像
    def show(self):
        from matplotlib import pyplot as plt
        plt.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 = 0

    state = env.reset()
    over = False
    while 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 += reward

        state = next_state

        if show:
            display.clear_output(wait=True)
            env.show()

    return data, reward_sum


play()[-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.9
            target = reward + Q[next_state].max() * 0.9

            #value和target应该是相等的,说明Q矩阵的评估准确
            #如果有误差,则应该以target为准更新Q表,修正它的偏差
            #这就是TD误差,指评估值之间的偏差,以实际成分高的评估为准进行修正
            update = (target - value) * 0.1

            #更新Q表
            Q[state, action] += update

        if epoch % 100 == 0:
            print(epoch, len(pool), play()[-1])


train()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 系统下文本编辑常用的命令

一、是什么 Vim是从 vi 发展出来的一个文本编辑器&#xff0c;代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 简单的来说&#xff0c; vi 是老式的字处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方 而…

苹果手机通话记录怎么恢复?这3个方法就足够!

通话记录是手机中的重要数据之一&#xff0c;它记录了用户与联系人的通话信息&#xff0c;包括通话时间、通话时长、通话号码等等。 有时候&#xff0c;我们可能不小心删除了通话记录&#xff0c;或者想找回之前的通话记录以此来回忆起一些事情。那么&#xff0c;苹果手机通话…

全自动内衣洗衣机什么牌子好?家用迷你洗衣机推荐

内衣洗衣机是一种专为内衣、丝绸和其他精细衣物设计的家电&#xff0c;它们能够温柔地清洁和保护这些特殊材质的衣物。代替了传统的手洗&#xff0c;能够大大节约我们不少的宝贵时间。但在市场上&#xff0c;有各种型号和功能的内衣洗衣机&#xff0c;如何挑选到一款适合自己的…

内衣洗衣机怎么选?小型洗衣机质量排名

现在大部分的家庭都拥有高质量、大品牌、大容量的洗烘套装来满足一家人的日常洗烘需要&#xff0c;像内衣这种贴身的衣物&#xff0c;需要手洗或者用专用的内衣洗衣机&#xff0c;这样才可以最大程度地减少细菌的交叉感染&#xff0c;提高我们贴身衣物的卫生&#xff0c;那么怎…

深入浅出理解Android开发框架中的MVC、MVP和MVVM模式

✍️作者简介&#xff1a;沫小北/码农小北&#xff08;专注于Android、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a;沫小北/码农小北 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN &#x1f514;如果文章对您有一定的帮助请&…

【React】Antd 组件基本使用

Antd 组件基本使用 第一步 安装并引入 antd 包 使用命令下载这个组件库 yarn add antd在我们需要使用的文件下引入&#xff0c;我这里是在 App.jsx 内引入 import { Button } from antd现在我们可以在 App 中使用 Button 组件 <div>App..<Button type"prima…

成都瀚网科技有限公司抖音带货的靠谱之选

随着电子商务的飞速发展&#xff0c;越来越多的商家开始利用网络平台进行产品销售。这其中&#xff0c;抖音作为一款广受欢迎的短视频平台&#xff0c;其带货能力不容小觑。然而&#xff0c;在选择抖音带货服务商时&#xff0c;很多商家会面临困惑&#xff1a;成都瀚网科技有限…

易基因:MeRIP-seq+ChIP-seq等揭示m6A甲基化在休眠期转录休眠调控中的潜在功能 | 发育研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 发育通常被认为是遗传程序的顺序展开&#xff0c;复杂程度不断提高&#xff0c;并按固定轨迹随时间进行。然而&#xff0c;调整发育时间可以提高在不利条件下的存活率。在哺乳动物中&…

Istio学习笔记-部署模型

参考&#xff1a;Istioldie 1.18 / 部署模型 当您将 Istio 用于生产环境部署时&#xff0c;需要确定一系列的问题。 网格将被限制在单个集群中还是分布在多个集群中&#xff1f; 是将所有服务都放置在单个完全连接的网络中&#xff0c;还是需要网关来跨多个网络连接服务&#…

开源会议通知H5页面邀请函制作源码系统+自动翻页 带完整的搭建教程

现如今&#xff0c;线上活动越来越频繁&#xff0c;而会议邀请函也成为了活动组织者不可或缺的工具。然而&#xff0c;传统的邮件、短信等方式发送邀请函已经无法满足现代人的需求。因此&#xff0c;开发一款现代化的、功能丰富的会议邀请函系统势在必行。下面源码小编将来给大…

检索搜索信息能力

&#xff08;一&#xff09;搜索工具的选择 谷歌 > 微信搜一搜 > 抖音等短视频 > 百度 &#xff08;二&#xff09;搜索方式 一&#xff0c;搜索内容的分类 信息类学习类工具类 二&#xff0c;谷歌浏览器的搜索技巧 1、“搜索内容” 限定完整出现的词 如下图搜…

酒店数据抓取

好的&#xff0c;以下是使用Haskell编写的一个简单的网页爬虫程序&#xff0c;用于抓取Booking.com和云地接酒店数据的示例。这个程序使用HTTP代理&#xff0c;代理信息为proxy_host: jshk.com.cn。 import Network.HTTP import Network.HTTP代理 import Network.URImain :: I…

二蛋赠书八期:《Java物联网、人工智能和区块链编程实战》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

【uniapp】确认弹出框,选择确定和取消

代码如下&#xff1a; <view style"display: flex; justify-content: space-around;"><button class"button" click"submit">t提交</button> </view>submit(){let thatthisuni.showModal({title: 提示&#xff1a;,con…

Shell脚本 CPU,内存,磁盘占用率检测

CPU&#xff1a;运算资源占用 内存&#xff1a;RAM类介质 磁盘&#xff1a;ROM类介质 一、CPU #!/bin/bash# 设置阈值&#xff0c;当CPU占用超过该阈值时进行输出提示 threshold80while true do# 使用top命令获取CPU占用信息&#xff0c;并使用grep和awk筛选和解析输出结果…

8、数据结构-字符串、编码集

编码表 中文编码表 ​ 数字到中文单一字符的映射&#xff0c;汉字只能使用多字节的2字节&#xff0c;总有65535种状态。常见的中文编码有GB2312 、GBK 、GB18030 、BIG 5。 ​ 所有编码表都兼容单字节的ASCII表。 UNICODE ​ 多字节&#xff0c;一张编码表解决全球多数字符…

02-学成在线内容管理模块基础环境搭建

内容管理模块 需求分析 需求分析就是要搞清楚问题域即用户的需求&#xff0c;从而确定软件要为用户解决什么问题&#xff0c;实现哪些业务功能&#xff0c;满足什么样的性能要求 首先确认用户需求: 产品人员根据用户需求会绘制界面原型&#xff0c;通过界面原型再和用户确认…

【QT系列教程】之一安装配置

文章目录 一、qt简介二、qt下载2.1、官网地址&#xff1a;https://www.qt.io/2.2、下载2.3、https://download.qt.io/official_releases/online_installers/ 三、qt安装3.1、登录账号&#xff0c;没有账号自己注册3.2、我是个人安装&#xff0c;如果是公司填写公司名字3.3、欢迎…

语聚AI助力微信客服系统与企业知识库的API连接,提升电商平台用户运营效果

建立连接&#xff1a;语聚AI与微信客服系统的API集成 在现代电商运营中&#xff0c;智能客服系统已经成为一种必备的工具。而在这方面&#xff0c;微信客服系统因其广泛的用户基础和便捷的操作方式&#xff0c;成为了业界广泛采用的工具。但是&#xff0c;为了更好地满足用户需…

SA实战 ·《SpringCloud Alibaba实战》第13章-服务网关:项目整合SpringCloud Gateway网关

大家好,我是冰河~~ 一不小心[SpringCloud Alibaba实战》专栏都更新到第13章了,再不上车就跟不上了,小伙伴们快跟上啊! 在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于…