当前位置: 首页 > article >正文

【强化学习】Q-learning算法详解:含MATLAB和Python实现代码

Q-learning算法详解

  • 1. Q-learning算法简介
    • Q-Learning算法的基本概念
    • Q-Learning算法的核心思想
    • Q-learning算法步骤
    • Q-Learning算法的特点
  • MATLAB 实现 Q-learning
  • Python 实现 Q-learning
  • 参考

强化学习属于机器学习,但与以前的监督学习和无监督学习的处理对象和任务都不同。监督学习和无监督学习处理的都是静态的数据,比如文本、图像等,主要是解决分类、回归及聚类等问题。

而强化学习要解决的是 动态的决策问题,是根据不断变化的环境,做出不同的决策,最后生成一个动作序列,以达到某种目的或者最优,处理的数据是动态的。
在这里插入图片描述

强化学习的目的,是让计算机学会自主的进行动态的决策。阿尔法围棋软件就是典型的强化学习成果,最近推出的ChartGPT的核心算法,也是基于神经网络组成的强化学习框架。

1. Q-learning算法简介

Q-learning是一种基于值迭代的强化学习算法,属于无模型(model-free)强化学习方法。它通过学习 状态-动作值函数(Q值) 来优化策略,使得智能体在给定环境中获得最大累计奖励。
在这里插入图片描述

Q-Learning算法的基本概念

在这里插入图片描述

  • 状态(State)‌:环境的某个特定情况或配置。
  • 动作(Action)‌:在给定状态下可以采取的可能行为。
  • 奖励(Reward)‌:采取某个动作后从环境中获得的即时回报。
  • 策略(Policy)‌:从状态到动作的映射,指导如何根据当前状态选择动作。
  • Q函数(Q-value)‌:表示在状态s下采取动作a的期望回报。

在强化学习中,奖励非常重要,因为样本没有标签,理论上是奖励在引领学习。一般需要人工设置,是强化学习中较为复杂的难点。

Q-Learning算法的核心思想

Q-Learning通过贝尔曼(Bellman)方程来更新Q值,其公式为:
在这里插入图片描述

Q-learning算法步骤

1、初始化 Q 表:将所有状态-动作对的 Q 值设为零或随机值

2、选择动作:使用 ε-greedy 策略选择动作:

  • 以概率 ϵ 进行随机探索
  • 以概率 1−ϵ 选择当前 Q 值最大的动作(贪心策略)

3、执行动作 & 观察奖励:执行动作 a,观察环境的新状态 s′ 和奖励 r

4、更新 Q 值:使用 Q-learning 公式更新 Q 表

5、重复:直到满足终止条件(如达到最大迭代次数或收敛)
在这里插入图片描述

Q-Learning算法的特点

  • 无需模型‌:Q-Learning不需要环境的动态模型,通过与环境的交互来学习。
  • ‌离线学习‌:可以在没有实时环境反馈的情况下,使用已经收集的数据来更新Q值。
  • ‌收敛性‌:在满足一定条件下,Q-Learning能够收敛到最优策略。

MATLAB 实现 Q-learning

下面是一个基于 MATLAB 的 Q-learning 示例,应用于一个 5x5 的网格世界(Grid World)。

clc; clear; close all;% 参数设置
alpha = 0.1;  % 学习率
gamma = 0.9;  % 折扣因子
epsilon = 0.1; % 探索概率
numEpisodes = 500; % 训练回合数
numStates = 25; % 5x5 网格
numActions = 4; % 上、下、左、右
Q = zeros(numStates, numActions); % 初始化 Q 表% 设定动作映射 (上=1, 下=2, 左=3, 右=4)
actionMap = [-5, 5, -1, 1];% 训练 Q-learning 代理
for episode = 1:numEpisodesstate = randi(numStates); % 随机初始化状态while state ~= 25  % 终止状态(假设25号格子是终点)if rand < epsilon  % 采取随机动作(探索)action = randi(numActions);else  % 采取贪心策略(利用)[~, action] = max(Q(state, :));end% 计算下一个状态nextState = state + actionMap(action);% 边界检查if nextState < 1 || nextState > numStates || ...(mod(state, 5) == 0 && action == 4) || ...(mod(state, 5) == 1 && action == 3)nextState = state;  % 保持不变end% 设定奖励函数if nextState == 25reward = 100;elsereward = -1;end% 更新 Q 值Q(state, action) = Q(state, action) + alpha * ...(reward + gamma * max(Q(nextState, :)) - Q(state, action));% 更新状态state = nextState;end
end% 显示最终 Q 值
disp('训练后的Q表:');
disp(Q);

Python 实现 Q-learning

Python 版本使用 numpy 和 gym 库,应用于 OpenAI Gym 的 FrozenLake 环境。

import numpy as np
import gym# 创建环境
env = gym.make("FrozenLake-v1", is_slippery=False)# 超参数
alpha = 0.1  # 学习率
gamma = 0.9  # 折扣因子
epsilon = 0.1  # 探索率
num_episodes = 500  # 训练回合数
num_states = env.observation_space.n
num_actions = env.action_space.n# 初始化 Q 表
Q = np.zeros((num_states, num_actions))# Q-learning 训练
for episode in range(num_episodes):state = env.reset()[0]  # 初始化状态done = Falsewhile not done:# 选择动作(ε-贪心策略)if np.random.uniform(0, 1) < epsilon:action = env.action_space.sample()  # 随机探索else:action = np.argmax(Q[state, :])  # 贪心策略# 执行动作next_state, reward, done, _, _ = env.step(action)# 更新 Q 值Q[state, action] = Q[state, action] + alpha * (reward + gamma * np.max(Q[next_state, :]) - Q[state, action])# 更新状态state = next_state# 显示最终 Q 表
print("训练后的 Q 表:")
print(Q)# 评估学习效果
state = env.reset()[0]
env.render()for _ in range(10):action = np.argmax(Q[state, :])  # 选择最佳动作state, _, done, _, _ = env.step(action)env.render()if done:break

参考

相关文章:

【强化学习】Q-learning算法详解:含MATLAB和Python实现代码

Q-learning算法详解 1. Q-learning算法简介Q-Learning算法的基本概念Q-Learning算法的核心思想Q-learning算法步骤Q-Learning算法的特点 MATLAB 实现 Q-learningPython 实现 Q-learning参考 强化学习属于机器学习&#xff0c;但与以前的监督学习和无监督学习的处理对象和任务都…...

Java 多数据源时事务回滚问题

目录 问题描述 1、Atomikos事务管理器 2、MyBatis-Plus多数据源支持 dynamic-datasource 特性 约定 使用方法 mybatis-mate 特性 使用方法 问题描述 在多数据源的情况下&#xff0c;如果一个事务跨越多个数据源&#xff0c;当其中一个数据源的操作失败时&#xff0c;我…...

怎麼防止爬蟲IP被網站封鎖?

隨著越來越多的網站加強其反爬蟲措施&#xff0c;爬蟲IP被封鎖成為了常見的問題。如何有效地避免IP被封&#xff0c;從而讓數據採集工作更加順利&#xff1f; 常見的反爬策略包括&#xff1a; 頻率限制&#xff1a;設置請求頻率&#xff0c;對於發出請求過於頻繁的IP進行封鎖…...

DeepSeek + Claude 提升效果

案例1&#xff1a;分布式锁 问题 spring boot 和 mybatis 实现分布式锁 Deepseek R1 思考过程 嗯&#xff0c;用户问的是如何在Spring Boot和MyBatis中实现分布式锁。首先&#xff0c;我得回忆一下分布式锁的基本概念。分布式锁是为了在分布式系统中协调多个服务实例对共享…...

使用html css js 开发一个 教育机构前端静态网站模板

这个教育机构网站模板是专为前端开发初学者设计的练习项目&#xff0c;适合正在学习前端的学生或自学者使用。网站内容包括首页、课程体系、师资力量、关于我们和联系我们等基础页面&#xff0c;帮助学习者熟悉网页布局、样式设计和交互功能的实现。 静态页面 简单截图 应用…...

ranges::set_intersection set_union set_difference set_symmetric_difference

std::ranges::set_intersection&#xff1a;是 C20 引入的一个算法&#xff0c;用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 std::ranges::set_intersection 用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 注意事项…...

在IDEA的Maven中(同步所有Maven项目)和(重新加载所有Maven项目)的区别

特性同步所有 Maven 项目 (Sync All Maven Projects)重新加载所有 Maven 项目 (Reload All Maven Projects)主要作用使 IDEA 项目结构、依赖关系与 pom.xml 文件同步。强制重新读取所有 pom.xml 文件&#xff0c;并重建 IDEA 的 Maven 项目模型。缓存使用 IDEA 缓存的 Maven 项…...

如何查询网站是否被百度蜘蛛收录?

一、使用site命令查询 这是最直接的方法。在百度搜索框中输入“site:你的网站域名”&#xff0c;例如“site.com”&#xff08;请将“example.com”替换为你实际的网站域名&#xff09;。如果搜索结果显示了你的网站页面&#xff0c;并且显示了收录的页面数量&#xff08;如“…...

el-table树状表格,默认展开第一个节点的每一层

效果如图 <template><el-table:data"tableData"style"width: 100%":tree-props"{ children: children, hasChildren: hasChildren }":expand-row-keys"expandRowKeys"row-key"id"expand-change"handleExpan…...

express-validator 数据校验详解

express-validator 是一个用于在 Express 应用中进行数据验证和清理的中间件。 一、安装 # 使用 npm 安装npm install express-validator 二、基本使用 1. 引入和初始化 const express require("express");const { body, validationResult } require("ex…...

使用VSCODE开发C语言程序

使用vscode配置C语言开发环境 一、安装VSCODE 1、下载vscode ​ 从官方网站&#xff08;https://code.visualstudio.com/Download&#xff09;上&#xff0c;下载windows版本的vscode 2、安装vscode ​ 下载完毕后&#xff0c;按照提示进行安装即可&#xff08;尽可能不要安…...

Python学习心得常用的内置函数

常用的内置函数&#xff1a; 1.数据类型转换函数&#xff1a; 描述说明 描述说明 bool(obj) 获取指定对象 obj 的布尔值 str(obj) 将指定对象 obj 转成字符串类型 int(x) 将 x 转成 int 类型 float(x) 将 x 转成 float 类型 list(sequence) 将序列转成列表类型 tu…...

【数据结构初阶第十二节】设计循环队列

云边有个稻草人-CSDN博客 必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。 还有最后一道关于队列的习题&#xff0c;这题有点难&#xff0c;准备好迎接挑战吧&#xff01; 目录 1.【题目】 2.实现循环队列推荐用数组&#xff0c;Why? 3.Q1&#xff1a;如…...

【数据分享】1929-2024年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站…...

【强化学习的数学原理】第10课-Actor-Critic方法-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、最简单的Actor-Critic&#xff08;QAC&#xff09;二、Advantage Actor-Critic&#xff08;A2C&#xff09;三、重要性采样和…...

scratch猜年龄互动小游戏 2024年12月scratch四级真题 中国电子学会 图形化编程 scratch四级真题和答案解析

scratch猜年龄互动小游戏 2024年12月电子学会图形化编程Scratch等级考试四级真题 一、题目要求 老爷爷的年龄是1-100的随机数,老爷爷询问“请猜猜我的年龄是多少?”,输入年龄,老爷爷会回答"大了"或者"小了,直到最后成功猜出年龄。 1、准备工作 (1)删…...

javaSE学习笔记23-线程(thread)-总结

创建线程的三种方式 练习代码 package com.kuang.thread;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;//回顾总结线程的创建 public class ThreadNew {public static void main(String[…...

Boringssl介绍

BoringSSL 是 Google 从 OpenSSL 分支出来的一个开源 TLS/SSL 库&#xff0c;旨在为 Google 的产品和服务提供一个更加轻量、安全和现代化的加密库。它是 OpenSSL 的一个替代品&#xff0c;专注于简化代码、提高安全性和减少潜在的攻击面。 以下是对 BoringSSL 的详细介绍&…...

java每日精进 2.13 MySql迁移人大金仓

1.迁移数据库 1. 数据库创建语句 MySQL&#xff1a; CREATE DATABASE dbname; 人大金仓&#xff08;Kingbase&#xff09;&#xff1a; 在人大金仓中&#xff0c;CREATE DATABASE 的语法通常相同&#xff0c;但可能需要特别注意字符集的指定&#xff08;如果涉及到多语言支持…...

2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB

一、改进型雪雁算法 雪雁算法&#xff08;Snow Geese Algorithm&#xff0c;SGA&#xff09;是2024年提出的一种新型元启发式算法&#xff0c;其灵感来源于雪雁的迁徙行为&#xff0c;特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…...

C++中为什么有了tuple还需要pair?

在C中&#xff0c;tuple和pair都是用于存储多个值的工具。tuple可以存储任意数量的元素&#xff0c;而pair只能存储两个元素。既然tuple的功能更强大&#xff0c;为什么C标准库仍然保留了pair呢&#xff1f;本文将从多个角度探讨这个问题。 1. 历史兼容性 pair在C标准库中比tu…...

Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)

感谢您点开这篇文章:D&#xff0c;鼠鼠我是一个代码小白&#xff0c;下文是学习开源项目Open WebUI过程中的一点笔记记录&#xff0c;希望能帮助到你&#xff5e; 本人菜鸟&#xff0c;持续成长&#xff0c;能力不足有疏漏的地方欢迎一起探讨指正&#xff0c;比心心&#xff5e…...

什么是Grok-3?技术特点,场景,潜在问题与挑战

Grok-3 的技术特点与优势 1. 超大算力与训练规模 算力投入:Grok-3 使用了 20 万块英伟达 H100 GPU,分两个阶段训练(第一阶段 10 万 GPU 训练 144 天,第二阶段 20 万 GPU 训练 92 天),总计算量是前代 Grok-2 的 10 倍。这种规模远超同期其他项目(如印度的 1.8 万 GPU 公…...

容器docker k8s相关的问题汇总及排错

1.明确问题 2.排查方向 2.1、 docker方面 docker logs -f 容器ID docker的网络配置问题。 2.2、 k8s方面 node组件问题 pod的问题&#xff08;方式kubectl describe po pod的名称 -n 命名空间 && kubectl logs -f pod的名称 -n 命名空间&#xff09; 调度的问题&#x…...

【Docker】百度网盘:基于VNC的Web访问及后台下载

本教程通过 Docker Compose 部署百度网盘的 VNC 版本&#xff0c;实现24小时不间断下载、双模式访问、数据持久化、自动重启和安全加密控制等核心功能。 目录结构规划 建议使用以下目录结构&#xff08;可根据实际情况调整&#xff09;&#xff1a; ~/baidunetdisk/├── d…...

JWT 令牌

目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言&#xff1a; 在现代Web应用和微服务架构中&#xff0c;用户身份验证和信息安全传输是核心问题。JSON Web Token&#xff08;J…...

鼎捷PLM深度集成DeepSeek,领跑智能研发新赛道

新年伊始&#xff0c;DeepSeek以其卓越的性能、高性价比和开源优势&#xff0c;掀起一股AI技术应用热潮&#xff0c;重塑各行各业的知识管理、知识应用模式。对制造业来说&#xff0c;首当其冲的就是研发管理变革&#xff0c;这也引发了企业的深度思考&#xff1a;在工业领域的…...

设计模式之适配模式是什么?以及在Spring AOP中的拦截器链的使用源码解析。

前言 本文涉及到适配模式的基本用法&#xff0c;以及在Spring AOP中如何使用&#xff0c;首先需要了解适配模式的工作原理&#xff0c;然后结合Spring AOP的具体实现来详细详细解析源码。 首先&#xff0c;适配模式&#xff0c;也就是Adapter Pattern&#xff0c;属于结构型设计…...

挖掘图片的秘密:如何用piexif提取和修改Exif数据

Exif&#xff08;Exchangeable Image File Format&#xff09;数据是一个广泛用于数字图像&#xff08;尤其是JPEG和TIFF格式&#xff09;中的元数据格式。它包含了关于图像的各种信息&#xff0c;包括拍摄设备的类型、拍摄时间、光圈、曝光时间、GPS定位信息等。Exif数据使得用…...

javaSE学习笔记22-线程(thread)-线程通信、线程池

线程通信 应用场景&#xff1a;生产者和消费者问题 假设仓库中只能存放一件产品&#xff0c;生产者将生产出来的产品放入仓库&#xff0c;消费者将仓库中产品取走消费 如果仓库中没有产品&#xff0c;则生产者将产品放入仓库&#xff0c;否则停止生产并等待&#xff0c…...