【强化学习】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参考 强化学习属于机器学习,但与以前的监督学习和无监督学习的处理对象和任务都…...
Java 多数据源时事务回滚问题
目录 问题描述 1、Atomikos事务管理器 2、MyBatis-Plus多数据源支持 dynamic-datasource 特性 约定 使用方法 mybatis-mate 特性 使用方法 问题描述 在多数据源的情况下,如果一个事务跨越多个数据源,当其中一个数据源的操作失败时,我…...
怎麼防止爬蟲IP被網站封鎖?
隨著越來越多的網站加強其反爬蟲措施,爬蟲IP被封鎖成為了常見的問題。如何有效地避免IP被封,從而讓數據採集工作更加順利? 常見的反爬策略包括: 頻率限制:設置請求頻率,對於發出請求過於頻繁的IP進行封鎖…...
DeepSeek + Claude 提升效果
案例1:分布式锁 问题 spring boot 和 mybatis 实现分布式锁 Deepseek R1 思考过程 嗯,用户问的是如何在Spring Boot和MyBatis中实现分布式锁。首先,我得回忆一下分布式锁的基本概念。分布式锁是为了在分布式系统中协调多个服务实例对共享…...
使用html css js 开发一个 教育机构前端静态网站模板
这个教育机构网站模板是专为前端开发初学者设计的练习项目,适合正在学习前端的学生或自学者使用。网站内容包括首页、课程体系、师资力量、关于我们和联系我们等基础页面,帮助学习者熟悉网页布局、样式设计和交互功能的实现。 静态页面 简单截图 应用…...
ranges::set_intersection set_union set_difference set_symmetric_difference
std::ranges::set_intersection:是 C20 引入的一个算法,用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 std::ranges::set_intersection 用于计算两个已排序范围的交集。它将两个范围的交集元素复制到输出范围中。 注意事项…...
在IDEA的Maven中(同步所有Maven项目)和(重新加载所有Maven项目)的区别
特性同步所有 Maven 项目 (Sync All Maven Projects)重新加载所有 Maven 项目 (Reload All Maven Projects)主要作用使 IDEA 项目结构、依赖关系与 pom.xml 文件同步。强制重新读取所有 pom.xml 文件,并重建 IDEA 的 Maven 项目模型。缓存使用 IDEA 缓存的 Maven 项…...
如何查询网站是否被百度蜘蛛收录?
一、使用site命令查询 这是最直接的方法。在百度搜索框中输入“site:你的网站域名”,例如“site.com”(请将“example.com”替换为你实际的网站域名)。如果搜索结果显示了你的网站页面,并且显示了收录的页面数量(如“…...
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 从官方网站(https://code.visualstudio.com/Download)上,下载windows版本的vscode 2、安装vscode 下载完毕后,按照提示进行安装即可(尽可能不要安…...
Python学习心得常用的内置函数
常用的内置函数: 1.数据类型转换函数: 描述说明 描述说明 bool(obj) 获取指定对象 obj 的布尔值 str(obj) 将指定对象 obj 转成字符串类型 int(x) 将 x 转成 int 类型 float(x) 将 x 转成 float 类型 list(sequence) 将序列转成列表类型 tu…...
【数据结构初阶第十二节】设计循环队列
云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 目录 1.【题目】 2.实现循环队列推荐用数组,Why? 3.Q1:如…...
【数据分享】1929-2024年全球站点的逐年降雪深度数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、能见度等指标,说到气象数据,最详细的气象数据是具体到气象监测站点的数据! 有关气象指标的监测站点数据,之前我们分享过1929-2024年全球气象站…...
【强化学习的数学原理】第10课-Actor-Critic方法-笔记
学习资料:bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接:强化学习的数学原理 西湖大学 赵世钰 文章目录 一、最简单的Actor-Critic(QAC)二、Advantage Actor-Critic(A2C)三、重要性采样和…...
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 库,旨在为 Google 的产品和服务提供一个更加轻量、安全和现代化的加密库。它是 OpenSSL 的一个替代品,专注于简化代码、提高安全性和减少潜在的攻击面。 以下是对 BoringSSL 的详细介绍&…...
java每日精进 2.13 MySql迁移人大金仓
1.迁移数据库 1. 数据库创建语句 MySQL: CREATE DATABASE dbname; 人大金仓(Kingbase): 在人大金仓中,CREATE DATABASE 的语法通常相同,但可能需要特别注意字符集的指定(如果涉及到多语言支持…...
2025最新智能优化算法:改进型雪雁算法(Improved Snow Geese Algorithm, ISGA)求解23个经典函数测试集,MATLAB
一、改进型雪雁算法 雪雁算法(Snow Geese Algorithm,SGA)是2024年提出的一种新型元启发式算法,其灵感来源于雪雁的迁徙行为,特别是它们在迁徙过程中形成的独特“人字形”和“直线”飞行模式。该算法通过模拟雪雁的飞行…...
C++中为什么有了tuple还需要pair?
在C中,tuple和pair都是用于存储多个值的工具。tuple可以存储任意数量的元素,而pair只能存储两个元素。既然tuple的功能更强大,为什么C标准库仍然保留了pair呢?本文将从多个角度探讨这个问题。 1. 历史兼容性 pair在C标准库中比tu…...
Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)
感谢您点开这篇文章:D,鼠鼠我是一个代码小白,下文是学习开源项目Open WebUI过程中的一点笔记记录,希望能帮助到你~ 本人菜鸟,持续成长,能力不足有疏漏的地方欢迎一起探讨指正,比心心~…...
什么是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的问题(方式kubectl describe po pod的名称 -n 命名空间 && kubectl logs -f pod的名称 -n 命名空间) 调度的问题&#x…...
【Docker】百度网盘:基于VNC的Web访问及后台下载
本教程通过 Docker Compose 部署百度网盘的 VNC 版本,实现24小时不间断下载、双模式访问、数据持久化、自动重启和安全加密控制等核心功能。 目录结构规划 建议使用以下目录结构(可根据实际情况调整): ~/baidunetdisk/├── d…...
JWT 令牌
目录 一、JWT 1、什么是JWT 2、JWT的组成 3、JJWT签发与验证token 1、创建token 2、解析token 3、设置过期时间 4、自定义claims 前言: 在现代Web应用和微服务架构中,用户身份验证和信息安全传输是核心问题。JSON Web Token(J…...
鼎捷PLM深度集成DeepSeek,领跑智能研发新赛道
新年伊始,DeepSeek以其卓越的性能、高性价比和开源优势,掀起一股AI技术应用热潮,重塑各行各业的知识管理、知识应用模式。对制造业来说,首当其冲的就是研发管理变革,这也引发了企业的深度思考:在工业领域的…...
设计模式之适配模式是什么?以及在Spring AOP中的拦截器链的使用源码解析。
前言 本文涉及到适配模式的基本用法,以及在Spring AOP中如何使用,首先需要了解适配模式的工作原理,然后结合Spring AOP的具体实现来详细详细解析源码。 首先,适配模式,也就是Adapter Pattern,属于结构型设计…...
挖掘图片的秘密:如何用piexif提取和修改Exif数据
Exif(Exchangeable Image File Format)数据是一个广泛用于数字图像(尤其是JPEG和TIFF格式)中的元数据格式。它包含了关于图像的各种信息,包括拍摄设备的类型、拍摄时间、光圈、曝光时间、GPS定位信息等。Exif数据使得用…...
javaSE学习笔记22-线程(thread)-线程通信、线程池
线程通信 应用场景:生产者和消费者问题 假设仓库中只能存放一件产品,生产者将生产出来的产品放入仓库,消费者将仓库中产品取走消费 如果仓库中没有产品,则生产者将产品放入仓库,否则停止生产并等待,…...
